首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将正射阴影图绘制到屏幕上?

将正射阴影图绘制到屏幕上?
EN

Stack Overflow用户
提问于 2014-01-23 20:19:07
回答 1查看 610关注 0票数 0

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

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的取样器对象,具体取决于着色器实际如何使用深度纹理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21318471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档