OpenTK read depth buffer to array

Viewed 86

I am trying to read the depth buffer and store it into an array using openTK in C#.

This is my code so far:

    //Get depth buffer
    int[] depthBufferID = new int[1];
    GL.GenBuffers(1, depthBufferID);
    GL.BindBuffer(BufferTarget.PixelPackBuffer, depthBufferID[0]);
    GL.BufferData(BufferTarget.PixelPackBuffer, glControlGLRender.Width * 
        glControlGLRender.Height * sizeof(Single), IntPtr.Zero, BufferUsageHint.StreamRead);
    IntPtr depthBufferPTR = GL.MapBuffer(BufferTarget.PixelPackBuffer, 
        BufferAccess.ReadOnly);
    GL.ReadPixels(0, 0, glControlGLRender.Width, glControlGLRender.Height, 
        PixelFormat.DepthComponent, PixelType.Float, depthBufferPTR);


    float[] myPixels = new float[glControlGLRender.Width * glControlGLRender.Height];
    Marshal.Copy(depthBufferPTR, myPixels, 0, glControlGLRender.Width * 
        glControlGLRender.Height);

    this.glControlGLRender.SwapBuffers();

Well it does not produce any errors, but it is not working either. The output is an array (myPixels) where all values are 0.

So how do you read the depth buffer in openTK using the PixelPackBuffer?

Thank you

1 Answers

I have solved it meanwhile. I was pretty close with my code. The correct code goes like this:

//Get depth buffer
int[] depthBufferID = new int[1];
GL.GenBuffers(1, depthBufferID);
GL.BindBuffer(BufferTarget.PixelPackBuffer, depthBufferID[0]);
GL.BufferData(BufferTarget.PixelPackBuffer, glControlGLRender.Width * glControlGLRender.Height * sizeof(float), IntPtr.Zero, BufferUsageHint.StreamRead);
GL.ReadPixels(0, 0, glControlGLRender.Width, glControlGLRender.Height, PixelFormat.DepthComponent, PixelType.Float, IntPtr.Zero);
IntPtr depthBufferPTR = GL.MapBuffer(BufferTarget.PixelPackBuffer, BufferAccess.ReadOnly);

float[] myPixels = new float[glControlGLRender.Width * glControlGLRender.Height];
Marshal.Copy(depthBufferPTR, myPixels, 0, glControlGLRender.Width * glControlGLRender.Height); 
Related