2014-01-23 37 views
0

我有一个工作阴影贴图实现方向灯,其中我使用正投影构建投影矩阵。我的问题是,我如何可视化阴影贴图?我使用了以下着色器(我使用透视投影),但是当我尝试将其应用于使用正投影制作的阴影贴图时,我所得到的是完全黑屏(即使阴影贴图工作正常renderering场景本身)呈现阴影贴图到屏幕?

#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

您可能忘记禁用'GL_TEXTURE_COMPARE_MODE',这意味着使用'sampler2D'对深度纹理进行采样未定义(并且可能会产生全部黑色纹理)。如果您使用采样器对象,则可以为实际阴影处理使用启用比较的不同采样器对象,并且在想要可视化深度缓冲区时禁用比较。否则,此状态是每个纹理对象。 –

+0

是的,它的工作原理,添加它作为一个答案 – KaiserJohaan

回答

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,取决于着色器实际使用深度纹理的方式。