三个着色器 Material 被覆盖
THREEJS Shader Material overwritten
我有一个着色器 material 可以正常工作。
此着色器附加了纹理。
我想使用此着色器创建 2 个网格 material,每个网格具有不同的纹理。
问题是,如果我尝试在场景中渲染我的 2 个网格,第一个对象的 material 会以某种方式被覆盖并使用与第二个对象相同的 material。
var dataShader = VJS.shaders.data;
var uniforms = dataShader.parameters.uniforms;
// texture size (2048 for now)
uniforms.uTextureSize.value = stack._textureSize;
// array of 16 textures
uniforms.uTextureContainer.value = textures;
// texture dimensions
uniforms.uDataDimensions.value = new THREE.Vector3(stack._columns, stack._rows, stack._nbFrames);
// world to model
uniforms.uWorldToData.value = stack._lps2IJK; //new THREE.Matrix4();
var sliceMaterial = new THREE.ShaderMaterial({
// 'wireframe': true,
'side': THREE.DoubleSide,
'transparency': true,
'uniforms': uniforms,
'vertexShader': dataShader.parameters.vertexShader,
'fragmentShader': dataShader.parameters.fragmentShader,
});
var slice = new THREE.Mesh(sliceGeometry, sliceMaterial);
// this is an Object3D that is added to the scene
this.add(slice);
有意义吗?这是预期的行为吗?如果是这样,有什么好的方法可以绕过这个问题吗?
谢谢
您需要使用相同的着色器创建 material 的两个实例,并为每个实例分配适当的 texture/uniforms。
编辑
复制制服有点棘手。当您克隆 material 时,我认为您会丢失参考,因此您可能需要小心管理它们。
我有一个着色器 material 可以正常工作。 此着色器附加了纹理。
我想使用此着色器创建 2 个网格 material,每个网格具有不同的纹理。
问题是,如果我尝试在场景中渲染我的 2 个网格,第一个对象的 material 会以某种方式被覆盖并使用与第二个对象相同的 material。
var dataShader = VJS.shaders.data;
var uniforms = dataShader.parameters.uniforms;
// texture size (2048 for now)
uniforms.uTextureSize.value = stack._textureSize;
// array of 16 textures
uniforms.uTextureContainer.value = textures;
// texture dimensions
uniforms.uDataDimensions.value = new THREE.Vector3(stack._columns, stack._rows, stack._nbFrames);
// world to model
uniforms.uWorldToData.value = stack._lps2IJK; //new THREE.Matrix4();
var sliceMaterial = new THREE.ShaderMaterial({
// 'wireframe': true,
'side': THREE.DoubleSide,
'transparency': true,
'uniforms': uniforms,
'vertexShader': dataShader.parameters.vertexShader,
'fragmentShader': dataShader.parameters.fragmentShader,
});
var slice = new THREE.Mesh(sliceGeometry, sliceMaterial);
// this is an Object3D that is added to the scene
this.add(slice);
有意义吗?这是预期的行为吗?如果是这样,有什么好的方法可以绕过这个问题吗?
谢谢
您需要使用相同的着色器创建 material 的两个实例,并为每个实例分配适当的 texture/uniforms。
编辑
复制制服有点棘手。当您克隆 material 时,我认为您会丢失参考,因此您可能需要小心管理它们。