Vulkan API — урок 19. Image views

Для использования VkImage, включая содержимое swap chain, в цепочке рендеринга, мы создаем объект VkImageView. Image view это, грубо говоря, прообраз изображения (An image view is quite literally a view into an image), или же скорее вид изображения, образ изображения. Оно описывает как получить доступ к картинке и к какой именно части картинки, к примеру если она должна обрабатываться как 2D текстура глубиной в саму текстуру без каких либо уровней мип-мапинга.

В этом уроке мы напишем функцию createImageViews, которая создает базовое изображение для каждого изображения в swap chain, так что мы сможем позже использовать для управления цветом (color targets).

Для начала добавим член класса для хранения image views. Объекты VkImageView, не похожи в этом плане на VkImage, ведь создаем вручную, потому и сами должны обеспечить очистку:

std::vector<VDeleter<VkImageView>> swapChainImageViews;

Создадим функцию createImageViews и напишем её вызов после создания swap chain:

void initVulkan() {
    createInstance();
    setupDebugCallback();
    createSurface();
    pickPhysicalDevice();
    createLogicalDevice();
    createSwapChain();
    createImageViews();
}

void createImageViews() {

}

В самом методе нам нужно изменить размер списка, что бы он вмещал все создаваемые нами image views. Так же определим функцию удаления.

void createImageViews() {
    swapChainImageViews.resize(swapChainImages.size(), VDeleter<VkImageView>{device, vkDestroyImageView});
    
}

Функция resize инициализирует все элементы списка с правильным VDeleter. Далее в цикле пройдемся по всем изображениям swap chain:

for (uint32_t i = 0; i < swapChainImages.size(); i++) {

}

Параметры для создания  image view определяются в структуре VkImageViewCreateInfo, первые несколько параметров которой и так понятны.

VkImageViewCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
createInfo.image = swapChainImages[i];

Поля viewType и format определяют как изображение должно быть интерпретировано. viewType позволяет нам обрабатывать изображение как 1D, 2D, 3D текстуру или кубические текстуры

createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;

Поле components позволяет смешения цветовых каналов. К примеру, в можете указать всем каналам на красный канал для создания монохромной текстуры. Так же возможно указать значения 0 и 1 на канал. Но мы будем использовать все по умолчанию:

createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;

Поле subresourceRange описывает назначение изображения и какая его часть должны быть доступны. Наши изображения будут использоваться для управления цветом без какого либо мип-маппинга или множественных слоев.

createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
createInfo.subresourceRange.baseMipLevel = 0;
createInfo.subresourceRange.levelCount = 1;
createInfo.subresourceRange.baseArrayLayer = 0;
createInfo.subresourceRange.layerCount = 1;

Если вы работаете над стереографическим 3D приложением, то создавайте swap chain с несколькими слоями. Затем вы можете создать image views для каждого изображения и показывать views для каждого глаза по вашему условию.

Для создение image view осталось вызвать vkCreateImageView:

if (vkCreateImageView(device, &createInfo, nullptr, swapChainImageViews[i].replace()) != VK_SUCCESS) {
    throw std::runtime_error("failed to create image views!");
}

Итак, теперь стоит запустить программу для проверки исправности создания и удаления.

Создание прообраза изображения достаточно, что бы начать использовать изображение в качестве текстуры, но этого не достаточно, что бы использовать в качестве цели рендеринга. Для этого потребуется разобраться с тем, что такое framebuffer и настроить графический конвейер.

Main Admin

One Comment

  1. Здравствуйте,
    вы забыли указать что в поле format нужно указывать тот же формат что и при создании swap chain.Вы на предыдущем уроке сделали его членом класса (swapChainImageFormat).Если этого не сделать то в консоли будут сообщения об ошибке.

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

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