每帧OpenTK更新bufferarray
Updating bufferarray every frame OpenTK
我在 OpenTK 中绘制一个对象,它在每一帧中不断改变位置。现在,我不断更改位置数组并通过调用 GL.BufferData
来缓冲新数据。有没有一种方法可以更新或映射到一个缓冲区数组,而无需在每一帧中都创建一个新缓冲区?我注意到我最终得到 Out Of Memory
异常。
private void Drawobject(Vector3 cursorPos)
{
float[] cursors = new float[] { cursorPos.X-0.01f , cursorPos.Y-0.01f - 0.2f, cursorPos.Z, cursorPos.X-0.01f, cursorPos.Y-0.01f + 0.2f, cursorPos.Z, cursorPos.X-0.01f - 0.2f, cursorPos.Y-0.01f, cursorPos.Z, cursorPos.X-0.01f + 0.2f, cursorPos.Y-0.01f, cursorPos.Z };
int VertexBufferCursor, _vao;
VertexBufferCursor = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferCursor);
GL.BufferData(BufferTarget.ArrayBuffer, cursors.Count() * sizeof(float), cursors, BufferUsageHint.StaticDraw);
_vao = GL.GenVertexArray();
GL.BindVertexArray(_vao);
GL.EnableVertexAttribArray(0);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
shader4.Use();
GL.BindVertexArray(_vao);
GL.DrawArrays(PrimitiveType.Lines, 0, 4);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
}
protected override void OnRenderFrame(FrameEventArgs e)
{
Drawobject(currentMousePos);
}
在初始化时创建 Vertex Array Object and the Vertex Buffer Object 一次:
private int VertexBufferCursor;
private int _vao;
private void Init(Vector3 cursorPos)
{
float[] cursors = new float[] { cursorPos.X-0.01f , cursorPos.Y-0.01f - 0.2f, cursorPos.Z, cursorPos.X-0.01f, cursorPos.Y-0.01f + 0.2f, cursorPos.Z, cursorPos.X-0.01f - 0.2f, cursorPos.Y-0.01f, cursorPos.Z, cursorPos.X-0.01f + 0.2f, cursorPos.Y-0.01f, cursorPos.Z };
VertexBufferCursor = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferCursor);
GL.BufferData(BufferTarget.ArrayBuffer, cursors.Count() * sizeof(float), cursors, BufferUsageHint.StaticDraw);
_vao = GL.GenVertexArray();
GL.BindVertexArray(_vao);
GL.EnableVertexAttribArray(0);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
}
通过glBufferSubData
更新每帧中的缓冲区:
private void Drawobject(Vector3 cursorPos)
{
float[] cursors = new float[] { cursorPos.X-0.01f , cursorPos.Y-0.01f - 0.2f, cursorPos.Z, cursorPos.X-0.01f, cursorPos.Y-0.01f + 0.2f, cursorPos.Z, cursorPos.X-0.01f - 0.2f, cursorPos.Y-0.01f, cursorPos.Z, cursorPos.X-0.01f + 0.2f, cursorPos.Y-0.01f, cursorPos.Z };
GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferCursor);
GL.BufferSubData(BufferTarget.ArrayBuffer, IntPtr.Zero, cursors.Count() * sizeof(float), cursors);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
shader4.Use();
GL.BindVertexArray(_vao);
GL.DrawArrays(PrimitiveType.Lines, 0, 4);
GL.BindVertexArray(0);
}
我在 OpenTK 中绘制一个对象,它在每一帧中不断改变位置。现在,我不断更改位置数组并通过调用 GL.BufferData
来缓冲新数据。有没有一种方法可以更新或映射到一个缓冲区数组,而无需在每一帧中都创建一个新缓冲区?我注意到我最终得到 Out Of Memory
异常。
private void Drawobject(Vector3 cursorPos)
{
float[] cursors = new float[] { cursorPos.X-0.01f , cursorPos.Y-0.01f - 0.2f, cursorPos.Z, cursorPos.X-0.01f, cursorPos.Y-0.01f + 0.2f, cursorPos.Z, cursorPos.X-0.01f - 0.2f, cursorPos.Y-0.01f, cursorPos.Z, cursorPos.X-0.01f + 0.2f, cursorPos.Y-0.01f, cursorPos.Z };
int VertexBufferCursor, _vao;
VertexBufferCursor = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferCursor);
GL.BufferData(BufferTarget.ArrayBuffer, cursors.Count() * sizeof(float), cursors, BufferUsageHint.StaticDraw);
_vao = GL.GenVertexArray();
GL.BindVertexArray(_vao);
GL.EnableVertexAttribArray(0);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
shader4.Use();
GL.BindVertexArray(_vao);
GL.DrawArrays(PrimitiveType.Lines, 0, 4);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
}
protected override void OnRenderFrame(FrameEventArgs e)
{
Drawobject(currentMousePos);
}
在初始化时创建 Vertex Array Object and the Vertex Buffer Object 一次:
private int VertexBufferCursor;
private int _vao;
private void Init(Vector3 cursorPos)
{
float[] cursors = new float[] { cursorPos.X-0.01f , cursorPos.Y-0.01f - 0.2f, cursorPos.Z, cursorPos.X-0.01f, cursorPos.Y-0.01f + 0.2f, cursorPos.Z, cursorPos.X-0.01f - 0.2f, cursorPos.Y-0.01f, cursorPos.Z, cursorPos.X-0.01f + 0.2f, cursorPos.Y-0.01f, cursorPos.Z };
VertexBufferCursor = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferCursor);
GL.BufferData(BufferTarget.ArrayBuffer, cursors.Count() * sizeof(float), cursors, BufferUsageHint.StaticDraw);
_vao = GL.GenVertexArray();
GL.BindVertexArray(_vao);
GL.EnableVertexAttribArray(0);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
}
通过glBufferSubData
更新每帧中的缓冲区:
private void Drawobject(Vector3 cursorPos)
{
float[] cursors = new float[] { cursorPos.X-0.01f , cursorPos.Y-0.01f - 0.2f, cursorPos.Z, cursorPos.X-0.01f, cursorPos.Y-0.01f + 0.2f, cursorPos.Z, cursorPos.X-0.01f - 0.2f, cursorPos.Y-0.01f, cursorPos.Z, cursorPos.X-0.01f + 0.2f, cursorPos.Y-0.01f, cursorPos.Z };
GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferCursor);
GL.BufferSubData(BufferTarget.ArrayBuffer, IntPtr.Zero, cursors.Count() * sizeof(float), cursors);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
shader4.Use();
GL.BindVertexArray(_vao);
GL.DrawArrays(PrimitiveType.Lines, 0, 4);
GL.BindVertexArray(0);
}