LoginSignup
0
0

Vulkan Tutorial (Drawing a triangle/Presentation/Image views) 日本語訳

Posted at

この記事は Image views - Vulkan Tutorial の日本語訳です。

Image views

スワップチェイン内のものを含む、どのVkImageでも、レンダーパイプライン中で使うためにはVkImageViewオブジェクトを作成する必要があります。イメージビューは文字通り画像へのビューです。これは画像へアクセスする方法と、画像のどの部分にアクセスするかを記述します。例えば、ミップマップ無しの2Dテクスチャとして扱うべき、などです1

この章ではcreateImageViews関数を追加して、スワップチェインの画像全てに対してイメージビューを作成し、それらを後でカラーターゲットとして使えるようにします。

はじめに、イメージビューを格納するメンバ変数を追加します。

std::vector<VkImageView> swapChainImageViews;

createImageViews関数を作成し、スワップチェイン作成の直後に呼び出すようにします。

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

void createImageViews() {

}

最初にやらなければいけないことは、作成するイメージビューの数に合うようにリストをリサイズすることです。

void createImageViews() {
    swapChainImageViews.resize(swapChainImages.size());

}

次に、スワップチェインの画像全てを巡回するように、ループを準備します。

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

}

イメージビューを作成するためのパラメータは、VkImageViewCreateInfo構造体の中で指定されます。最初のいくつかのパラメータは簡単です。

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

viewTypeformatフィールドは、画像データをどのように解釈するべきかを指定します。viewTypeパラメータによって、画像を1Dテクスチャ、2Dテクスチャ、3Dテクスチャ、あるいはキューブマップとして扱うことができます。

createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
createInfo.format = swapChainImageFormat;

componentsフィールドでは、カラーチャンネルのスウィズルをすることができます。例えば、全てのチャンネルを赤のチャンネルにマッピングして、モノクロのテクスチャにすることができます。また、チャンネルに01の定数をマッピングすることもできます。私たちは、デフォルトのマッピングを採用します。

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立体視アプリケーションを開発しているなら、マルチレイヤーありでスワップチェインを作成しているでしょう。その場合、異なるレイヤーにアクセスすることで、左右の目の視野を表現した画像それぞれに対してイメージビューを作成することができます。

イメージビューを作成するのに、あとはvkCreateImageViewを呼び出すだけです。

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

画像とは違い、イメージビューは我々が明示的に作成したので、それらを破棄するための似たようなループを、プログラムの最後に追加する必要があります。

void cleanup() {
    for (auto imageView : swapChainImageViews) {
        vkDestroyImageView(device, imageView, nullptr);
    }

    ...
}

イメージビューは、画像をテクスチャとして使いはじめるには十分ですが、レンダーターゲットとして使うためにはまだ準備が整っていません。そのためには、フレームバッファとして知られる、もう一段階の間接的なステップが必要です。しかし、その前にグラフィックスパイプラインをセットアップする必要があります。

C++ code

次の記事
前の記事

  1. この部分、原文では"for example if it should be treated as a 2D texture depth texture without any mipmapping levels."となっているが、"2D texture depth texture"の意味がよくわからない。仕方がないので単に「2Dテクスチャ」と訳した。

0
0
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
0
0