three.js更改材质上的纹理

11

我正在three.js中为一个网格设置纹理,当它加载时,它看起来和我想要的一样:

        texture = THREE.ImageUtils.loadTexture("textures/hash.png");

        texture.needsUpdate = true;

        uniforms = {
            color: { type: "c", value: new THREE.Color( 0xffffff ) },
            texture: { type: "t", value: texture },
        },  

        vertexShader = "varying vec2 vUv; void main() {vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );}",

        fragmentShader = "uniform vec3 color; uniform sampler2D texture; varying vec2 vUv; void main() { vec4 tColor = texture2D( texture, vUv ); gl_FragColor = vec4( mix( color, tColor.rgb, tColor.a ), 1.0 );}",

        material = new THREE.ShaderMaterial({
            uniforms : uniforms,
            vertexShader    : vertexShader,
            fragmentShader  : fragmentShader
        });

但是我想稍后更改此网格上的纹理,我尝试过以下方法:

obj.mesh.material.uniforms.texture = THREE.ImageUtils.loadTexture("textures/1.png");
obj.mesh.material.uniforms.texture.needsUpdate = true;

但这不会改变在网格上显示的纹理,我如何在 THREE.ShaderMaterial 上更改纹理?


1
尝试像之前一样将其分配给obj.mesh.material.uniforms.texture.value。在纹理成功加载后,还可以考虑设置needsUpdate标志(订阅加载事件)。 - Matthias
你是对的,我需要将它分配给 texture.value,谢谢。 - Daniel Robinson
好的。我添加了一个答案,这样你就可以关闭这个问题了。 - Matthias
1个回答

12

将纹理分配给obj.mesh.material.uniforms.texture.value而不是其他地方。另外,在纹理成功加载后(通过订阅load事件),考虑设置needsUpdate标志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接