过去可以将阴影计算合并到自定义着色器中,如here所述并总结here。
使用r75,照明和阴影系统似乎已合并,改变了这一点。我试图通过源代码来理解,但抽象/模块有点难以理解。
我已经将我的着色器提炼到目前为止的效果:
顶点:
#chunk(shadowmap_pars_vertex);
void main() {
vec4 worldPosition = modelMatrix * vec4(position, 1.0);
vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
gl_Position = projectionMatrix * mvPosition;
#chunk(shadowmap_vertex);
}
片段
#chunk(common);
#chunk(lights_pars);
#chunk(shadowmap_pars_fragment);
void main() {
//#if ( NUM_DIR_LIGHTS > 0 )
IncidentLight directLight;
DirectionalLight directionalLight;
float shadowValue = 1.0;
for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
directionalLight = directionalLights[ i ];
shadowValue = getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] );
}
//#endif
gl_FragColor = vec4(vec3(shadowValue), 1.0);
}
我从lights_template chunk拉出定向光环。不幸的是,shadowValue
似乎总是返回1.0,但它确实有效,并且着色器会正确呈现。
我的JS有适当的castShadow
和receiveShadow
设置。使用Phong的其他网格正确渲染阴影。
非常感谢。
修改
将material.lights = true;
添加到ShaderMaterial
会显示某些内容,但片段着色器中shadowValue
的值明显不正确,因为球体背面远离光。附上截图。