Cette publication fournit une traduction du chapitre Vue Image de la section Dessiner un triangle, la sous-section Présentation.
Teneur
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
Vues d'image
Pour utiliser VkImage, nous devons créer un objet VkImageView dans le pipeline graphique. La vue d'image est littéralement un regard dans l'image. Il décrit comment interpréter l'image et quelle partie de l'image sera utilisée.
Dans ce chapitre, nous écrirons une fonction
createImageViews
qui créera une vue d'image de base pour chaque image de la chaîne d'échange à utiliser ultérieurement comme cible de couleur.
Tout d'abord, ajoutez un membre pour contenir les vues d'image:
std::vector<VkImageView> swapChainImageViews;
Créons une fonction
createImageView
et appelons-la juste après avoir créé la chaîne d'échange.
void initVulkan() {
createInstance();
setupDebugMessenger();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
}
void createImageViews() {
}
La première chose que nous allons faire est d'allouer l'espace nécessaire dans le conteneur pour contenir toutes les vues d'image.
void createImageViews() {
swapChainImageViews.resize(swapChainImages.size());
}
Ensuite, créons une boucle qui parcourt toutes les images de la chaîne d'échange.
for (size_t i = 0; i < swapChainImages.size(); i++) {
}
Les paramètres de création de la vue d'image sont transmis à la structure VkImageViewCreateInfo . Les premiers paramètres sont simples.
VkImageViewCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; createInfo.image = swapChainImages[i];
Les champs
viewType
et
format
indiquent comment les données d'image doivent être interprétées. Le paramètre
viewType
vous permet d'utiliser des images comme des textures 1D, 2D, 3D ou des cartes de cube.
createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; createInfo.format = swapChainImageFormat;
Le champ
components
vous permet de changer les canaux de couleur entre eux. Par exemple, nous pouvons lire tous les canaux de couleur uniquement à partir d'un
r
composant, obtenant ainsi une image monochrome. Ou, par exemple, attribuez
1
ou
0
comme constante pour le canal alpha. Ici, nous utiliserons les paramètres par défaut.
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;
Le champ
subresourceRange
décrit la partie de l'image qui sera utilisée. Nos images sont constituées d'une seule couche sans niveau de détail et seront utilisées comme tampon de couleur.
createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
createInfo.subresourceRange.baseMipLevel = 0;
createInfo.subresourceRange.levelCount = 1;
createInfo.subresourceRange.baseArrayLayer = 0;
createInfo.subresourceRange.layerCount = 1;
Si vous travaillez avec des images stéréo, vous devez créer une chaîne d'échange avec plusieurs couches. Ensuite, pour chaque image, créez plusieurs vues d'image avec une image distincte pour chaque œil.
Pour créer la vue image, il reste à appeler la fonction vkCreateImageView :
if (vkCreateImageView(device, &createInfo, nullptr, &swapChainImageViews[i]) != VK_SUCCESS) {
throw std::runtime_error("failed to create image views!");
}
Contrairement aux objets
VkImage
, les vues d'image ont été créées par nous, nous devons donc décrire un cycle similaire pour les détruire avant de quitter le programme:
void cleanup() {
for (auto imageView : swapChainImageViews) {
vkDestroyImageView(device, imageView, nullptr);
}
...
}
La vue de l'image nous suffit pour utiliser l'image comme texture, mais pour utiliser l'image comme cible de rendu, nous devons créer un framebuffer. Mais d'abord, configurons le pipeline graphique.
C ++