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则可正常运行。现咨询两个问题:
- 与C++代码中
VkVertexInputBindingDescription.binding对应的顶点输入绑定编号应在着色器的何处设置? 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
相关产品推荐
相关产品推荐

