Vulkan. Guide du développeur. Vue de l'image

Qui d'autre ne me connaît pas, je suis traducteur technique de la société Izhevsk CGTribe et je traduis le manuel de l'API Vulkan ( vulkan-tutorial.com ).



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.







  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









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



All Articles