Vulkan. Panduan pengembang. Tampilan gambar

Siapa lagi yang tidak mengenal saya, saya adalah penerjemah teknis dari CGTribe perusahaan Izhevsk, dan saya menerjemahkan manual untuk Vulkan API ( vulkan-tutorial.com ).



Publikasi ini menyediakan terjemahan bab Tampilan gambar dari bagian Menggambar segitiga, subbagian Presentasi.



Kandungan
1.



2.



3.



4.







  1. (pipeline)


5.



  1. Staging


6. Uniform-



  1. layout
  2. sets


7.



  1. Image view image sampler
  2. image sampler


8.



9.



10. -



11. Multisampling



FAQ









Tampilan gambar



Untuk menggunakan VkImage, kita harus membuat objek VkImageView di pipeline grafis. Tampilan gambar secara harfiah adalah melihat ke dalam gambar. Ini menjelaskan bagaimana menafsirkan gambar dan bagian gambar mana yang akan digunakan.



Pada bab ini, kita akan menulis fungsi createImageViews



yang akan membuat tampilan gambar dasar untuk setiap gambar dalam rantai swap untuk digunakan sebagai target warna nanti.



Pertama-tama, tambahkan anggota untuk memegang tampilan gambar:



std::vector<VkImageView> swapChainImageViews;
      
      





Mari buat fungsi createImageView



dan panggil tepat setelah membuat rantai swap.



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

void createImageViews() {

}
      
      





Hal pertama yang akan kita lakukan adalah mengalokasikan ruang yang diperlukan dalam wadah untuk menampung semua tampilan gambar.



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

}
      
      





Selanjutnya, mari buat loop yang melintasi semua gambar dari rantai swap.



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

}
      
      





Parameter untuk membuat tampilan gambar diteruskan ke struktur VkImageViewCreateInfo . Beberapa parameter pertama sangat mudah.



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





Kolom viewType



dan format



menunjukkan bagaimana data gambar harus diinterpretasikan. Parameter viewType



memungkinkan Anda untuk menggunakan gambar sebagai peta 1D, 2D, 3D atau kubus.



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





Bidang ini components



memungkinkan Anda untuk beralih saluran warna di antara mereka sendiri. Misalnya, kita dapat membaca semua saluran warna hanya dari sebuah r



komponen, dengan demikian mendapatkan gambar monokrom. Atau, misalnya, tetapkan 1



atau 0



sebagai konstanta untuk saluran alfa. Di sini kita akan menggunakan pengaturan default.



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;
      
      





Bidang tersebut subresourceRange



menjelaskan bagian gambar mana yang akan digunakan. Gambar kami hanya terdiri dari 1 lapisan tanpa tingkat detail dan akan digunakan sebagai penyangga warna.



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





Jika Anda bekerja dengan gambar stereo, Anda perlu membuat rantai pertukaran dengan banyak lapisan. Kemudian untuk setiap gambar buat beberapa tampilan gambar dengan gambar terpisah untuk setiap mata.



Untuk membuat tampilan gambar, tetap memanggil fungsi vkCreateImageView :



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





Tidak seperti objek VkImage



, tampilan gambar dibuat oleh kami, jadi kami perlu mendeskripsikan siklus serupa untuk menghancurkannya sebelum keluar dari program:



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

    ...
}
      
      





Tampilan gambar sudah cukup bagi kita untuk menggunakan gambar sebagai tekstur, tetapi untuk menggunakan gambar sebagai target render, kita perlu membuat framebuffer. Tapi pertama-tama, mari kita siapkan pipeline grafis.



C ++



All Articles