12 Replies Latest reply on Dec 15, 2014 10:16 AM by Robert_U

    glReadPixels not working when reading from a FrameBuffer


      I have an Intel HD 4600 Notebook with the latest Drivers ( 29/9/2014) running on Windows 8.1 64bit. 


      I am writing an OpenGL application which needs to read pixels from a Framebuffer.  The Intel Driver reports an OpenGL error 1282 and fails to read.  I have tried different formats (GL_FLOAT and GL_UNSIGNED_BYTE etc), but all fail.  I believe the code is OK as the same code works fine on NVIDEA and AMD hardware.


      NOTE The glReadPixels works OK if I am reading from the GL_BACK buffer and only fails if I attempt to read from another buffer.


      Is this a Driver Bug or am I doing something wrong??  Any assistance to get this working appreciated.


      Some code below...


      Setup the Frame Buffer



         // 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


              glBindRenderBuffer(GL_RENDERBUFFER, fColorBuffer[I]);

              glRenderBufferStorage( GL_RENDERBUFFER, GL_RGBA32F,  SizeX, SizeY );

              glFramebufferRenderBuffer (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + I, GL_RENDERBUFFER, fColorBuffer[I] );

              fBuffer[I] :=  GL_COLOR_ATTACHMENT0 + I;




        // depth

            if fIncDepthBuffer then


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




            glDrawBuffers(fColBufSize, @fBuffer[0]);



        // Verify that the FBO is correct

            aStatus := glCheckFramebufferStatus(GL_FRAMEBUFFER);

            CheckForGLErrors('Float Buffer Set Size');



        // Restore the default framebuffer

            glReadBuffer(GL_NONE);    //for older hardware



            glBindRenderbuffer(GL_RENDERBUFFER, 0);

            glBindFramebuffer(GL_FRAMEBUFFER, 0);







      Read the Pixels from the FramBuffer.  The PixelID is a local array and X,Y is the mouse location.



            glBindFramebuffer(GL_READ_FRAMEBUFFER, fFBOHandle);


            glReadPixels(x, y, 1, 1, GL_RGBA,   GL_FLOAT, @PixelID[0]);