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