从QGLPixelBuffer获取深度缓冲区

时间:2009-02-05 16:53:49

标签: c++ qt opengl

我在QT应用程序中使用OpenGL。在某些时候,我正在渲染到QGLPixelBuffer。我需要获取图像的深度缓冲区,这是我通常用glReadPixels(...,GL_DEPTH_COMPONENT,...)完成的;我尝试将QGLPixelBuffer设置为当前然后使用glReadPixels(),但我得到的只是一张白色图像。

这是我的代码

bufferCanvas->makeCurrent();
[ ...render... ]
QImage snapshot(QSize(_lastWidth, _lastHeight), QImage::Format_Indexed8);
glReadPixels(0, 0, _lastWidth, _lastHeight, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, snapshot.bits());
snapshot.save("depth.bmp");

它有什么明显的错误吗?

3 个答案:

答案 0 :(得分:1)

嗯,无法保证存储在QImage中的基础像素数据(通过其QImage :: bits()函数获得)与OpenGL的glReadPixels()函数写入的内容兼容。

由于您使用的是QGLPixelBuffer,QGLPixelBuffer::toImage()出了什么问题?

答案 1 :(得分:0)

我从未直接使用过QImage,但我会尝试回答或研究以下几个方面:

  1. 您在阅读图片前是否使用深度位调用glClear()?
  2. 您的QGLFormat是否启用了深度缓冲?
  3. 您可以直接转储readPixel并验证它是否有正确的数据吗?
  4. QImage :: bits()是否确保顺序存储器存储所需的对齐?
  5. 希望这有帮助

答案 2 :(得分:0)

狂野猜测如下。

您正在使用QImage创建索引位图,但是您没有使用颜色表。我的猜测是默认颜色表使您的图像显示为白色。保存图片前请尝试此操作:

for ( int i = 0 ; i <= 255 ; i++ ) {
    snapshot.setColor( i, qRGB( i, i, i ) );
}