代码之家  ›  专栏  ›  技术社区  ›  SurvivalMachine

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

  •  1
  • SurvivalMachine  · 技术社区  · 7 年前

    #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警告:[参数验证],代码:9: vkCreateGraphicsPipelines:返回的VK\u ERROR\u INITIALIZATION\u失败, 指示对象初始化失败

    layout (binding = 1) uniform sampler2D textureMap;
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Nicol Bolas    7 年前

    就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,但最好有一个显式语句。

        2
  •  -1
  •   Ekzuzy    7 年前

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

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