如何使用GetBufferSubData?

时间:2014-05-27 08:16:40

标签: c# opengl unsafe sharpgl

我目前正在玩SharpGL,但无法弄清楚如何以正确的方式使用它的函数GetBufferSubData。

   public void GetBufferSubData(uint target, 
                                int offset, 
                                int size, 
                                IntPtr data);

用例情况:我已经用一些数据填充VBO,现在想从那里获取它回到托管对象。

我的尝试失败了FatalExecutionEngineError,正如我读到的那样,它对应于内存堆中的泄漏。但我不确定我是否有适合我需求的代码。

public virtual unsafe float[] GetFromBuffer(int offset, int length)
{
    float[] output = new float[length];

    Bind();

    fixed (float* array = output)
    {
        var ptr = new IntPtr(array);

        Gl.GetBufferSubData(Id, offset, sizeof(float) * length, ptr);

        // Not needed code (fixed after answer)
        //GCHandle handle = (GCHandle) ptr;
        //output = (handle.Target as float[]);
    }

    return output;
 }

我的问题是如何将数据恢复到托管对象。

1 个答案:

答案 0 :(得分:1)

GetBufferSubData()的第一个参数不是缓冲区的id(也就是名称),而是缓冲区目标。您需要先将缓冲区绑定到目标,然后将GetBufferSubData与同一目标一起使用:

Gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, Id);
Gl.GetBufferSubData(OpenGL.GL_ARRAY_BUFFER, offset, sizeof(float) * length, ptr);