我正在使用 OpenTK 在 C# 中实现 Marching Cubes,我对算法没有任何问题,但我无法弄清楚如何让 BufferData 和 BufferSubData 正常运行。
我已经确认顶点和索引会像往常一样通过在每次更新时删除和创建新缓冲区来运行,但是每帧都这样做会对性能产生巨大影响,所以这是没有选择的。
谷歌搜索后,我当前的设置如下所示:
class ChunkVertexBuffer : IIndexSource, IVertexSource, IDisposable
{
private int indexBufferHandle;
private int vertexBufferHandle;
[StructLayout(LayoutKind.Sequential)]
public struct N3fV3f
{
public Vector3 normal;
public Vector3 position;
}
public ChunkVertexBuffer()
{
int[] handles = new int[2];
GL.GenBuffers(2, handles);
indexBufferHandle = handles[0];
vertexBufferHandle = handles[1];
}
public void BufferData(N3fV3f[] vertices, uint[] indices)
{
GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBufferHandle);
GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferHandle);
int vertexStride = BlittableValueType.StrideOf(vertices);
int indexStride = sizeof(uint);
GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * vertexStride), IntPtr.Zero, BufferUsageHint.StreamDraw);
GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)0, (IntPtr)(vertices.Length * vertexStride), vertices);
GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(indices.Length * indexStride), IntPtr.Zero, BufferUsageHint.StreamDraw);
GL.BufferSubData(BufferTarget.ElementArrayBuffer, (IntPtr)0, (IntPtr)(indices.Length * indexStride), indices);
}
}
我也尝试了很多变化,但结果总是一样的,没有画出来。GL.GetError() 在此设置中返回 NoError。
编辑 数组、顶点和索引的长度在每次更新时都会有所不同。