OpenTK(OpenGL)正确使用BufferData和BufferSubData

时间:2013-09-08 15:08:59

标签: c# opengl buffer vbo opentk

我正在使用OpenTK在C#中使用Marching Cubes实现,我对algorythm没有任何问题,但我无法弄清楚如何让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。

修改 每次更新时,数组,顶点和索引的长度都是varry。

1 个答案:

答案 0 :(得分:1)

好的,我发现你分配后不能改变openGL缓冲区的大小。但是,如果可以使用正确的扩展,则可以使用openCL来管理缓冲区。这对我减少Terrain解决方案的内存占用有很大帮助。