我有一个工作的阴影地图实现方向灯,其中我构造投影矩阵使用正交投影。我的问题是,我如何可视化影子地图?我有以下用于点灯的着色器(它使用透视投影),但当我试图将它应用于用正投影制作的阴影地图时,我得到的只是一个完全黑色的屏幕(即使阴影映射在渲染场景本身时也有效)。
#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);
}发布于 2014-01-23 20:58:15
当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的取样器对象,具体取决于着色器实际如何使用深度纹理。
https://stackoverflow.com/questions/21318471
复制相似问题