【问题标题】:Three.js How update all materials?三.js如何更新所有素材?
【发布时间】:2020-03-01 23:08:09
【问题描述】:

我想修改雾的片段,但是我遇到了问题,材质没有应用更改。

我这么修改代码

THREE.ShaderChunk[ "fog_pars_fragment" ] = [
    '...'
].join("\n");

代码的修改发生在整个场景加载后的最后。

我试过了

scene.traverse(function(object){
        if(object.material){
            object.material.needsUpdate = true;
        }
})

但是什么都没有改变:(

【问题讨论】:

  • 修改ShaderChunk只会修改该块的文本代码。创建材质时,ShaderChunks 被组装并连接(未引用)到最终的着色器代码中。这就是事后更改代码没有效果的原因。与其修改现有材质,不如考虑创建自己的命名材质 (THREE.MyPhongMaterial = ...),它可以使用自定义雾块 (THREE.ShaderChunk[ "my_fog_fragment" ] = ...)。
  • 三个应该在某个点触发着色器重新编译。我不知道它在做什么。我认为needsUpdate 会起作用。 github.com/mrdoob/three.js/issues/11475
  • @TheJim01 我有不同的材质,包括骨架,所以我无法创建自己的着色器)我再次尝试添加光源,因为我知道库会重建程序。但是有些东西没有帮助,我会进一步尝试)
  • 我不明白你的担心。你并不局限于一个着色器来处理所有事情。您可以根据需要创建任意数量的着色器和材质。或许添加一个简化的用例(向我们展示您如何将材料应用到您的对象)可以帮助阐明您的立场。
  • 我用的是标准材质,一个例子dt-byte.ru/f9c96cb3.png雾用于所有材质,我只是想修改雾,但是雾只有三个参数(颜色,远,近)这些参数对我来说还不够,我也不能在雾中添加制服。我找到了一个办法,修改雾之后,你只需要清除场景并重新加载)

标签: three.js


【解决方案1】:
scene.traverse(object => {
    if(object.type === 'Mesh') object.material.needsUpdate = true;
});

在我的情况下完美运行

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 2017-11-09
    • 2012-09-10
    • 2019-08-07
    • 2016-06-21
    • 2014-08-06
    • 1970-01-01
    • 2017-12-18
    • 2013-02-13
    相关资源
    最近更新 更多