修改 HLSL 着色器以在 Vulkan 中工作,是否必须分离纹理/采样器?

生存机器

我正在修改 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 警告:[ParameterValidation],代码:9:vkCreateGraphicsPipelines:返回 VK_ERROR_INITIALIZATION_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 描述符集条目也可以通过单独的采样器和采样图像着色器变量访问。

和:

为多个着色器变量分配相同的描述符集和绑定值是有效的,只要被编译的入口点静态使用的所有那些都与描述符集布局绑定中的描述符类型兼容。

组合图像/采样器描述符类型与图像和采样器兼容。

当然,这并不意味着您正在使用的验证层知道这一点 ;) 请注意,最后引用来自最近对规范的澄清,因此层可能没有正确实现它。

我建议,如果您的代码在其他方面是正确的,请提交一份错误报告。


layout (binding = 1) uniform sampler2D textureMap;

指定set总是一个好主意KHR_vulkan_glsl 默认设置为 0,但最好有明确的声明。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章