【发布时间】:2013-06-05 05:19:23
【问题描述】:
我正在尝试在我的游戏中实现阴影映射。您在下面看到的着色器会为游戏地图正确绘制阴影,但在地图上四处走动的所有模型都是全黑的。
截图如下:
我怀疑问题出在世界位置的计算上。 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;
}
【问题讨论】:
-
首先,截图没有说明什么——第二——为什么这么复杂?只需在第一遍中从光线的角度渲染场景 - 由于深度测试,阴影中的表面位置将被更接近光线的位置覆盖!在第二遍中,从眼睛的角度渲染场景,同时将顶点转换为光照 pov,以执行阴影贴图检查!
-
@dinony 在我看来好像就是这样做的。有
LightMatrixValue*modelPos用于在光线pov 中进行转换。以及相应的查找。但是如果不知道阴影贴图是如何创建的,就很难猜出哪里出了问题。0.5 * (lightPos.xyzw +lightPos.wwww)可能是问题所在。还有纹理查找中的realShadowMapPosition.xy。 -
@dinony:正如 t.niese 指出的那样,我确实已经这样做了。据我所知,问题在于计算阴影距离本身。地图上投射了正确的阴影,因为像素已被其前面的单位遮挡。这些单位不会,因为它们没有以某种方式进行变换,以提供它们相对于灯光位置的位置。
-
@t.niese:我使用额外的渲染通道创建阴影贴图,该通道仅存储从灯光的角度来看的像素深度。如果你愿意,我可以添加代码。
-
阴影贴图的创建方式(着色代码)始终很重要,因为这会影响到固定的
z值。你为什么要这样做0.5 * (lightPos.xyzw +lightPos.wwww)(你对此有什么期望)lightPos 这是从光源位置的原点到顶点的vector(假设LightMatrixValue与 Shadow shader) 中使用的矩阵相同。因此,通过这种计算(取决于w),您可以将点移向光源或其他方向。