从`VkVertexInputBindingDescription`中绑定`的目的是什么?

时间:2016-11-06 14:20:22

标签: c++ vulkan

https://www.khronos.org/registry/vulkan/specs/1.0/man/html/VkVertexInputBindingDescription.html

  
      
  • binding是此结构描述的绑定号。
  •   

我不确定这意味着例如来自https://github.com/SaschaWillems/Vulkan/blob/master/triangle/triangle.cpp

#version 450

#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enable

layout (location = 0) in vec3 inPos;
layout (location = 1) in vec3 inColor;

layout (binding = 0) uniform UBO 
{
    mat4 projectionMatrix;
    mat4 modelMatrix;
    mat4 viewMatrix;
} ubo;

layout (location = 0) out vec3 outColor;

out gl_PerVertex 
{
    vec4 gl_Position;   
};


void main() 
{
    outColor = inColor;
    gl_Position = ubo.projectionMatrix * ubo.viewMatrix * ubo.modelMatrix * vec4(inPos.xyz, 1.0);
}

并且顶点着色器看起来像这样

binding

为什么binding 0?什么时候它的值不是0? void vkCmdBindVertexBuffers( VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets); 的目的是什么?

我的第一个想法是它可能是glsl https://www.opengl.org/wiki/Layout_Qualifier_(GLSL)#Binding_points中的特殊限定符。

但这似乎不适用于顶点输入限定符。

更新

我想我已经弄清楚绑定的目的是什么

binding

我假设您可以拥有一个支持状态的管道,但它仍然可以更改顶点输入布局,以便每个管道可以有不同的着色器。

然后public class Profile { public int id {get;set;} public List<GufBeProfile> Gufim {get;set;} } public class GufBeProfile { public int Id {get;set;} public Guf Guf {get;set;} public Profile Profile {get;set;} public List<HarshaaBeModule> Harshaaot {get;set;} } public class HarshhaBeModule { public int id{get;set;} public Harshaa Harshaa {get;set;} public Module Module {get;set;} } 只是一个唯一的标识符来改变顶点布局&#34;在飞行中&#34;。

1 个答案:

答案 0 :(得分:5)

  

我想我已经弄清楚绑定的目的是什么

不,你没有,但你接近它。

缓冲区绑定与在OpenGL中使用separate attribute formats时的含义相同。有属性位置,有缓冲区绑定索引。每个属性位置都有一个格式和偏移量,用于定义如何解释其数据。但它还必须有一种方法来说明它使用的缓冲区。

在Vulkan中,特定管道的属性及其格式是不可变的。管道的属性格式在创建时建立,不能更改。但是, buffers 这些属性来自可变状态。它们不是在管道创建时固定的。

binding是由pBuffers绑定的vkCmdBindVertexBuffers数组的索引。每个顶点属性都有一个binding,表示属性从中获取数据的缓冲区绑定索引。但是在创建时未指定缓冲区本身。您可以使用vkCmdBindVertexBuffers动态设置它。

因此,属性的binding值为equivalent to the binding value you provide to glVertexAttribBinding.