DirectX 12 に問題があります。小さな 3D レンダラーを作成しました。モデルは、定数バッファーにある基本的なワールド ビュー プロジェクション マトリックスを使用して、頂点シェーダーの 3D 空間に変換されます。
現在このコマンドを使用している定数バッファーのデータを変更するには、定数memcpy(pMappedConstantBuffer + alignedSize * frame, newConstantBufferData, alignedSize)
バッファーのデータをすぐに置き換えます。
ここで問題が発生します。描画はコマンド リストに記録され、後で実行のために GPU に送信されます。
例:
/* Now i want to change the constant buffer to change the next draw call's position to (0, 1, 0) */
memcpy(/*Parameters*/);
/* Now i want to record a draw call to the command list */
DrawInstanced(/*Parameters*/);
/* But now i want to draw other mesh to other position so i have to change the constant buffer. After this memcpy() the draw position will be (0, -1, 0) */
memcpy(/*Parameters*/);
/* Now i want to record new draw call to the list */
DrawInstanced(/*Parameters*/);
この後、実行のためにコマンドリストをgpuに送信しましたが、コマンドリストがgpuに送信される前にすべてのmemcpyが実行されるため、すべてのメッシュが同じ位置にあることを確認してください。したがって、基本的に最後の memcpy は前のものを上書きします。
したがって、基本的に問題は、メッシュを異なる位置に描画する方法、またはコマンドリスト内の定数バッファーのデータを置き換える方法で、gpu の各描画呼び出し間で定数バッファーが変更されるようにすることです。
ありがとう
もう助けは必要ありません。自分で解決しました。メッシュごとに定数バッファーを作成しました。