Vulkan. Guía del desarrollador. Vista de imagen

Quién más no está familiarizado conmigo, soy un traductor técnico de la empresa CGTribe de Izhevsk, y estoy traduciendo el manual para la API de Vulkan ( vulkan-tutorial.com ).



Esta publicación proporciona una traducción del capítulo Vista de imágenes de la sección Dibujar un triángulo, la subsección Presentación.



Contenido
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









Vistas de imagen



Para usar VkImage, tenemos que crear un objeto VkImageView en la canalización de gráficos. La vista de imagen es literalmente una mirada a la imagen. Describe cómo interpretar la imagen y qué parte de la imagen se utilizará.



En este capítulo, escribiremos una función createImageViews



que creará una vista de imagen base para cada imagen en la cadena de intercambio que se utilizará como objetivo de color más adelante.



En primer lugar, agregue un miembro para mantener las vistas de imágenes:



std::vector<VkImageView> swapChainImageViews;
      
      





Creemos una función createImageView



y llamémosla justo después de crear la cadena de intercambio.



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

void createImageViews() {

}
      
      





Lo primero que haremos será asignar el espacio necesario en el contenedor para contener todas las vistas de imágenes.



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

}
      
      





A continuación, creemos un bucle que atraviese todas las imágenes de la cadena de intercambio.



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

}
      
      





Los parámetros para crear la vista de imagen se pasan a la estructura VkImageViewCreateInfo . Los primeros parámetros son sencillos.



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





Los campos viewType



y format



indican cómo se deben interpretar los datos de la imagen. El parámetro le viewType



permite utilizar imágenes como texturas 1D, 2D, 3D o mapas de cubos.



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





El campo le components



permite cambiar los canales de color entre ellos. Por ejemplo, podemos leer todos los canales de color solo de un r



componente, obteniendo así una imagen monocromática. O, por ejemplo, asigne 1



o 0



como constante para el canal alfa. Aquí usaremos la configuración predeterminada.



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;
      
      





El campo subresourceRange



describe qué parte de la imagen se utilizará. Nuestras imágenes constan de una sola capa sin niveles de detalle y se utilizarán como búfer de color.



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 está trabajando con imágenes estéreo, necesita crear una cadena de intercambio con múltiples capas. Luego, para cada imagen, cree varias vistas de imagen con una imagen separada para cada ojo.



Para crear la vista de imagen, queda llamar a la función vkCreateImageView :



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





A diferencia de los objetos VkImage



, las vistas de imágenes las creamos nosotros, por lo que necesitamos describir un ciclo similar para destruirlas antes de salir del programa:



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

    ...
}
      
      





La vista de la imagen es suficiente para que usemos la imagen como textura, pero para usar la imagen como el objetivo de renderizado, necesitamos crear un framebuffer. Pero primero, configuremos la canalización de gráficos.



C ++



All Articles