2017-08-26 59 views
0

我正在修改D3D12中用于编译为SPIR-V的HLSL着色器,因为我想在Vulkan中使用相同的着色器代码。这里的着色器:修改HLSL着色器以在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或者我必须使用两个绑定插槽,一个用于质地和一个用于采样?我问,因为我的创作管道失败,错误

福尔康警告:ParameterValidation]代码:9: vkCreateGraphicsPipelines:返回VK_ERROR_INITIALIZATION_FAILED, 指示对象的初始化失败

如果使用该着色器代替编译为SPIR-V的GLSL着色器。我的GLSL着色器使用如下纹理:

layout (binding = 1) uniform sampler2D textureMap; 
+1

流水线创建是否真的失败或只有验证层抱怨失败?也许组合的图像采样器不是问题? – Ekzuzy

+0

@Ekzuzy它也没有验证层失败,所以也许问题在别的地方。 – SurvivalMachine

+0

为了将来的参考,我发现使用该HLSL着色器创建的PSO在AMD(驱动程序17.8.2)上失败,但适用于NVIDIA。也许这是AMD驱动程序的错误。 – SurvivalMachine

回答

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

-1

如果您使用组合图像图像采样器,则需要使用一个绑定。但需要通过布局限定符来限定设置数量和结合数:

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

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