我正在尝试实现阴影贴图技术,但我遇到了一些问题,以使其有效。
我在灯光的位置有一个相机,这是我得到的阴影贴图。所有顶点都乘以modelViewProjectionMatrix
。
我还有一个带有顶点世界位置的纹理。它是GL_RGBA32F
纹理,因为所有点都乘以每个ModelMatrix
以获得世界空间中的点。
着色器:
layout(binding=5) uniform sampler2D shadowMap;
layout(binding=6) uniform sampler2D positionMap;
in vec2 texcoord;
uniform mat uViewProjectionMatrix;
out vec4 color;
void main() {
vec4 pos = texture(positionMap, texcoord);
vec4 ShadowCoord = uViewProjectionMatrix * pos;
ShadowCoord.xy = ShadowCoord.xy * vec2(0.5,0.5) + vec2(0.5,0.5);
float a = texture(shadowMap, ShadowCoord.xy).z;
color = vec4(a, a, a, 1.0);
}
输出(相机几乎处于灯光的相同位置):
我只是想看看每个顶点的投影是否正好离相机的位置,但看起来并非如此。 所有这一切的要点是比较:
if ( texture(shadowMap, ShadowCoord.xy).z < ( ShadowCoord.z-bias ) )
但它也不起作用。
我将不胜感激任何帮助。 谢谢。
答案 0 :(得分:4)
这里的一般想法是将ShadowCoord.xyz
纳入范围[ 0 , 1 ](用于纹理查找和深度比较)。您的代码在假设uViewProjectionMatrix * pos
(剪辑空间坐标)在[ -1 , 1 ]范围内的情况下运行但除非您确实无法保证除以w
(NDC坐标)。
void main() {
vec4 pos = texture(positionMap, texcoord);
vec4 ShadowCoord = uViewProjectionMatrix * pos;
ShadowCoord /= ShadowCoord.w;
ShadowCoord.xyz = ShadowCoord.xyz * vec3 (0.5f, 0.5f, 0.5f) + vec2 (0.5f, 0.5f, 0.5f);
float a = texture(shadowMap, ShadowCoord.xy).z;
color = vec4(a, a, a, 1.0);
}
在此之后,ShadowCoord.xy
将是一个在阴影贴图中查找的纹理坐标,ShadowCoord.z
将是从灯光的角度来看当前片段的深度。您可以使用ShadowCoord.z
进行比较,而不是采样深度。
事实上,您甚至可以考虑使用sampler2DShadow
来更有效地执行此操作。有关示例,请参阅this related question and answer