Vulkan API — урок 49. Texture image view

Ранее, когда работали над swap chain и буфером кадров, мы видели, что изображения доступны через mage views, но не напрямую. Аналог необходим и для изображения текстуры.

Добавим новый член класса VkImageView для изображения текстуры и создадим функцию createTextureImageView, где создадим его:

VDeleter textureImageView{device, vkDestroyImageView};

...

void initVulkan() {
    ...
    createTextureImage();
    createTextureImageView();
    createVertexBuffer();
    ...
}

...

void createTextureImageView() {

}

Код для этой функции может быть основан непосредственно на createImageViews. Необходимо внести только два изменения,  format  и image:

VkImageViewCreateInfo viewInfo = {};
viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
viewInfo.image = textureImage;
viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
viewInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
viewInfo.subresourceRange.baseMipLevel = 0;
viewInfo.subresourceRange.levelCount = 1;
viewInfo.subresourceRange.baseArrayLayer = 0;
viewInfo.subresourceRange.layerCount = 1;

На этот рас viewInfo.components использоваться не будет, т.к. VK_COMPONENT_SWIZZLE_IDENTITY все равно является определением для 0. Ну а далее идет vkCreateImageView:

if (vkCreateImageView(device, &viewInfo, nullptr, textureImageView.replace()) != VK_SUCCESS) {
    throw std::runtime_error("failed to create texture image view!");
}

Т.к. большая часть логики дублируется, то следующим шагом следует абстрагировать все это в функции createImageView:

void createImageView(VkImage image, VkFormat format, VDeleter& imageView) {
    VkImageViewCreateInfo viewInfo = {};
    viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
    viewInfo.image = image;
    viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
    viewInfo.format = format;
    viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
    viewInfo.subresourceRange.baseMipLevel = 0;
    viewInfo.subresourceRange.levelCount = 1;
    viewInfo.subresourceRange.baseArrayLayer = 0;
    viewInfo.subresourceRange.layerCount = 1;

    if (vkCreateImageView(device, &viewInfo, nullptr, imageView.replace()) != VK_SUCCESS) {
        throw std::runtime_error("failed to create texture image view!");
    }
}

Функция createTextureImageView теперь может упрощена просто до безобразия:

void createTextureImageView() {
    createImageView(textureImage, VK_FORMAT_R8G8B8A8_UNORM, textureImageView);
}

Функция createImageViews:

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

    for (uint32_t i = 0; i < swapChainImages.size(); i++) {
        createImageView(swapChainImages[i], swapChainImageFormat, swapChainImageViews[i]);
    }
}

Main Admin

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

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