OpenTK を使用して C# でマーチング キューブの実装に取り組んでいます。アルゴリズムに問題はありませんが、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 を返しました。
編集 配列、頂点、およびインデックスの両方の長さは、更新ごとに異なります。