Vulkan API — урок 34. Создание буфера вершин

Буферы в Vulkan’е являются областями памяти, используемыми для хранения данных произвольных данных, которые могут быть прочитаны видеокартой. Они могут быть использованы для хранения данных вершин, которые нам сейчас нужны, но они могут быть использованы и для множества других целей, которые мы еще чутка затроним в дальнейшем. В отличии от объектов Vulkan, с которыми мы имели дело ранее, буферы не способны автоматически выделять память для себя.

Создадим новую функцию createVertexBuffer и вызовем её из initVulkan, перед createCommandBuffers.

void initVulkan() {
    createInstance();
    setupDebugCallback();
    createSurface();
    pickPhysicalDevice();
    createLogicalDevice();
    createSwapChain();
    createImageViews();
    createRenderPass();
    createGraphicsPipeline();
    createFramebuffers();
    createCommandPool();
    createVertexBuffer();
    createCommandBuffers();
    createSemaphores();
}

...

void createVertexBuffer() {

}

Для создание буфера нужно заполнить структуру VkBufferCreateInfo.

Параметр size определяет размер буфера в байтах, и определяется при помощи простого sizeof:

VkBufferCreateInfo bufferInfo = {};
bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
bufferInfo.size = sizeof(vertices[0]) * vertices.size();

Далее идет usage, который определяет для каких целей данные буфера будут использоваться (можно указать несколько целей, используя побитовое ИЛИ):

bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;

Аналогично изображениям в swap chain, буферы могут так же принадлежать одной или нескольким семействам очередей. Текущей буфер будет использоваться только из графической очереди, так что будем придерживаться эксклюзивного доступа.

Параметр flags используется для настройки разреженности памяти буфера, что нас не интересует, потому значение оставим по умолчанию, 0.

Теперь можно создать буфер, используя vkCreateBuffer. И не забудем про VDeleter:

VDeleter<VkBuffer> vertexBuffer{device, vkDestroyBuffer};

...

void createVertexBuffer() {
    VkBufferCreateInfo bufferInfo = {};
    bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
    bufferInfo.size = sizeof(vertices[0]) * vertices.size();
    bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
    bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;

    if (vkCreateBuffer(device, &bufferInfo, nullptr, vertexBuffer.replace()) != VK_SUCCESS) {
        throw std::runtime_error("failed to create vertex buffer!");
    }
}

Буфер был создан, урок получился коротеньким. Но фактически буфер не умеет работать с памятью, о чем и будет следующий урок.

Main Admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *