读取帧缓冲区对象的深度缓冲区

时间:2020-04-02 04:05:15

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

我正在尝试将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。

1 个答案:

答案 0 :(得分:0)

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

这是预期的行为,42949672950xffffffff

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