OpenTK (OpenGL) правильное использование BufferData и BufferSubData

Я работаю над реализацией Marching Cubes на C # с OpenTK, у меня нет проблем с алгоритмом, но я не могу понять, как заставить 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 при этой настройке.

ИЗМЕНИТЬ Длина обоих массивов, вершин и индексов меняется при каждом обновлении.


person Vengarioth    schedule 08.09.2013    source источник


Ответы (1)


Хорошо, я узнал, что вы не можете изменить размер буфера openGL после его выделения. Однако вы можете использовать openCL для управления вашими буферами, если доступны нужные расширения. Это очень помогло мне уменьшить объем памяти, занимаемой моим решением Terrain.

person Vengarioth    schedule 14.09.2013