【问题标题】:read depth buffer of framebuffer object读取帧缓冲区对象的深度缓冲区
【发布时间】:2020-07-13 23:31:44
【问题描述】:

我正在尝试将 fbo 的深度缓冲区复制到向量。

我最初是使用渲染缓冲区和glReadPixels 开始的,但尽管glGetErrors() 没有突出显示任何问题,但这导致向量全为零。

然后我切换到纹理并将它们绘制到屏幕上。颜色纹理显示深度测试的证据,深度纹理显示深度缓冲区填充了预期值。

我浏览了帧缓冲区上的 OpenGL 页面,常见错误页面,并阅读了所有函数的文档,并阅读了与问题相关的查询的谷歌搜索结果的前 2 页,但这些没有解决问题并主要使用旧的 OpenGL 版本。

我玩过像素包缓冲区、打包、启用/禁用随机设置 + 绑定/取消绑定各种缓冲区。

代码大致如下:

std::vector<GLuint> someVector; //also tried unsigned int
someVector.resize( windowWidth * windowHeight ); //also tried .reserve

glBindFramebuffer( GL_FRAMEBUFFER, fbo );
glEnable( GL_DEPTH_TEST );

drawStuff(); //I know this works

//Ive also tried making the depth buffer a depth_stencil buffer and reading a GL_UNSIGNED_INT_24_8

//glReadPixels( 0, 0, windowWidth, windowHeight GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, &someVector[ 0 ] );
glBindTexture( GL_TEXTURE_2D, depthTexture );
glGetTexImage( GL_TEXTURE_2D, 0,
        GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, &someVector[ 0 ] );
glBindTexture( GL_TEXTURE_2D, 0 );


glBindeFrameBuffer( GL_FRAMEBUFFER, fbo );

wrapperForGlGetErrors(); //this indicates all is good

我在 ubuntu 18.04 上,使用 opengl 3.3 并使用最新的 nvidia 驱动程序。

lspci | grep -i --color 'vga\|3d\|2d' 的输出是

00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630 (rev 04)
01:00.0 3D controller: NVIDIA Corporation GP107M [GeForce GTX 1050 Mobile] (rev a1)

更新

在做:

unsigned int x;

    glReadPixels( 100, 100, 1, 1, GL_DEPTH_COMPONENT,
                  GL_UNSIGNED_INT, &x );
    std::cerr << x;

输出 4294967295,而不是 0。

【问题讨论】:

  • 我认为深度值是0.0到1.0之间的浮点数,可能数据格式和向量需要是float类型的。
  • 常见错误页面列表使用浮点值作为错误。另外,我已经尝试过了,但它不起作用请参阅:khronos.org/opengl/wiki/Common_Mistakes#Depth_Buffer_Precision
  • "输出 4294967295,而不是 0。"。 - 42949672950xffffffff。深度以标准化浮点格式存储,因此值 4294967295(无符号 32 位整数的最大值)表示 1.0。 1.0 是深度缓冲区的默认初始化值(glClear (GL_DEPTH_BUFFER_BIT) 将 1.0 写入帧缓冲区)
  • 请提供一个实际的reproducible 示例。那些 sn-ps 不足以重现问题。

标签: c++ opengl opengl-3 gpu depth-buffer


【解决方案1】:

[...] 输出 4294967295,而不是 0。[...]

这是预期的行为,42949672950xffffffff

深度以标准化浮点格式存储(请参阅Normalized Integer),因此值4294967295(无符号32 位整数的最大值)表示1.0。 1.0 是深度缓冲区的默认初始化值(请参阅glClearDepth)。注意,glClear (GL_DEPTH_BUFFER_BIT) 将 1.0 写入当前帧缓冲区的深度缓冲区。

【讨论】:

  • 我明白这一点 - 有什么理由要求阅读整个内容会得到 0,但只要求一个像素就会得到我所期望的(即 4294967295)?
  • @Edward fbo 的大小是多少?它是否等于窗口大小(windowWidthwindowHeight)?还是大小不一样?什么是widthheight
  • fbo 等于窗口大小。宽度 = 窗口宽度和高度 = 窗口高度。我已经编辑了我的问题以澄清这一点。
猜你喜欢
  • 1970-01-01
  • 2014-07-13
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多