修改 HLSL 着色器以在 Vulkan 中工作,我必须分开 textures/samplers 吗?
Modifying a HLSL shader to work in Vulkan, do I have to separate textures/samplers?
我正在修改 D3D12 中使用的 HLSL 着色器以编译为 SPIR-V,因为我想在 Vulkan 中使用相同的着色器代码。这是着色器:
#if !VULKAN
#define layout(a)
#else
#define register(a) blank
#endif
struct VSOutput
{
float4 pos : SV_Position;
float2 uv : TEXCOORD;
float4 color : COLOR;
};
layout(binding=1) Texture2D<float4> tex : register(t0);
layout(binding=1) SamplerState sLinear : register(s0);
float4 main( VSOutput vsOut ) : SV_Target
{
return tex.SampleLevel( sLinear, vsOut.uv, 0 ) * vsOut.color;
};
如果我在索引 1 处设置的描述符具有类型 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
,我能否对纹理和采样器使用相同的绑定,或者我必须使用两个绑定槽,一个用于纹理,一个用于采样器?我问是因为我的管道创建失败并出现错误
Vulkan warning: [ParameterValidation], code: 9:
vkCreateGraphicsPipelines: returned VK_ERROR_INITIALIZATION_FAILED,
indicating that initialization of an object has failed
如果使用此着色器而不是编译到 SPIR-V 中的 GLSL 着色器。我的 GLSL 着色器使用这样的纹理:
layout (binding = 1) uniform sampler2D textureMap;
就 SPIR-V 和 Vulkan 而言,等效的 SPIR-V 应该可以工作。也就是说,您可以有一个图像变量和一个采样器变量,它们都绑定到同一个绑定,并在其上使用 COMBINED_IMAGE_SAMPLER
:
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
descriptor set entries can also be accessed via separate sampler and sampled image shader variables.
和:
It is valid for multiple shader variables to be assigned the same descriptor set and binding values, as long as all those that are statically used by the entry point being compiled are compatible with the descriptor type in the descriptor set layout binding.
组合的 image/sampler 描述符类型与图像和采样器兼容。
当然,这并不意味着您正在使用的验证层知道 ;) 请注意,最后引用来自最近对规范所做的澄清,因此层可能没有正确实现它。
我建议,如果您的代码在其他方面是正确的,请提交错误报告。
layout (binding = 1) uniform sampler2D textureMap;
最好也指定 set
。 KHR_vulkan_glsl默认设置为0,但最好有明确的声明。
如果您使用组合图像图像采样器,则需要使用一个绑定。但是您需要通过布局限定符定义集合编号和绑定编号:
layout( set=S, binding=B ) ...
Here 是使用组合图像采样器的示例。如果需要,您还可以使用单独的采样器和采样图像对象。然后您必须在两个单独的绑定中定义它们并使用两个描述符。但是组合图像采样器描述符在某些平台上可能会有更好的性能。
我正在修改 D3D12 中使用的 HLSL 着色器以编译为 SPIR-V,因为我想在 Vulkan 中使用相同的着色器代码。这是着色器:
#if !VULKAN
#define layout(a)
#else
#define register(a) blank
#endif
struct VSOutput
{
float4 pos : SV_Position;
float2 uv : TEXCOORD;
float4 color : COLOR;
};
layout(binding=1) Texture2D<float4> tex : register(t0);
layout(binding=1) SamplerState sLinear : register(s0);
float4 main( VSOutput vsOut ) : SV_Target
{
return tex.SampleLevel( sLinear, vsOut.uv, 0 ) * vsOut.color;
};
如果我在索引 1 处设置的描述符具有类型 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
,我能否对纹理和采样器使用相同的绑定,或者我必须使用两个绑定槽,一个用于纹理,一个用于采样器?我问是因为我的管道创建失败并出现错误
Vulkan warning: [ParameterValidation], code: 9: vkCreateGraphicsPipelines: returned VK_ERROR_INITIALIZATION_FAILED, indicating that initialization of an object has failed
如果使用此着色器而不是编译到 SPIR-V 中的 GLSL 着色器。我的 GLSL 着色器使用这样的纹理:
layout (binding = 1) uniform sampler2D textureMap;
就 SPIR-V 和 Vulkan 而言,等效的 SPIR-V 应该可以工作。也就是说,您可以有一个图像变量和一个采样器变量,它们都绑定到同一个绑定,并在其上使用 COMBINED_IMAGE_SAMPLER
:
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
descriptor set entries can also be accessed via separate sampler and sampled image shader variables.
和:
It is valid for multiple shader variables to be assigned the same descriptor set and binding values, as long as all those that are statically used by the entry point being compiled are compatible with the descriptor type in the descriptor set layout binding.
组合的 image/sampler 描述符类型与图像和采样器兼容。
当然,这并不意味着您正在使用的验证层知道 ;) 请注意,最后引用来自最近对规范所做的澄清,因此层可能没有正确实现它。
我建议,如果您的代码在其他方面是正确的,请提交错误报告。
layout (binding = 1) uniform sampler2D textureMap;
最好也指定 set
。 KHR_vulkan_glsl默认设置为0,但最好有明确的声明。
如果您使用组合图像图像采样器,则需要使用一个绑定。但是您需要通过布局限定符定义集合编号和绑定编号:
layout( set=S, binding=B ) ...
Here 是使用组合图像采样器的示例。如果需要,您还可以使用单独的采样器和采样图像对象。然后您必须在两个单独的绑定中定义它们并使用两个描述符。但是组合图像采样器描述符在某些平台上可能会有更好的性能。