简体   繁体   English

OpenTK 读取深度缓冲区到数组

[英]OpenTK read depth buffer to array

I am trying to read the depth buffer and store it into an array using openTK in C#.我正在尝试使用 C# 中的 openTK 读取深度缓冲区并将其存储到数组中。

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.输出是一个数组 (myPixels),其中所有值都为 0。

So how do you read the depth buffer in openTK using the PixelPackBuffer?那么如何使用PixelPackBuffer读取openTK中的深度缓冲区呢?

Thank you谢谢

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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