私がopenglから慣れているのは、コマンドバッファ内でリソースがシェーダーにバインドされていることglUniformMatrix4fv
でした. 今私が見ることができる限り、同等のものはvkCmdPushConstants
.
ただし、すべてのオブジェクトのデータを含む大きなバッファーを作成するオプションもあります。そしてvkCmdBindDescriptorSets
、シェーダーが対応するオブジェクトのデータを使用するようにオフセットを変更するために使用します(ここで何かが間違っているのは正しいです、これが私がそれを行うことができると思う方法です)。しかし、オブジェクトごとのデータをシェーダーに渡す「正しい」方法は何でしょうか? また、シェーダーがオブジェクトごとに変更する必要があるデータの量にどのように依存しますか。
もう 1 つの質問は、gpu と cpu の同期に関するものです。次のフレームのデータを GPU にコピーする前に、フレームの準備ができるまで待つ必要があります。では、コマンド バッファーでバッファー コピーを実行するにはどうすればよいでしょうか。そのようなvkFlushMappedMemoryRanges
ものはコマンドバッファを取ります次に、セマフォを設定し、データの使用が完了するのを待ってから、RAM からの次のフレームの新しいデータで gpu 上の古いデータを上書きすることができます。また、RAM では、スワップチェーン内の各画像に個別のバッファーを使用して、次のフレームのデータの書き込みを既に開始できるようにします (スワップチェーンの画像数まで)。そのバッファ コピーを同期できない場合は、swpachain イメージごとにオブジェクトごとのデータを含む GPU 上のバッファが必要になると思われます。そして、それは私にとってスペースの無駄のように思えます。
GPUメモリのRAMとGPUメモリの両方にシェーダーデータを含むバッファーが1つしかない場合、および各フレームの後にgpuをアイドル状態にしたくない場合(次の場合にのみ待機する必要があると思います)スワップチェーンに収まるすべてのフレームのコマンド バッファーを既に送信しています)。
- cpu は、フレーム 0 のオブジェクトの位置を GPU にプッシュします。
- cpu はフレーム 1 のコマンド バッファをコミットします。
- GPU はフレーム 0 のレンダリングを開始します
- CPU はフレーム 1 のオブジェクト位置を GPU にプッシュします
- cpu はフレーム 1 のコマンド バッファをコミットします。
- GPU はフレーム 0 を終了します
- GPU はフレーム 1 を開始します
- GPU はフレーム 1 を終了します
この例では、フレーム 1 のデータは、まだフレーム 0 をレンダリングしている間に既に GPU にプッシュされており、これによりフレーム 0 が破損しています。
私の投稿が少し支離滅裂または曖昧で申し訳ありませんが、あなたが完全に理解していない問題を説明するのは難しいです.
編集: 頂点ごとはオブジェクトごとにすべきでした。
私が探している関数は、VkCmdFillGpuMemory(VkCommandBuffer commandbuffer, VkDeviceMemory myMemory, void* ramData) です。できれば、データの一部のみをコピーする範囲オプションも使用します (そのため、データが変更されたオブジェクトのデータのみをコピーするオプションがあります)。