LoginSignup
1
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-02-08

目次に戻る

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

GitHub

はじめに

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

vkimage.JPG

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: nakadasanda@outlook.com

寄付

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2