私は、OpenBlackから慣れていたのは、コマンドバッファ内のリソースが、glUniformMatrix4fv
のようにシェーダにバインドされていたことでした。 これまでのところ、唯一の同等物はvkCmdPushConstants
です。Vulkan uniform shader data
しかし、すべてのオブジェクトのデータで大きなバッファを作成するオプションもあります。そして、vkCmdBindDescriptorSets
を使って、シェーダが対応するオブジェクトのデータを使用するようにオフセットを変更します(ここで私は何かが間違っていることを修正しました。 しかし、オブジェクトごとのデータをシェーダーに渡す「正しい」方法は何ですか?どのようにシェーダがオブジェクトごとに変更する必要があるデータの量に依存しますか?
私が持っている他の質問は、同期されたGPUとCPUと関係があります。 次のフレームのデータをGPUにコピーする前に、フレームの準備ができるまで待つ必要があります。 それでは、どのようにバッファーコピーをコマンドバッファーで実行させることができますか?コマンドバッファを受け取るvkFlushMappedMemoryRanges
のようなものです。セマフォを設定して、gpuの古いデータをRAMの次のフレームの新しいデータで上書きする前に、データの使用が完了するのを待つことができます。またRAMでは、スワップチェーン内の各イメージに別々のバッファを使用するので、次のフレームのデータの書き込みを開始することができます(スワップチェーンのイメージカウントまで)。 そのバッファコピーを同期できない場合は、swpachainイメージごとにオブジェクトごとのデータを含むgpuのバッファが必要になります。そして、それは私にとって宇宙の浪費のようです。
GPUメモリのRAMにシェーダデータを含むバッファが1つしかなく、各フレーム後にgpuがアイドル状態にならないようにするには、すでにswapchainに収まるすべてのフレーム)
- CPUは、CPUがフレーム1
- ためのコマンドバッファをコミット
- GPUにフレーム0のためのオブジェクトの位置をプッシュするためのコマンドバッファを提出した場合に待ちたいですGPUがフレーム0のレンダリングを開始する
- cpu pushesフレーム1
- GPUはフレーム0
- GPUはフレーム1
- GPUは、例えば、フレーム1
を終了開始終了のためにGPUにフレーム1のオブジェクトの位置
私のポストはちょっと矛盾しているか曖昧ですが問題は説明できません君は完全に理解していない。
EDIT: per-objectはオブジェクトごとである必要があります。
私が探している機能は、 VkCmdFillGpuMemory(VkCommandBufferコマンドバッファ、VkDeviceMemory myMemory、void * ramData)です。 データの一部のみをコピーする範囲オプションもあります(データが変更されたオブジェクトのデータのみをコピーするオプションがあります)
ええ、それは私が質問を理解していない点に少し曖昧です。それでは、私は返答としてあいまいな答えを出しましょう:Vulkanで、あなたはOpenGLが魔法のようにあなたのためにしたことをします。それは「問題」が存在しないことを意味するものではありません。 OpenGLでは、ドライバの実装者はそれを解決しなければなりませんでした。そしてその解決策は必ずしもすべてに適合するとは限りませんでした。 Vulkanでは、より自由にやろうとすることができ、自分がやっていることに適したテクニックを見つけなければなりません。あなたの場合は、手動で適切に同期しなければならないか、または二重バッファを使用する必要があります(実際にGPUデータが使用されている間は変更する必要があります)。 – krOoze
"*しかし、シェーダに頂点ごとのデータを取得する"正しい "方法は何でしょうか?*"頂点ごとのデータと均一なデータは同じものではないので、すべて。また、あなたの質問は非常に幅広く、制服の話題から一般化されたGPU/CPUの同期に移行しています。 –
私の悪い、オブジェクトごとのデータは、頂点ごとのデータではありません。 それでは、私が探していられることは、このような関数である: 'VkCmdFillGpuMemory(VkCommandBuffer commandbuffer、VkDeviceMemory myMemory、void *型RAMDATA)' ラムからGPUメモリへの同期 'memcpy'の一種。 – Aedoro