我正在尝试在我的游戏中实现阴影映射。您在下面看到的着色器会为游戏地图正确绘制阴影,但在地图上四处走动的所有模型都是完全黑色的。
这是一个屏幕截图:
我怀疑问题出在世界位置的计算上。gl_Vertex 不会以任何方式进行转换。因为地图是使用绝对世界坐标生成的,所以使用光照矩阵的变换会产生正确的相对位置,可用于执行阴影映射。
但是,我的 3D 模型都非常接近原点。因此,如果它们的坐标使用光照矩阵进行了简单的转换,它们很可能永远不会被点亮。
我想知道是否会出现这种情况,如果是这样,我该如何解决。
这是我的顶点着色器:
#version 120
uniform mat4x4 LightMatrixValue;
varying vec4 shadowMapPosition;
varying vec3 worldPos;
void main(void)
{
vec4 modelPos = gl_Vertex;
worldPos=modelPos.xyz/modelPos.w;
vec4 lightPos = LightMatrixValue*modelPos;
shadowMapPosition = 0.5 * (lightPos.xyzw +lightPos.wwww);
gl_Position = ftransform();
}
和片段着色器:可变vec4 shadowMapPosition;不同的 vec3 worldPos;
uniform sampler2D depthMap;
uniform vec4 LightPosition;
void main(void)
{
vec4 textureColour = gl_Color;
vec3 realShadowMapPosition = shadowMapPosition.xyz/shadowMapPosition.w;
float depthSm = texture2D(depthMap, realShadowMapPosition.xy).r;
if (depthSm < realShadowMapPosition.z-0.0001)
{
textureColour = vec4(0, 0, 0, 1);
}
gl_FragColor= textureColour;
}