为什么扩展的THREE.MeshStandardMaterial在使用地图时无法显示阴影?

时间:2016-09-01 17:50:32

标签: javascript three.js glsl

我需要一个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块以将mapmapDest混合在一起,具体取决于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

0 个答案:

没有答案