将正交阴影贴图渲染到屏幕?

时间:2014-01-23 20:19:07

标签: opengl shadow shadow-mapping

我有定向灯的工作阴影贴图实现,我使用正交投影构建投影矩阵。我的问题是,我如何可视化阴影贴图?我有以下用于聚光灯的着色器(使用透视投影)但是当我尝试将它应用于使用正交投影制作的阴影贴图时,我得到的是一个完全黑屏(即使阴影贴图有效)当渲染场景本身时)

#version 430

layout(std140) uniform;

uniform UnifDepth
{
    mat4 mWVPMatrix;
    vec2 mScreenSize;
    float mZNear;
    float mZFar;
} UnifDepthPass;

layout (binding = 5) uniform sampler2D unifDepthTexture;

out vec4 fragColor;

void main()
{
    vec2 texcoord = gl_FragCoord.xy / UnifDepthPass.mScreenSize;

    float depthValue = texture(unifDepthTexture, texcoord).x;
    depthValue = (2.0 * UnifDepthPass.mZNear) / (UnifDepthPass.mZFar + UnifDepthPass.mZNear - depthValue * (UnifDepthPass.mZFar - UnifDepthPass.mZNear));

    fragColor = vec4(depthValue, depthValue, depthValue, 1.0);
}

1 个答案:

答案 0 :(得分:1)

您试图在GL_TEXTURE_COMPARE_MODE设置为GL_COMPARE_R_TO_TEXTURE的情况下对深度纹理进行采样。这对于使用深度纹理实际执行阴影贴图非常有用,但它会尝试使用sampler2D未定义来对其进行采样。由于您需要存储在深度纹理中的实际深度值,而不是通过/未通过深度测试的结果,因此您需要先将GL_TEXTURE_COMPARE_MODE设置为GL_NONE

当您想要在可视化深度缓冲区和绘制阴影之间切换时,在每个纹理的基础上设置此状态非常不方便。我建议将GL_TEXTURE_COMPARE_MODE设置为GL_COMPARE_R_TO_TEXTURE(与sampler2DShadow兼容)的采样器对象用于执行阴影贴图的着色器和另一个使用GL_NONE的采样器对象(兼容)使用sampler2D)可视化深度缓冲区。这样你所要做的就是换掉绑定到纹理图像单元5的采样器对象,具体取决于着色器实际使用深度纹理的方式。