初めてのVulkanプログラミング step4 イメージビュー


目次に戻る

ソースコードは以下の場所に置いておきます。各自のバージョンに合わせたプロパティ設定をしてから自由にご利用ください。

GitHub

はじめに

Imageオブジェクトは、プログラムが直接読み書きできません。その代わりに、ImageViewを使います。

VkImageの取得

Vkimageは、ウィンドウをに直接表示する画像です
スワップチェーンからイメージを取得するには、vkGetSwapchainImagesKHRを使う必要があります。

void Window::_InitSwapchainImages()
{
    std::vector<VkImage> _swapchain_Image;
    std::vector<VkImageView> _swapchain_image_view;
    vkGetSwapchainImagesKHR(device, _swapchain, &_swapchain_image_count, nullptr);


    _swapchain_Image.resize(_swapchain_image_count);
    _swapchain_image_view.resize(_swapchain_image_count);
    vkGetSwapchainImagesKHR(device, _swapchain, &_swapchain_image_count, _swapchain_Image.data());

VKImageViewの作成

VkImageをレンダーパスで使えるようにするには、VKImageViewを作成する必要があります。
イメージを1Dテクスチャー、2Dテクスチャーで扱うといったように、VKImageViewは、どのようにイメージにアクセスするか指定します。



    for (int i = 0; i < _swapchain_image_count; i++) {
        VkImageViewCreateInfo image_view_create_info{};

        image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
        image_view_create_info.pNext = nullptr;
        image_view_create_info.flags = 0;
        image_view_create_info.image = _swapchain_Image[i];

viewtypeformatで画像の取り扱い方法を指定します。
componentsを指定することで、任意の色だけ取り出すことができます。
今回は任意の色だけ取り出すことを考えていないので、componentsの値はデフォルトにします。


        image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
        image_view_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
        image_view_create_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
        image_view_create_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
        image_view_create_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
        image_view_create_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;

subresourceRangeは、画像の目的が何で、画像のどの部分にアクセスするべきか示しています
aspectMask...Imageから取得するデータを明示します。

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

imageViewCreateInfo完成したのでvkCreateImageView関数を呼び出します。


        vkCreateImageView(_renderer->GetVulkanDevice(), &image_view_create_info, nullptr, &_swapchain_image_view[i]);
    }
}

イメージビューの除去

イメージビュー、明示的に作成されたものであるため、プログラムが終了時に破棄する必要があります


void Window::_DeInitSwapchainImages()
{
    for (auto view : _swapchain_image_view) {
        vkDestroyImageView(_renderer->GetVulkanDevice(),view,nullptr);
    }
}

終わりに

次回からは、グラフィクスパイプラインといった、まったく新しい概念に触れていきます。

連絡先

tweeter: tositada_nakada
mail: [email protected]

寄付

paypal: tositada_nakada
Amazon:欲しいものリスト