Vulkan. Guia do desenvolvedor. Vista de imagem

Quem mais não me conhece, sou um tradutor técnico da empresa Izhevsk CGTribe e estou traduzindo o manual da API Vulkan ( vulkan-tutorial.com ).



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.







  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









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



All Articles