我不确定这是否可能,但我认为值得一问:是否有允许精灵投射和接收阴影的功能、选项或某种着色器?还包括精灵的alpha通道不会渲染为阴影。
我的所有资产都是透明的PNG,我使用three.js中的精灵将纹理映射到精灵上。除了阴影问题外,这项工作效果很好。理想情况下,从sprite投射的阴影不包括PNG的alpha通道*,这样光线就可以穿过PNG的alpha信道,这将是一件很棒的事情,尽管我在threejs的文档中发现很少对此进行研究。
也许这在threejs下是不可能的,或者根本不可能,这是可以理解的,但要提前感谢。
*我正在考虑一种类似于说唱歌手PaRappa或Adventure Xpress的风格。
three.js中的精灵不会投射阴影。
解决方法是使用PlaneBufferGeometry
并使其像这样面向相机:
scene.add( plane );
然后在渲染循环中,
plane.lookAt( camera.position );
如果希望平面不在平面纹理透明的地方投射阴影,则需要创建自定义深度材质。这样做的一个例子可以在这个three.js的例子中看到。
如果不创建自定义深度材质,平面将从灯光的角度显示为实心。
three.js r.76
这些是我最终使用的着色器。
片段着色器。您可以更改像素.a,它是像素的alpha值。如果alpha值低于0.5(从而使其看起来透明),则会丢弃该像素上的片段着色器。
#include <packing>
uniform sampler2D texture;
varying vec2 vUV;
void main() {
vec4 pixel = texture2D( texture, vUV );
if ( pixel.a < 0.5 ) discard;
gl_FragData[ 0 ] = packDepthToRGBA( gl_FragCoord.z );
}
顶点着色器。这没什么特别的,我想我会把它留在这里,以防你的顶点着色器引起问题,我可以确认这个着色器与上面的片段着色器兼容。
varying vec2 vUV;
void main() {
vUV = uv;
vec4 mvPosition = modelViewMatrix * vec4( position, 1 );
gl_Position = projectionMatrix * mvPosition;
}