简体   繁体   中英

Get depth buffer from QGLPixelBuffer

I'm using OpenGL in a QT application. At some point I'm rendering to a QGLPixelBuffer. I need to get the depth buffer of the image, what I'd normally accomplish with glReadPixels(..., GL_DEPTH_COMPONENT, ...); I tried making the QGLPixelBuffer current and then using glReadPixels() but all I get is a white image.

Here's my code

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

Anything obviously wrong with it?

Well, there is no guarantee that the underlying pixel data stored in QImage (and obtained via its QImage::bits() function) is compatible to what OpenGL's glReadPixels() function writes.

Since you are using QGLPixelBuffer, what is wrong with QGLPixelBuffer::toImage() ?

I have never used QImage directly, but I would try to answer or look into following areas:

  1. Are you calling glClear() with Depth bit before reading image?
  2. Does your QGLFormat has depth buffer enabled?
  3. Can you dump readPixel directly and verify whether it has correct data?
  4. Does QImage::bits() ensure sequential memory store with required alignment?

Hope this helps

Wild guess follows.

You're creating an indexed bitmap using QImage, however you're not assinging a color table. My guess is that the default color table is making your image appear white. Try this before saving your image:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM