使用SPIRV-Cross提取Vulkan目标HLSL反射数据时拆分顶点输入绑定
问题:将HLSL顶点输入拆分为不同的Vulkan Binding
我正在使用SPIRV-Cross提取面向Vulkan的HLSL着色器的反射数据,相关着色器代码如下:
struct VSInput { [[vk::location(0)]] float2 Pos : POSITION0; [[vk::location(1)]] float3 Color : COLOR0; }; struct UBO { float2x2 transform; }; cbuffer ubo : register(b0) { UBO ubo; } struct VSOutput { float4 Pos : SV_POSITION; [[vk::location(0)]] float3 Color : COLOR0; }; VSOutput main(VSInput input) { VSOutput output = (VSOutput)0; output.Color = input.Color; output.Pos = float4(ubo.transform * input.Pos.xy, 0, 1); return output; }
提取得到的反射数据如下:
Resource { id: 53, type_id: 52, base_type_id: 7, name: "input.Pos" } Float { vecsize: 2, columns: 1, array: [] } Location: Ok(0) Binding: Ok(0) Offset: Ok(0) Resource { id: 57, type_id: 56, base_type_id: 8, name: "input.Color" } Float { vecsize: 3, columns: 1, array: [] } Location: Ok(1) Binding: Ok(0) Offset: Ok(0)
目前顶点输入数据(位置与颜色)处于同一Binding中,请问是否可通过HLSL或shaderc(我当前使用的编译工具)将这两个输入拆分为不同的Binding?
可以实现,直接在HLSL的顶点输入字段上添加[[vk::binding(N)]]属性即可指定不同的绑定编号,无需修改shaderc的编译参数。
修改后的HLSL代码示例:
struct VSInput { [[vk::location(0), vk::binding(0)]] float2 Pos : POSITION0; [[vk::location(1), vk::binding(1)]] float3 Color : COLOR0; }; // 其余代码保持不变
效果说明:
编译后SPIRV-Cross提取的反射数据中,input.Pos的Binding会保持Ok(0),input.Color的Binding变为Ok(1),实现两个顶点输入的Binding拆分。
注意事项:
拆分后需要在Vulkan应用层对应配置两个VkVertexInputBindingDescription,分别对应绑定编号0和1,每个绑定对应一个独立的顶点数据缓冲区;同时配置对应的VkVertexInputAttributeDescription,关联好每个location与对应的binding。
内容的提问来源于stack exchange,提问作者Makogan
相关产品推荐
相关产品推荐

