在对shadowMap进行采样时,我做错了什么?

时间:2015-04-18 11:49:14

标签: opengl glsl

我正在使用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。我没有通过对象的模型矩阵发送,只是灯光视图和投影。经验教训。

1 个答案:

答案 0 :(得分:1)

你尝试过sampler2DShadow吗?用法非常简单:

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)。