我在场景中添加了一个带有MeshPhongMaterial
的对象。我想监视Three正在设置物体的制服。我认为它会像obj.uniforms.uniformName
一样简单,但实际上并不存在。有没有一种简单的方法来获取运行时制服Three is setting?
我所追求的是统一的名字及其价值。
我提出的方法需要双循环。我唯一能看到的有用的运行材料是material.uniformsList
,它是WebGLUniformLocation
和值的列表,但没有名称。还有material.program.uniforms
,它是WebGLUniformLocation
s的名称的键值存储。看起来你可以将两者拼接在一起以获得统一的列表,但是有更好的方法吗?
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;
}
}
}
uniformsList
或program.uniforms
会改变吗?我是否需要在每个渲染循环中构建一次此对象,或者我可以构建它一次并重新使用它吗?