指定管线顶点绑定描述,属性描述和输入状态
译者注:示例代码点击此处
当我们想要绘制几何体时,我们准备顶点及其附加属性,如法线向量,颜色或纹理坐标。 这样的顶点数据是由我们任意选择的,因此为了硬件正确使用它们,我们需要指定它们有多少属性,它们如何在内存中布局,或者它们从哪里取出。 此信息通过创建图形管线所需的顶点绑定描述和属性描述提供。
怎么做...
1.创建名为binding_descriptions的std::vector<VkVertexInputBindingDescription>类型变量。
2.在给定管线中使用的每个顶点绑定(绑定到命令缓冲区的一部分作为顶点缓冲区)的binding_descriptions向量中添加单独的条目。 使用以下值初始化其成员:
·binding为绑定的索引
·stride为缓冲区中两个连续元素之间的字节数
·inputRate为指示从给定绑定中读取的属性值是按顶点(vk_vertex_input_rate_vertex)还是按实例(vk_vertex_input_rate_instance)前进的参数。
3.创建名为attribute_descriptions的std::vector<VkVertexInputAttributeDescription>类型的变量。
4.为提供给给定图形管线中的顶点着色器的每个属性添加一个单独的条目到attribute_descriptions向量变量。 使用以下值初始化其成员:
·location为着色器位置,通过该着色器位置在顶点着色器中读取给定属性
·binding为将绑定具有此属性数据源的顶点缓冲区的绑定索引
·format为属性数据的格式
·offset为从绑定中给定元素开始的内存偏移量
5.创建名为vertex_input_state_create_info的VkPipelineVertexInputStateCreateInfo类型的变量。 使用以下值初始化其成员:
1.sType为VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO
2.pNext为nullptr
3.flags为0
4.vertexBindingDescriptionCount为binding_descriptions的成员数量
5.pVertexBindingDescriptions为binding_descriptions的第一个元素的指针
6.vertexAttributeDescriptionCount为attribute_descriptions的成员数量
7.pVertexAttributeDescriptions为attribute_descriptions的第一个元素的指针
这个怎么运作...
顶点绑定定义从绑定到选定索引的顶点缓冲区获取的数据集合。此绑定用作顶点属性的编号数据源。我们可以使用至少16个独立的绑定来绑定不同的顶点缓冲区或同一缓冲区内存的不同部分。
提示:顶点输入状态对于图形管线创建是必需的。
通过绑定描述,我们指定数据的取自何处(从哪个绑定),如何布局(缓冲区中连续元素之间的步幅),以及如何读取该数据(是按顶点还是按实例提取)。
例如,当我们想要使用三个属性 - 三个元素顶点位置,两个元素纹理坐标和三个元素颜色值(从第0个绑定中逐顶点读取)时,我们可以使用以下代码:
std::vector<VkVertexInputBindingDescription> binding_descriptions = {
{
0,
8 * sizeof( float ),
VK_VERTEX_INPUT_RATE_VERTEX
}
};
通过顶点输入描述,我们定义从给定绑定中获取的属性。 对于每个属性,我们需要提供着色器位置(与通过布局( layout(location = <number> ) )限定符定义的着色器源代码中相同),用于给定属性的数据格式以及给定属性开始时的内存偏移量(相对于给定元素的数据开始)。输入描述条目的数目指定在呈现期间使用的属性总数。
在上面的情况中 - 使用三个组件顶点位置,两个组件纹理坐标和三个组件颜色 - 我们可以使用以下代码来指定顶点输入描述:
std::vector<VkVertexInputAttributeDescription> attribute_descriptions = {
{
0,
0,
VK_FORMAT_R32G32B32_SFLOAT,
0
},
{
1,
0,
VK_FORMAT_R32G32_SFLOAT,
3 * sizeof( float )
},
{
2,
0,
VK_FORMAT_R32G32B32_SFLOAT,
5 * sizeof( float )
}
};
有三个属性都取自第0个绑定。 位置被提供给第0位置处的顶点着色器,position是第一个的所以为0没有偏移,第二个texcoords要偏移三个float,而第三个颜色要偏移五个float。
以下代码中提供了此内容的实现:
vertex_input_state_create_info = {
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
nullptr,
0,
static_cast<uint32_t>(binding_descriptions.size()),
binding_descriptions.data(),
static_cast<uint32_t>(attribute_descriptions.size()),
attribute_descriptions.data()
};