You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:43:23