1

我正在修改 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;
4

2 回答 2

1

就 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,但最好有明确的声明。

于 2017-08-26T16:13:31.480 回答
-1

如果您使用组合图像图像采样器,则需要使用一个绑定。但是您需要通过布局限定符定义集合号和绑定号:

layout( set=S, binding=B ) ...

是使用组合图像采样器的示例。如果您愿意,您还可以使用单独的采样器和采样图像对象。然后您必须在两个单独的绑定中定义它们并使用两个描述符。但是组合图像采样器描述符在某些平台上可能具有更好的性能。

于 2017-08-26T16:18:30.063 回答