私は、多くのXNAプロジェクトと同様に、Device.DrawIndexedPrimitives()
呼び出しでレンダリングされる頂点のコレクションを生成するために使用される地形変位マップから開始した個人的なプロジェクトに取り組んでいます。
カスタムVertexDeclaration
に更新しましたが、現在そのコードにアクセスできないため、少し古いが、パラダイム的に同一の(?)コードを投稿します。
私は次のように定義してVertexBuffer
います:
VertexBuffer = new VertexBuffer(device, VertexPositionNormalTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
VertexBuffer.SetData(vertices);
ここで、「頂点」は次のように定義されます。
VertexPositionNormalTexture[] vertices
また、Update()の反復ごとに交換される2つのインデックスバッファーがあります。Draw()
呼び出しで、私はバッファを設定しましたGraphicsDevice
:
Device.SetVertexBuffer(_buffers.VertexBuffer);
Device.Indices = _buffers.IndexBuffer;
無関係なコード行を無視して、境界形状内をチェックして、頂点がマウスカーソルの特定の半径内にあるかどうかを判断し、押されたキーに応じて頂点の位置を上下させるメソッドがあります。私の問題はVertexBuffer.SetData()
、コンテナクラスの初期化時にが1回だけ呼び出されることです。
配列の頂点位置を変更してVertexPositionNormalTexture[]
も、頂点位置の値は変更されますが、画面には反映されません。これは呼び出しに関連していると思いますが、頂点配列を変更した後でVertexBuffer.SetData()
単純に呼び出すことはできません。SetData()
IndexBufferの処理方法(2つのバッファー、スワップされ、一度に渡される)を再検討した後、SetData()
これが操作Update()
を処理する方法であると思いますが、これは機能しますか?VertexBuffer
より適切な方法はありますか?ここで同様の質問への別の参照を見ましたが、ソースへのリンクはMegaUploadにあったので...
私は自分のVertexBuffer.Swap()
アイデアを試してみますが、私はまた、参照を見てDynamicVertexBuffer
、何が得られるのか疑問に思いますか?パフォーマンスはおそらく低下しますが、地形エディタの場合、頂点データを動的に操作できれば、それがあまりにも大きなトレードオフになるとは思いません。
さらにコードを投稿することはできますが、これはおそらく、デバイスバッファーがどのように設定されているか、またはデータがそれらにストリーミングされているかについての理解が不足していると思います。
編集:以下に提案された解決策は正しいです。すぐにコードを投稿します。