我目前正在玩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;
}
我的问题是如何将数据恢复到托管对象。
答案 0 :(得分:1)
GetBufferSubData()
的第一个参数不是缓冲区的id(也就是名称),而是缓冲区目标。您需要先将缓冲区绑定到目标,然后将GetBufferSubData
与同一目标一起使用:
Gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, Id);
Gl.GetBufferSubData(OpenGL.GL_ARRAY_BUFFER, offset, sizeof(float) * length, ptr);