【问题标题】:Rendering orthographic shadowmap to screen?将正交阴影贴图渲染到屏幕?
【发布时间】:2014-01-23 20:19:07
【问题描述】:

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

#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);
}

【问题讨论】:

  • 您可能忘记禁用GL_TEXTURE_COMPARE_MODE,这意味着使用sampler2D 对深度纹理进行采样是未定义的(并且可能会产生所有黑色纹素)。如果您使用采样器对象,您可以使用一个不同的采样器对象,为实际的阴影处理启用比较,当您想要可视化深度缓冲区时,可以使用一个禁用比较的采样器对象。否则,此状态是每个纹理对象。
  • 是的,成功了,添加它作为答案

标签: opengl shadow shadow-mapping


【解决方案1】:

您尝试将GL_TEXTURE_COMPARE_MODE 设置为GL_COMPARE_R_TO_TEXTURE 对深度纹理进行采样。这对于实际使用深度纹理执行阴影映射非常有用,但它会尝试使用 sampler2D undefined 对其进行采样。由于您希望将实际深度值存储在深度纹理中,而不是通过/失败深度测试的结果,因此您需要先将GL_TEXTURE_COMPARE_MODE 设置为GL_NONE。

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

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2013-07-06
    • 2015-06-02
    相关资源
    最近更新 更多