【问题标题】:FBO Depth texture visualization issuesFBO 深度纹理可视化问题
【发布时间】:2013-10-14 11:01:37
【问题描述】:

我在我的 FBO 中从渲染缓冲区切换到深度纹理。但它似乎不包含任何深度数据。如果我将此纹理渲染到全屏四边形,一切都是黑色的。我很确定纹理和 FBO设置正常。FBO 已完成,如果我清除深度,让我们说灰色:

glClearDepth(0.5f);

然后我看到 blit pass 中的颜色,但看不到几何渲染的数据。

无论如何,这就是我创建纹理的方式:

                glBindTexture   ( GL_TEXTURE_2D, _id );
            glTexStorage2D(GL_TEXTURE_2D,1,intFmt,theWidth,theHeight);          
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
        glTexParameteri (GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);   


        glBindTexture(_target,0);

其中 intFmt 是 GL_DEPTH_COMPONENT24 或 GL_DEPTH_COMPONENT32(都试过了..)

这就是我将它附加到 FBO 的方式:

     glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
         glBindTexture(GL_TEXTURE_2D, _id);
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, target,_id, 0);

这是 blit pass 片段着色器:

#version 420 
layout(binding=0) uniform sampler2D COLOR_MAP_0;
smooth in vec2 uvsOut;
out vec4 OUTPUT;

void main(void) {

    ivec2 tsize = textureSize(COLOR_MAP_0, 0);
    vec2 screntc = gl_FragCoord.xy * (1.0 / vec2(tsize));
    OUTPUT =  vec4(texture(COLOR_MAP_0, screntc).rrr   ,1) ;

}

也许我应该在片段着色器中明确写入深度?

我尝试在 blit 片段着色器中线性化深度。它有效。现在我可以看到深度。但是没有它我看到白色和一些灰色阴影。在快照中:左侧部分是使用线性化绘制的,而右侧部分直接从深度纹理中采样。

【问题讨论】:

  • 您如何显示深度纹理以验证数据?您正在绘制的几何图形的远近剪裁平面和距离是多少?
  • Near is 0.1 , far 10000 .Distance to geometry is between 0 to 1000.For display depth I just bind depth texture,使用上面提到的frag shader绘制全屏四边形。
  • 我认为您提供的代码没有任何问题。所以错误的部分丢失了。你检查过 glGetError() 是 0 并且你确定你的几何/视图矩阵是正确的吗?
  • 我正在运行 GL 调试扩展,因此可以将所有错误直接输入控制台。一切正常。但请查看我的更新。
  • “线性化”是指标准化?

标签: opengl glsl


【解决方案1】:

看起来还不错,很正常。

您必须记住,DEPTH 不是 RGB 数据,也不是线性数据,实际格式取决于您请求的内容(在 OpenGL 上下文创建中)或您为 FBO 创建的缓冲区/纹理。 DEPTH 始终是单通道数据,但是片段着色器允许您随意访问 .rgb 将返回数据,但它会不正确。

DEPTH 数据,因为它是非线性的,您可以将其视为信息被压缩到更接近 1.0 的部分,因此大多数东西的值都是 0.9998 0.9997,如果您可以看到图像编辑器应用程序中的差异,但又一次毕竟这不是它应该如何显示的方式。

要显示深度,您需要对其进行线性化,以便“有意义”,因为您需要考虑近/远平面,在这种情况下 White == far , Dark ( Black ) == close。

【讨论】:

  • 好吧,我明白了,但是你如何解释在许多演示中,即使是这样:geeks3d.com/20091216/… 他们仍然能够呈现非线性深度缓冲区?
  • 嗯,你可以看到或看不到它,取决于你在这里看到的情况:db.tt/HKrg2TOx 如果你足够远,它看起来似乎不存在,尽管将亮度降低了相当多它变得可见。这是当您尝试显示非显示兼容数据时如何表现的示例。您通常使用 24 位无符号字符进行显示,深度缓冲区至少为 16 位浮点数,因此 OpenGL 会将其向下转换以便显示,这就是结果。长话短说,您可以创建这样的环境,看起来您可以显示原始深度缓冲区。
猜你喜欢
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多