OpenTK (OpenGL) 正确使用 BufferData 和 BufferSubData

Posted

技术标签:

【中文标题】OpenTK (OpenGL) 正确使用 BufferData 和 BufferSubData【英文标题】:OpenTK (OpenGL) correct usage of BufferData and BufferSubData 【发布时间】:2013-09-08 15:08:59 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于OpenTK (OpenGL) 正确使用 BufferData 和 BufferSubData的主要内容,如果未能解决你的问题,请参考以下文章

单个glControl上的多个纹理 - openTK

OpenTK - 累积缓冲区的可用性

vTextCoord 值不起作用 - c# OPENTK

C# OpenTK - 不渲染的简单示例

简单的 OpenTK 着色器不起作用

OpenTK 按键?