一: 概述
在Vulkan中,缓冲区是用于存储可以被显卡读取的任意数据的内存区域。它们可以用于存储顶点数据,我们将在本文中进行操作,但它们也可以用于许多其他用途,我们将在后面的文章中探讨。与我们迄今为止处理的Vulkan对象不同,缓冲区不会自动为自己分配内存。前几篇文章的工作表明,Vulkan API将几乎所有事情的控制权交给程序员,而内存管理就是其中之一。
更多内容请参考 一文带你了解GPU编程从入门到精通-CSDN博客
二:缓冲区创建
创建一个新函数 createVertexBuffer,并在 createCommandBuffers 之前从 initVulkan 中调用它。
void initVulkan() {
createInstance();
setupDebugMessenger();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
createRenderPass();
createGraphicsPipeline();
createFramebuffers();
createCommandPool();
createVertexBuffer();
createCommandBuffers();
createSyncObjects();
}
...
void createVertexBuffer() {
}
创建缓冲区需要填充VKBufferCreateInfo结构。
VkBufferCreateInfo bufferInfo{};
bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
bufferInfo.size = sizeof(vertices[0]) * vertices.size();
结构体的第一个字段是size,它指定缓冲区的大小(以字节为单位)。使用sizeof可以直接计算顶点数据的字节大小。
bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
第二个字段是usage,它指示缓冲区中的数据将用于哪些目的。可以使用按位“或”指定多个用途。我们的用例将是一个顶点缓冲区,我们将在以后的章节中看看其他类型的用法。
bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
就像交换链中的图像一样,缓冲区也可以由特定的队列系列拥有,或者同时在多个队列之间共享。本例缓冲区将只从图形队列中使用,因此我们可以实用独占访问。
flags参数用于配置稀疏缓冲区内存,目前与此无关。我们将其保留为默认值0。
现在,我们可以使用vkCreateBuffer创建缓冲区。定义