Esta publicação fornece uma tradução do capítulo Visualização da imagem da seção Desenhando um triângulo, a subseção Apresentação.
Contente
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
Visualizações de imagens
Para usar VkImage, temos que criar um objeto VkImageView no pipeline de gráficos. A visualização da imagem é literalmente uma olhada na imagem. Descreve como interpretar a imagem e que parte da imagem será usada.
Neste capítulo, escreveremos uma função
createImageViews
que criará uma visualização de imagem de base para cada imagem na cadeia de troca para ser usada como um destino de cor posteriormente.
Em primeiro lugar, adicione um membro para manter as visualizações da imagem:
std::vector<VkImageView> swapChainImageViews;
Vamos criar uma função
createImageView
e chamá-la logo após criar a cadeia de troca.
void initVulkan() {
createInstance();
setupDebugMessenger();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
}
void createImageViews() {
}
A primeira coisa que faremos é alocar o espaço necessário no contêiner para conter todas as visualizações da imagem.
void createImageViews() {
swapChainImageViews.resize(swapChainImages.size());
}
A seguir, vamos criar um loop que atravessa todas as imagens da cadeia de troca.
for (size_t i = 0; i < swapChainImages.size(); i++) {
}
Os parâmetros para criar a visualização da imagem são passados para a estrutura VkImageViewCreateInfo . Os primeiros parâmetros são diretos.
VkImageViewCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; createInfo.image = swapChainImages[i];
Os campos
viewType
e
format
indicam como os dados da imagem devem ser interpretados. O parâmetro
viewType
permite que você use imagens como texturas 1D, 2D, 3D ou mapas de cubo.
createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; createInfo.format = swapChainImageFormat;
O campo
components
permite que você alterne os canais de cores entre eles. Por exemplo, podemos ler todos os canais de cores apenas de um
r
componente, obtendo assim uma imagem monocromática. Ou, por exemplo, atribua
1
ou
0
como uma constante para o canal alfa. Aqui, usaremos as configurações padrão.
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;
O campo
subresourceRange
descreve qual parte da imagem será usada. Nossas imagens consistem em apenas 1 camada sem níveis de detalhes e serão usadas como um buffer de cor.
createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
createInfo.subresourceRange.baseMipLevel = 0;
createInfo.subresourceRange.levelCount = 1;
createInfo.subresourceRange.baseArrayLayer = 0;
createInfo.subresourceRange.layerCount = 1;
Se você estiver trabalhando com imagens estéreo, precisará criar uma cadeia de troca com várias camadas. Em seguida, para cada imagem, crie várias visualizações de imagem com uma imagem separada para cada olho.
Para criar a visualização da imagem, resta chamar a função vkCreateImageView :
if (vkCreateImageView(device, &createInfo, nullptr, &swapChainImageViews[i]) != VK_SUCCESS) {
throw std::runtime_error("failed to create image views!");
}
Ao contrário dos objetos
VkImage
, as visualizações de imagens foram criadas por nós, portanto, precisamos descrever um ciclo semelhante para destruí-los antes de sair do programa:
void cleanup() {
for (auto imageView : swapChainImageViews) {
vkDestroyImageView(device, imageView, nullptr);
}
...
}
A visualização da imagem é suficiente para usarmos a imagem como uma textura, mas para usar a imagem como destino de renderização, precisamos criar um framebuffer. Mas primeiro, vamos configurar o pipeline gráfico.
C ++