PDA

View Full Version : Fail to Read From FrameBuffer



johnh
11-10-2014, 09:12 PM
I am having problems reading using glReadPixels on Intel Hardware (see separate post) and thought I would give mapping a try.

I have attempted to map the Color buffer of my framebuffer but it always returns zeros (even if I clear with buffer with 1).

Can anyone spot my error in code below?? I do have a valid FrameBuffer and Color Buffers and the MapData structure is an Array of Array of vec4 as I have an RGBA color buffer. Is it my interpretation of the data pointer returned??

The code fails on Intel, NVIDEA and AMD hardware so I think not a Hardware issue.



Procedure ReadAtLocation (X,Y:Integer);

glBindFramebuffer(GL_READ_FRAMEBUFFER, fFBOHandle);


glReadBuffer(GL_COLOR_ATTACHMENT0);


glBindBuffer(GL_PIXEL_PACK_BUFFER, fColorBuffer[0]);
MapData:=glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
if MapData<>Nil then
Begin
PixelID[0]:=MapData[X][Y][0];
PixelID[1]:=MapData[X][Y][1];
PixelID[2]:=MapData[X][Y][2];
End;
glunMapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER,0);




glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);

Firadeoclus
11-11-2014, 03:27 AM
If a buffer object is bound as pixel pack buffer, it is used as the destination for glReadPixels, the pointer parameter becoming an offset into the buffer. This is useful when you want to do asynchronous pixel reads, i.e. not having the glReadPixels call block until the GPU has finished rendering.

Binding a pixel pack buffer does not magically transfer contents from the framebuffer to it, you have to explicitly call glReadPixels. Also, you can't bind anything other than a buffer object (your fColorBuffer[0] looks suspiciously like it could be a handle to the renderbuffer or texture you're using as the first FBO attachment).

johnh
11-11-2014, 11:54 AM
I think I now get it. See below for my code. I need another buffer to use as the PACK PIXEL target and then I can read pixels into it then extract from it using the glMap..





// Create the FBO
glGenFramebuffers(1, @fFBOHandle);
glBindFramebuffer(GL_FRAMEBUFFER, fFBOHandle);


// Create the texture object for the primitive information buffer
glGenRenderBuffers(fColBufSize, @fColorBuffer[0]);


for I := 0 to fColBufSize-1 do
Begin
glBindRenderBuffer(GL_RENDERBUFFER, fColorBuffer[I]);
glRenderBufferStorage( GL_RENDERBUFFER, GL_RGBA32F, SizeX, SizeY );
glFramebufferRenderBuffer (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + I, GL_RENDERBUFFER, fColorTexture[I] );
fBuffer[I] := GL_COLOR_ATTACHMENT0 + I;
end;


// depth
if fIncDepthBuffer then
Begin
glGenRenderBuffers(1, @fDepthBuff);
glBindRenderBuffer(GL_RENDERBUFFER, fDepthBuff);
glRenderBufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, SizeX, SizeY );
glFramebufferRenderBuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fDepthBuff);
end;


glDrawBuffers(fColBufSize, @fBuffer[0]);


// Verify that the FBO is correct
aStatus := glCheckFramebufferStatus(GL_FRAMEBUFFER);
CheckForGLErrors('Float Buffer Set Size');


// Restore the default framebuffer


glBindFramebuffer(GL_FRAMEBUFFER, 0);