我正在修改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,指示对象初始化失败
如果使用此着色器而不是GLSL着色器编译成SPIR-V。我的GLSL着色器使用这样的纹理:
layout (binding = 1) uniform sampler2D textureMap;
发布于 2017-08-26 08:13:31
就SPIR-V和Vulkan而言,SPIR-V当量应该起作用.也就是说,您可以有一个图像变量和一个样本变量,这两个变量都绑定到相同的绑定中,并在其上使用COMBINED_IMAGE_SAMPLER
:
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
描述符集项也可以通过单独的采样器和采样图像着色器变量访问。
以及:
为多个着色器变量分配相同的描述符集和绑定值是有效的,只要被编译的入口点静态使用的所有变量都与描述符集布局绑定中的描述符类型兼容。
组合的图像/采样器描述符类型与图像和采样器兼容。
当然,这并不意味着您所使用的验证层知道这一点;)注意,最后的引用来自最近对规范的澄清,因此层可能没有正确地实现它。
我建议,如果您的代码在其他方面是正确的,请在其上提交错误报告。
布局(绑定= 1)均匀sampler2D textureMap;
指定set
也是个好主意。KHR_vulkan_glsl默认设置为0,但最好有一个显式语句。
发布于 2017-08-26 08:18:30
如果您使用的组合图像图像采样器,您需要使用一个绑定。但是,您需要通过布局限定符同时定义设置号和绑定号:
layout( set=S, binding=B ) ...
这里是使用组合图像采样器的一个例子。如果需要,还可以使用单独的取样器和采样图像对象。然后,必须在两个单独的绑定中定义它们,并使用两个描述符。但是,组合图像采样器描述符在某些平台上可能具有更好的性能。
https://stackoverflow.com/questions/45897279
复制相似问题