1

我正在使用 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。

编辑 数组、顶点和索引的长度在每次更新时都会有所不同。

4

1 回答 1

1

好的,我发现一旦分配,您就无法更改 openGL 缓冲区的大小。但是,如果有正确的扩展可用,您可以使用 openCL 来管理缓冲区。这对我减少地形解决方案的内存占用有很大帮助。

于 2013-09-14T07:47:19.743 回答