我有定向灯的工作阴影贴图实现,我使用正交投影构建投影矩阵。我的问题是,我如何可视化阴影贴图?我有以下用于聚光灯的着色器(使用透视投影)但是当我尝试将它应用于使用正交投影制作的阴影贴图时,我得到的是一个完全黑屏(即使阴影贴图有效)当渲染场景本身时)
#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);
}
答案 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的采样器对象,具体取决于着色器实际使用深度纹理的方式。