Publikasi ini menyediakan terjemahan bab Tampilan gambar dari bagian Menggambar segitiga, subbagian Presentasi.
Kandungan
1.
2.
3.
4.
5.
6. Uniform-
7.
8.
9.
10. -
11. Multisampling
FAQ
2.
3.
4.
-
-
- Window surface
- Swap chain
- Image views
- (pipeline)
5.
- Staging
6. Uniform-
- layout
- sets
7.
- Image view image sampler
- 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 ++