【发布时间】: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。"。 -
4294967295是0xffffffff。深度以标准化浮点格式存储,因此值4294967295(无符号 32 位整数的最大值)表示 1.0。 1.0 是深度缓冲区的默认初始化值(glClear (GL_DEPTH_BUFFER_BIT)将 1.0 写入帧缓冲区) -
请提供一个实际的reproducible 示例。那些 sn-ps 不足以重现问题。
标签: c++ opengl opengl-3 gpu depth-buffer