2

私が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) です。できれば、データの一部のみをコピーする範囲オプションも使用します (そのため、データが変更されたオブジェクトのデータのみをコピーするオプションがあります)。

4

1 に答える 1

2

均一なデータはすべて、プッシュバッファーまたは UBO のようなバッファーを通過する必要があります。

頂点ごとの状態 (頂点アトリビュート) は で設定さVkPipelineVertexInputStateCreateInfoれ、VkGraphicsPipelineCreateInfoで使用するバッファを設定しますvkCmdBindVertexBuffers

バッファ間でデータをコピーする vkCmdCopyBuffer があります。

于 2016-07-17T16:32:09.230 に答える