12

Vulkan 仕様と Khronos のいくつかの例を読んでいますが、不変サンプラー全般に関する多くの情報を見つけることができません。

私がやろうとしているのは、不変のサンプラー (タイプ VK_DESCRIPTOR_TYPE_SAMPLER であり、...COMBINED_IMAGE_SAMPLER ではない) でいっぱいの記述子セットを用意することです。テクスチャをサンプリングする場合は、シェーダーで次のようにサンプラーにアクセスします。

layout (location = 0) out vec4 out_color;

layout (set = 0, binding = 0) uniform sampler immutableSampler;
layout (set = 3, binding = 0) uniform texture2D color;

void main()
{
    vec4 textureColor = texture(sampler2D(color, immutableSampler), in_uv);
    out_color = textureColor;
}

このシェーダーのアイデアは次のとおりです。

  • パイプライン レイアウトでは、セット 0 のバインド ポイント 0 に不変のサンプラーがあります。
  • また、コマンド バッファーの一部としてバインドするバインディング ポイント 0 に記述されたイメージを含む記述子セット (3) もあります。
  • 不変サンプラーをシェーダーの画像に適用します
  • 次に、実際に画像にアクセスしますsampler2D

ただし、クロノスのサンプルで見た方法は次のとおりです。

  • パイプライン レイアウトのバインド ポイントで VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER の不変サンプラーを記述します (サンプラーのみを提供します)。
  • イメージを作成し、同じバインディング ポイントにバインドします (サンプラーなし)。
  • sampler2Dシェーダーでとしてイメージにアクセスします。バインドした画像は、そのバインディングで不変のサンプラーとペアになっています

Vulkan の仕様では、どちらが「正しい」かは述べていませんが、次の点に注意してください。

または型記述子をdescriptorType指定する場合、一連の不変サンプラーを初期化するために使用できます。VK_DESCRIPTOR_TYPE_SAMPLERVK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLERpImmutableSamplers

シェーダーが期待どおりに機能した場合、この質問をする必要はありません。私が直面している問題は、検証時に Vulkan レイヤーが、私の VkPipeline がバインドされたことのない記述子セット (セット 0、サンプラーが存在するバインディング 0) を使用していると不平を言うことです! そこにガベージ データをバインドしたとしても、別の検証エラーを抑制するためだけに、記述子セットをガベージで (少なくとも 1 回は) 更新する必要があります。ただし、同時に Vulkan の仕様には次のように記載されています。

不変のサンプラーはセット レイアウトに永続的にバインドされます。後でサンプラーを記述子セットの不変サンプラー スロットにバインドすることは許可されていません

そのため、そのバインド ポイントにデータをバインドすることさえ許可されません。

不変サンプラーへの私のアプローチがあいまいであるため、有効であると想定されているかどうかは、今のところ非常に確信が持てません。仕様には、画像なしでサンプラーをバインドできると書かれていますが、そうすると文句が言い、私が見つけたいくつかの例は結合された画像サンプラーをバインドしています。私はこれを間違っているだけですか?

DirectX 12 と Vulkan の両方のシステムを構築しようとしているので、私のアプローチが有効で機能する可能性がある場合は、それが本当に好きです。DX12 の「ルート レイアウト」(パイプライン レイアウト) には、すべての不変サンプラーが関連付けられたイメージなしでバインドされる場所があります。レンダラー間のパリティを維持するためにこの動作をエミュレートしたいのですが、それが Vulkan で本当に可能かどうかは非常に確信が持てず、仕様も非常にあいまいです。

4

1 に答える 1