【问题标题】:ThreeJS get uniform values for running materialThreeJS 获得运行材料的统一值
【发布时间】:2015-08-28 04:23:26
【问题描述】:

我在我的场景中添加了一个带有MeshPhongMaterial 的对象。我想窥探三号在物体上设置的制服。我以为它会像obj.uniforms.uniformName 一样简单,但实际上并不存在。有没有简单的方法来获取运行时制服Three is setting

我追求的是统一的名称和它们的值。

我想出的方法需要一个双循环。我可以在运行材料上看到的唯一有用的是material.uniformsList,它是WebGLUniformLocations 和值的列表,但没有名称。还有material.program.uniforms,它是WebGLUniformLocations 名称的键值存储。似乎可以将两者压缩在一起以获得统一列表,但有更好的方法吗?

let builtUniforms = {};

// For every uniform in the array, look for its location in the program
// uniforms to get the name
for( x = 0; uniform = object.material.uniformsList[ x++ ]; ) {

    // uniform is [ { type, value }, WebGLUniformLocation ] but no name :(

    for( uniformName in object.material.program.uniforms ) {

        // If the WebGLUniformLocations match up, we've found the name
        if( object.material.program.uniforms[ uniformName ] === uniform[ 1 ] ) {

            builtUniforms[ uniformName ] = {
                value: uniform[ 0 ].value,
                name: uniformName
            };
            break;

        }
    }
}
  1. 有没有更直接的方法从 Three.Material 中获取统一的名称和值?
  2. uniformsListprogram.uniforms 会改变吗?我是否需要在每个渲染循环中构建一次此对象,或者我可以构建一次并重新使用它?

【问题讨论】:

    标签: three.js webgl shader


    【解决方案1】:

    material.__webglShader.uniformsmaterial.__webglShader.uniforms中你要找的键值存储三个存储

    也看THREE.UniformsLib

    还有THREE.ShaderLib - 例如THREE.ShaderLib.phong

    这些包含内置制服的模板以及使用它们的着色器,如MeshPhongMaterial

    【讨论】:

    • 每次将着色器传输到 WebGL 时,std 都是动态构建的。如果您想要详细控制,请使用ShaderMaterial 甚至RawShaderMaterial - 一个偶尔有用的技巧,找出 THREE.js 添加的属性,是在着色器中引入错误。当 WebGL barfs 时,停止应用程序并查看 Chrome 控制台中的错误消息,其中将包含 WebGL 接收到的整个着色器(您的代码加上三个添加的内容)。
    • 这就是我在我的问题中所做的,但正如你所看到的,三给你的值是有限的。它也确实没有有从三个传入的常规制服,它只有 webgl 表示 stackoverflow.com/questions/32257893/…
    • 正如我所提到的,它会即时建立和管理一个私人列表material.__webglShader.uniforms——如果你不想让 THREE 践踏你的价值观,你最好使用 RawShader 和自己做。
    • 这就是这个问题的答案。我正在尝试监视三个灯光着色器以将灯光制服复制到其他 rawshadermaterials。在运行着色器上神奇地设置了三组像 pointLightPosition 这样的东西,并且没有办法访问它们。如果我无法将正确的值传递给 rawshadermaterial,那么数据对我没有帮助
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2018-10-09
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多