我正在使用RenderDoc验证我的shadowMap是否正确创建,并且从灯光的角度来看它具有正确的像素。
这只是深度。我可以看到阴影的深度为0,其余的深度为1。
我将Lights MVP Matrix传递给我的着色器以及ShadowMap:
我的顶点着色器: #version 400
layout (location = 0) in vec4 in_position;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
uniform mat4 lightMVP;
out vec4 ex_positionLightSpace;
void main()
{
gl_Position = projection * view * model * in_position;
ex_positionLightSpace = lightMVP * in_position;
}
这是我的碎片着色器:
#version 400
layout (location = 0) out vec4 color;
in vec4 ex_positionLightSpace;
uniform sampler2D shadowMap;
float CalcShadowFactor(sampler2D shadowMapp, vec4 lightSpacePos)
{
vec3 projectedCoords = lightSpacePos.xyz / lightSpacePos.w;
vec2 coords;
coords.x = 0.5 * projectedCoords.x + 0.5;
coords.y = 0.5 * projectedCoords.y + 0.5;
float z = 0.5 * projectedCoords.z + 0.5;
float depth = texture(shadowMapp,coords).x;
if(depth < z + 0.00001)
return 0.2;
return 1.0;
}
void main(void)
{
float shadowFactor = CalcShadowFactor(shadowMap,ex_positionLightSpace);
color = vec4(shadowFactor,shadowFactor,shadowFactor,1.0);
}
我已经简化了我的着色器,所以我想要看到的只是一个非常暗的像素或一个非常明亮的像素。但我得到的只是非常暗淡的像素。
我已经检查过它与用于生成阴影贴图的Light MVP完全相同。
编辑:问题结果是错误的LightMVP。我没有通过对象的模型矩阵发送,只是灯光视图和投影。经验教训。
答案 0 :(得分:1)
uniform sampler2DShadow depthTexture; //does the depth comparison for you
//other uniforms
vec4 coord = shadowCoord / shadowCoord.w; //perspective division or use function textureProj() which does perspective division for you
float shadow = texture(depthTexture, vec3(coord.xyz));
//some other code, lighting etc.
或者您仅限于使用sampler2D吗?
编辑:您需要设置GL_TEXTURE_COMPARE_FUNC参数和纹理类型必须为GL_DEPTH_COMPONENT16(24/32)。