2017-10-10 8 views
1

私はグラフィックプログラミングとVulkanを使い慣れています。 私は、ディスクリプタセットにバインドバッファが必要であることを理解していますが、私が持っているすべてのバッファに対して新しいディスクリプタセットが必要か、ディスクリプタセットが2つ以上のバッファをバインドできるかどうかは疑問です。 「はい」の場合は、これについての経験則は何ですか?すべてのバッファに新しいディスクリプタセットを作成する必要がありますか?

答えて

1

各ディスクリプタセットは、同じタイプまたは異なるタイプの複数のリソースを持つことができます。ディスクリプタセットを介してどのタイプのリソースにバインドできるかは、ディスクリプタセットレイアウトで定義されます。そこでは、VkDescriptorSetLayoutBinding構造を通して、リソースの特定のタイプ(サンプラー、ストレージイメージ、またはユニフォームバッファなど)を指定し、このタイプのリソースの数をシェーダ内の配列としてアクセスします。しかし、別のレイアウトエントリ(レイアウト作成中に指定された複数のVkDescriptorSetLayoutBindingエントリ)と同じタイプの複数のリソースを指定することもできます。そのような記述子のそれぞれは、別々の異なるバインディングを使用する必要があります。 - それは依存してあなたの質問の後半部分については

layout(set=S, binding=B) uniform <variable_type> <variable_name>; 

:と同一の結合は、特定のリソースにアクセスするために、シェーダ内で使用する必要があります。描かれたシーン、レンダリングされたリソースのタイプ、リソースの数、メモリ使用量、グラフィックスハードウェアベンダーさえも、レンダリング中にディスクリプタセットを作成してバインドするために使用されるアプローチに影響します。一般的なルールは、レンダリング中に状態の変化を最小限に抑えることです。したがって、vkCmdBindDescriptorSets()関数呼び出しの数はできるだけ小さくする必要があります。しかし、これはあなたのシーンの柔軟性とダイナミックの両方を制限します。したがって、記述子を変更するか、複数の記述子を使って複数の記述子を一度にバインドする必要がある多くの状況があります。しかし、私が書いたように、それはすべて与えられた状況に依存します。

1

いいえ、リソースごとに個別のディスクリプタセットは必要ありません。

VkDescriptorSetLayoutのドキュメントは、何が起こっているかを明確にしているようです。同じ章でこれを実証している素晴らしいコード例もあります。だから、

、それを総括する:あなたは、単一の記述子タイプ

  • の(均質)の配列を持つことができます

    • あなたは、それぞれが任意の記述子タイプのリソースを保持することができ、いくつかの「バインディング」を持つことができます(またはその配列)
    • そして間接の1つの以上の層として使用すると、複数の記述子を持つことができますが、親指の

    ルールはおそらくある「以下がよりある」独自のバインディングを持つそれぞれを設定します。別のタイプまたは名前を持つためにリソースを必要としない場合は、arrayを使用します。別のセットが必要ない場合は、1セットのみを使用してください。

  • 関連する問題