我正在尝试将fbo的深度缓冲区复制到向量中。
我最初从使用渲染缓冲区和glReadPixels
开始,但是尽管glGetErrors()
没有突出显示任何问题,但是这导致向量全为零。
然后我切换到纹理并将其绘制到屏幕上。颜色纹理显示深度测试的证据,深度纹理显示深度缓冲区中填充了期望值。
我已经浏览了帧缓冲区的OpenGL页面(常见错误页面),并阅读了所有功能的文档,并阅读了与该问题相关的查询的google搜索结果的前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)
[...]输出4294967295,而不是0。[...]
这是预期的行为,4294967295
是0xffffffff
。
深度以规范化的浮点格式存储(请参见Normalized Integer),因此值4294967295
(无符号32位整数的最大值)表示1.0。 1.0是深度缓冲区的默认初始化值(请参见glClearDepth
)。注意,glClear (GL_DEPTH_BUFFER_BIT)
将1.0写入当前帧缓冲区的深度缓冲区。