Vulkanは、複数の入力記述を許可します。私の使用例では、2セットの特定のオブジェクトをレンダリングします。 2つの異なるオフセット位置のフレームデータとオブジェクトデータを含む動的バッファに2つのオフセットを設定して0を設定します。オブジェクトごとに変更するテクスチャで1を設定します。だから私の最初のパスの後、私は2セットをバインドしています。私は次のサブパスを開始し、別のパイプラインをバインドするとき、これらの2つのセットはまだバインドされています。次に、セット0をバインドしようとすると(今は1に設定する必要はありません)、互換性に関するパフォーマンス警告が表示されます。パフォーマンス警告を与える前のパイプラインからのVkDescriptorSet
DescriptorSetDS 0x10 previously bound as set #0 is incompatible with set 0x668cec8 newly bound as set #0 so set #1 and any subsequent sets were disturbed by newly bound pipelineLayout (0x64)
今、これは私には明らかである、と私はセット1が「邪魔」していることを理解しています。しかし、私はどのようにすればよいか分からないのは、これが正しいことをvulkanに伝えることです。警告はもう出されません(このエラーが常に発生するソフトウェアを設計するのは間違っています)。私はバインドされているセットのリセット、セットのバインド解除のようなものを期待しています。しかし、私は何かが見当たらないので何かが欠けていると思う。もちろん
は多分私が完了するので、私の単純化されたコールのため、何か間違ったこと、またはいくつかの関連するコマンドが欠落しています:
vkCmdBeginRenderPass vkCmdBindPipeline vkCmdBindDescriptorSets -> bind sets: 0, 1 vkCmdBindVertexBuffers vkCmdDraw vkCmdNextSubpass vkCmdBindPipeline (different pipeline) vkCmdBindDescriptorSets -> bind set: 0 -> error about set disturbance
「このエラーが常に発生するソフトウェアを設計するのは間違っているようです」「エラーではありません。それは警告です。あなたのケースでは正当なものですが、誰かがそれを期待していると、エラーを検出することがあります。空のセットを他のセットのインデックスにバインドすることで、おそらく警告を止めることができます。 –
代わりに最後のセットを変更することでシャットダウンできると思います。レイヤーは、最後のセットが最も変更され、最初のセットが最も変更されるべきであることを示唆します。それとも、別のCBに移動して状態を「リセット」します。 – krOoze
パイプラインレイアウトでセット1の使用方法のみを指定しますか? VkPipelineLayoutCreateInfoのpSetLayoutsの順番によって、常に0から始まるセットのレイアウトが暗黙的に決定されたようです。次に、実際に気にするセット1の前のpipelinelayoutからセット0をバインドできますが、それはちょっとひどいようです設計。 – Aedoro