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

Vulkan顶点输入绑定编号在着色器的设置位置及非0场景咨询

Vulkan顶点输入绑定编号相关问题

问题背景

我正在学习Vulkan,尝试像设置Uniform Buffer一样在顶点着色器中设置顶点输入的绑定编号,相关代码如下:

C++ 代码(使用vulkan.hpp)

vk::VertexInputBindingDescription binding;
binding.setBinding(0)
       .setInputRate(vk::VertexInputRate::eVertex)
       .setStride(sizeof(Vertex));

着色器代码

layout(location = 0, binding = 0) in vec3 position;

编译时出现以下错误:

'binding' : requires uniform or buffer storage qualifier
'binding' : requires block, or sampler/image, or atomic-counter type

如果不在着色器中设置binding则可正常运行。现咨询两个问题:

  1. 与C++代码中VkVertexInputBindingDescription.binding对应的顶点输入绑定编号应在着色器的何处设置?
  2. VkVertexInputBindingDescription的binding可设为1或其他非0值的场景是什么?

解答

1. 顶点输入绑定编号的正确设置位置

顶点输入的绑定编号不需要在着色器中通过binding布局限定符设置,它是通过C++代码中的VkVertexInputAttributeDescription与VkVertexInputBindingDescription关联的:

  • 在C++代码中,你需要创建VkVertexInputAttributeDescription结构体,通过setBinding(绑定编号)和setLocation(属性位置)来关联顶点数据的属性和绑定。
  • 着色器中只需要用layout(location = X) in ...指定属性的位置即可,binding限定符是给Uniform Buffer、采样器等资源设计的,顶点输入属性不支持该限定符,这也是你编译报错的核心原因。

正确关联的代码示例:

// 顶点属性描述:将location 0与绑定0关联
vk::VertexInputAttributeDescription attr;
attr.setLocation(0)
    .setBinding(0)
    .setFormat(vk::Format::eR32G32B32Sfloat)
    .setOffset(offsetof(Vertex, position));

对应的着色器代码:

layout(location = 0) in vec3 position;

2. 绑定编号设为非0值的场景

当你需要使用多组顶点输入绑定时,就需要设置非0的绑定编号,常见场景包括:

  • 实例化渲染:比如静态顶点数据(位置、法线)用绑定0(输入速率eVertex),每帧更新的实例数据(模型矩阵、实例颜色)用绑定1(输入速率eInstance),两者分别对应不同的顶点缓冲区。
  • 拆分顶点数据:将顶点的不同属性拆分到多个缓冲区(比如位置数据在一个缓冲区,纹理坐标在另一个),每个缓冲区对应一个独立的绑定编号,通过不同的VkVertexInputBindingDescription配置步长和输入速率,再用属性描述关联到对应绑定。

内容的提问来源于stack exchange,提问作者tsogzark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:02:09