私は Direct3D の経験がないので、間違った場所を見ているだけかもしれません。ただし、OpenGL (FreeGLUT を使用) で記述したプログラムを、Windows IoT 互換の UWP (Direct3D を実行、12 'だってクール) に変換したいと考えています。プログラムを Raspberry Pi 3 に移植しようとしていますが、Linux に変換したくありません。
Microsoft が提供する例を通じて、作業を開始するために知っておく必要があると思われることのほとんどを理解しましたが、CPU と GPU の間で動的データ バッファーを共有する方法がわかりません。
やり方を知りたい:
- CPU/GPU 共有循環バッファーを作成する
- GPU を使用した読み取りと描画
- セクションを CPU で書き込み / 置換
簡単な半疑似コード:
while (!buffer.inUse()){ //wait until buffer is not in use
updateBuffer(buffer.id, data, start, end); //insert data into buffer
drawToScreen(buffer.id); //draw using vertex data in buffer
}
これは以前、OpenGL では、書き込まれていないときに配列内の各値に対して glBegin()/glEnd() および glVertex3f() を使用するだけで行われていました。
更新: 基本的に、glBufferSubData() を使用した OpenGL VBO 編集に相当する Direct3D12 が必要です。それがより理にかなっている場合。
更新 2: フレームごとに頂点バッファーを破棄し、新しいバッファーを GPU に再アップロードすることで回避できることがわかりました。フレームごとに 10,000 ~ 200,000 の double を転送すると予想されるように、かなりの量のオーバーヘッドがあります。そのため、定数バッファーを使用して 5 ~ 10 個の更新された頂点をシェーダーに移植する方法を見つけようとしています。そのため、シェーダーを使用して定数バッファーから頂点バッファーにコピーでき、フレームごとにマップ/アンマップを使用する必要はありません。 . このように、CPU 上の循環バッファーは、GPU で使用されているバッファーから独立していますが、定期的な更新を通じて両方が同じ情報を共有します。解決策が見つからない場合は、さらに調べて、シェーダーに関する別のより具体的な質問を投稿します。