Vulkan创建缓冲区
缓冲区是最简单的资源,因为它们代表仅通过线性形式存储在内存中的数据,就像C/C++中的数组。

缓冲区有各式各样的用途,在通道中通过描述符可以将后备数据存储空间设置为统一缓冲区(uniform buffer)、存储空间缓冲区或纹素缓冲区等。缓冲区可以作为顶点索引和属性的源数据,也可以作为将数据从CPU传输给GPU的暂存资源(暂存存储空间)。要使用这些用法,需要创建缓冲区并设置它的用途。
具体处理过程
(1)获取已创建逻辑设备的句柄,将该句柄存储在一个VkDevice类型的变量中,将该变量命名为logical_device。
(2)创建一个VkDeviceSize类型的变量,将其命名为size,该变量用于代表缓冲区的尺寸(单位为字节)。
(3)本例使用理想的缓冲区存储条件,创建一个VkBufferUsageFlags类型的位域变量,将其命名为usage。将想要使用的所有缓冲区用法的逻辑或运算结果存储到该变量中。
(4)创建一个VkBufferCreateInfo类型的变量,将其命名为buffer_create_info。将下列值赋予该变量中的各个成员。
● 将VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO赋予sType成员。
● 将nullptr赋予pNext成员。
● 将flags成员的值设置为0。
● 将size变量的值赋予size成员。
● 将usage变量的值赋予usage成员。
● 将sharingMode成员的值设置为VK_SHARING_MODE_EXCLUSIVE。
● 将queueFamilyIndexCount成员的值设置为0。
● 将nullptr赋予pQueueFamilyIndices成员。
(5)创建一个VkBuffer类型的变量,将其命名为buffer,该变量用于存储缓冲区的句柄。
(6)调用vkCreateBuffer(logical_device,&buffer_create_info,nullptr,&buffer)
函数。将第一个参数设置为逻辑设备的句柄;将第二个参数设置为指向buffer_create_info变量的指针;将第三个参数设置为nullptr;将第四个参数设置为指向buffer变量的指针。
(7)通过查明该函数调用操作的返回值等于VK_SUCCESS,确认该函数调用操作成功完成。
具体运行情况
在创建缓冲区前,需要知道应创建多大的缓冲区和该缓冲区的用途。缓冲区的尺寸是由其中存储数据的数量决定的。我们编写的应用程序使用缓冲区的所有方式,都是通过缓冲区的用法设定的。我们无法通过没有在创建缓冲区过程中定义的用法使用缓冲区。
TIP 只能通过在创建缓冲区过程中定义的用法(用途)使用缓冲区。
下面是缓冲区的各种用法:
● 使用VK_BUFFER_USAGE_TRANSFER_SRC_BIT标志值可以设定将缓冲区作为复制操作的源数据。
● 使用VK_BUFFER_USAGE_TRANSFER_DST_BIT标志值可以设定将数据复制到缓冲区中。
● 使用VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT标志值可以设定在着色器中将缓冲区作为统一纹素缓冲区。
● 使用VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT标志值可以设定在着色器中将缓冲区作为纹素存储缓冲区。
● 使用VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT标志值可以设定在着色器中将缓冲区作为统一变量(uniform variable)赋值数据源。
● 使用VK_BUFFER_USAGE_STORAGE_BUFFER_BIT标志值可以设定将数据存储到着色器的缓冲区中。
● 使用VK_BUFFER_USAGE_INDEX_BUFFER_BIT标志值可以设定在绘制过程中将缓冲区作为顶点索引的数据源。
● 使用VK_BUFFER_USAGE_VERTEX_BUFFER_BIT标志值可以设定将缓冲区作为在绘制过程中设置的顶点属性的数据源。
● 使用VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT标志值可以设定缓冲区能够存储在间接绘制过程中使用的数据。
要创建缓冲区,需要先创建一个VkBufferCreateInfo类型的变量,通过该变量提供下列数据。

size和usage变量分别定义了缓冲区的容量和在编写的应用程序中的用途。
赋予sharingMode成员的VK_SHARING_MODE_EXCLUSIVE是非常重要的参数,通过该参数可以设定来自多个家族的队列是否可以同时访问该缓冲区。独占共享模式(Exclusive sharing mode)会告诉驱动程序,同一时刻缓冲区只能由来自一个家族的队列引用。如果想要在已提交给另一个家族中队列的命令中使用该缓冲区,就必须通过显式方式设置告诉驱动程序缓冲区所有权更改的时间(将缓冲区的所有权从一个家族转送给另一个家族)。这种灵活选项可以提高性能,但会增加编程工作量。
我们可以设置VK_SHARING_MODE_CONCURRENT共享模式,当使用该模式时,来自多个家族的多个队列可以同时访问一个缓冲区,而且我们不需要安排缓冲区所有权的转接。但这样做的代价是这种并发访问方式可能会降低性能。
准备好用于创建缓冲区的数据后,就可以使用下列代码创建缓冲区。

酷客网相关文章:
评论前必须登录!
注册