Я работаю над реализацией 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 при этой настройке.
ИЗМЕНИТЬ Длина обоих массивов, вершин и индексов меняется при каждом обновлении.