2016-07-17 7 views
2

私は、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のオブジェクトの位置

  • CPUは、コマンドバッファをコミットフレーム1のデータはまだフレーム0をレンダリングしている間にgpuにプッシュされており、フレーム0が破損しています。

    私のポストはちょっと矛盾しているか曖昧ですが問題は説明できません君は完全に理解していない。

    EDIT: per-objectはオブジェクトごとである必要があります。

    私が探している機能は、 VkCmdFillGpuMemory(VkCommandBufferコマンドバッファ、VkDeviceMemory myMemory、void * ramData)です。 データの一部のみをコピーする範囲オプションもあります(データが変更されたオブジェクトのデータのみをコピーするオプションがあります)

  • +1

    ええ、それは私が質問を理解していない点に少し曖昧です。それでは、私は返答としてあいまいな答えを出しましょう:Vulkanで、あなたはOpenGLが魔法のようにあなたのためにしたことをします。それは「問題」が存在しないことを意味するものではありません。 OpenGLでは、ドライバの実装者はそれを解決しなければなりませんでした。そしてその解決策は必ずしもすべてに適合するとは限りませんでした。 Vulkanでは、より自由にやろうとすることができ、自分がやっていることに適したテクニックを見つけなければなりません。あなたの場合は、手動で適切に同期しなければならないか、または二重バッファを使用する必要があります(実際にGPUデータが使用されている間は変更する必要があります)。 – krOoze

    +0

    "*しかし、シェーダに頂点ごとのデータを取得する"正しい "方法は何でしょうか?*"頂点ごとのデータと均一なデータは同じものではないので、すべて。また、あなたの質問は非常に幅広く、制服の話題から一般化されたGPU/CPUの同期に移行しています。 –

    +0

    私の悪い、オブジェクトごとのデータは、頂点ごとのデータではありません。 それでは、私が探していられることは、このような関数である: 'VkCmdFillGpuMemory(VkCommandBuffer commandbuffer、VkDeviceMemory myMemory、void *型RAMDATA)' ラムからGPUメモリへの同期 'memcpy'の一種。 – Aedoro

    答えて

    2

    統一データはすべてプッシュバッファまたはUBOのようなバッファ。

    頂点ごとの状態(頂点属性)は、でVkGraphicsPipelineCreateInfoに設定され、使用するバッファはvkCmdBindVertexBuffersに設定されます。

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

    +0

    vkCmdCopyBufferはgpuのデータをgpuの別の場所にコピーしますか?私が探しているのは、RAMからデータを受け取り、コマンドバッファの一部としてGPUにプッシュします。 – Aedoro

    +0

    ソースバッファがホストマッピング可能なメモリにあり、デスティネーションバッファがデバイスローカルの場合は、それはあなたが望むことをするでしょう。 –

    +0

    RAMでメモリを使用し、GPUにミラーがないVkBufferを作成するにはどうすればよいですか? メモリへのポインタを取得するために私は書くことができるvkMapMemoryが必要です。これには常にvkDeviceMemoryが必要です。これには常にデバイスにもメモリがありますか? – Aedoro