1

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 を返しました。

編集 配列、頂点、およびインデックスの両方の長さは、更新ごとに異なります。

4

1 に答える 1

1

わかりました、一度割り当てられたopenGLバッファのサイズを変更できないことがわかりました。ただし、適切な拡張機能が利用可能な場合は、openCL を使用してバッファーを管理できます。これは、Terrain ソリューションのメモリ フットプリントを削減するのに大いに役立ちました。

于 2013-09-14T07:47:19.743 に答える