Reading data with glReadPixel () with multisampling

I am currently trying to read pixel data from a frame buffer in order to capture the screen in iOS. The GlreadPixels command works great when using the following code to configure the frame buffer: -

//buffers // Create a depth buffer that has the same size as the color buffer. glGenRenderbuffersOES(1, &m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT24_OES, width, height); // Create the framebuffer object. glGenFramebuffersOES(1, &framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); 

but when I use the depth buffer and colorbuffer for Multi-Sampling glreadpixels (), do not write any data in pixels, as with the earlier code .... for multisampling I use the following code: -

 glGenFramebuffersOES(1, &sampleFramebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, sampleFramebuffer); //GLuint sampleColorRenderbuffer; glGenRenderbuffersOES(1, &sampleColorRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, sampleColorRenderbuffer); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_RGBA8_OES, width, height); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, sampleColorRenderbuffer); //glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_RGBA8_OES, width, height); //glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, sampleColorRenderbuffer); GLuint sampleDepthRenderbuffer; glGenRenderbuffersOES(1, &sampleDepthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, sampleDepthRenderbuffer); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_DEPTH_COMPONENT24_OES, width, height); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, sampleDepthRenderbuffer); //glBindRenderbufferOES(GL_RENDERBUFFER_OES,sampleColorRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, sampleFramebuffer); 

I use the following code to read pixel data: -

 CGRect screenBounds = [[UIScreen mainScreen] bounds]; int backingWidth = screenBounds.size.width; int backingHeight =screenBounds.size.height; glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); NSInteger myDataLength = backingWidth * backingHeight * 4; buffer= (GLuint *) malloc(myDataLength); glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 

Any idea how to capture the correct pixel data using multiple sampling technology .... or am I doing something wrong? Please guide me in the right direction. Thanks

+4
source share
1 answer

When using multisampled FBOs, you cannot just read the sample buffer (since it does not contain simple pixels). First you need to enable buffer selections into one buffer.

You do this by creating another non-multisampled FBO (call it resultFramebuffer ) with the necessary renderbuffer repository that you want to read, and then call:

 glBindFramebuffer(GL_READ_FRAMEBUFFER, sampleFramebuffer); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resultFramebuffer); glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); 

And then you read from the results buffer (of course, the actual names of constants and functions may contain OES or APPLE). If you do not need the final depth values, the result buffer does not need a depth buffer.

EDIT: As you wrote in your comment and what I was looking for, there is a special function glResolveMultisampleFramebufferAPPLE that you should use instead of glBlitFramebuffer . The rest remain the same.

+5
source

All Articles