【问题标题】:Get depth buffer from QGLPixelBuffer从 QGLPixelBuffer 获取深度缓冲区
【发布时间】:2009-02-05 16:53:49
【问题描述】:

我在 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");

有什么明显的问题吗?

【问题讨论】:

    标签: c++ qt opengl


    【解决方案1】:

    好吧,不能保证存储在 QImage 中的底层像素数据(并通过其 QImage::bits() 函数获得)与 OpenGL 的 glReadPixels() 函数写入的内容兼容。

    既然你用的是QGLPixelBuffer,那QGLPixelBuffer::toImage()有什么问题呢?

    【讨论】:

      【解决方案2】:

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

      1. 在读取图像之前,您是否使用深度位调用 glClear()?
      2. 您的 QGLFormat 是否启用了深度缓冲区?
      3. 能否直接dump readPixel 并验证它是否有正确的数据?
      4. QImage::bits() 是否确保按要求对齐的顺序内存存储?

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        猜测如下。

        您正在使用 QImage 创建索引位图,但是您没有分配颜色表。我的猜测是默认颜色表使您的图像显示为白色。在保存图片之前试试这个:

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

        【讨论】:

          猜你喜欢
          • 2020-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-13
          • 2013-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多