我需要一个Three.js材料,让我可以将一个纹理交叉淡入另一个纹理,同时接收聚光源的阴影。
const plane = new THREE.Mesh(
new THREE.PlaneGeometry(200, 200, 1, 1),
new TextureFadeMaterial({
t: 0.5,
map: texture1,
mapDest: texture2,
})
);
plane.receiveShadow = true;
所以我继续前进并扩展了' THREE.MeshStandardMaterial,并添加了制服mapDest
(第二个纹理)和t
(数字0..1)。我修改了map_fragment
块以将map
和mapDest
混合在一起,具体取决于t的值。
问题在于,只要我渲染纹理,阴影就消失了。事实上,只要我放置vec4 texelColor = texture2D( map, vUv );
而没有其他任何东西代替map_fragment
块(出现在负责阴影的代码之前),阴影就消失了(超级奇怪,因为texelColor
永远不会用于本测试案例)。
我想知道为什么会这样。
我通过将修改后的map_fragment
块移动到片段着色器的末尾(在执行灯光/阴影代码之后)来实现它。
这是最终的TextureFadeMaterial代码:
https://gist.github.com/claus/854963f2cd42ab21acf9cdba4fef49f3 (见第156ff和187ff行)
如果您有兴趣,请参阅解包的MeshStandardMaterial片段着色器代码:
https://gist.github.com/claus/d348483b9fcbd2110fda1c44fe31cf80