0

我目前正在玩,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;
 }

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

4

1 回答 1

1

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

Gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, Id);
Gl.GetBufferSubData(OpenGL.GL_ARRAY_BUFFER, offset, sizeof(float) * length, ptr);
于 2014-05-28T04:50:08.103 回答