Link

Introdução

Desde que a API OpenGL foi lançada em 1992 pela Silicon Graphics, ela sofreu mudanças significativas à medida que o hardware das placas de vídeo evoluiu. Muitas partes antigas da API agora estão obsoletas e até sua versão mais atual não é ideal para utilizar todos os recursos das GPUs mais modernas. Para acomodar essas mudanças, o Khronos Group lançou em 2016 a API Vulkan. Embora essa nova API seja mais complexa que o OpenGL, ela representa melhor a interação real entre a CPU e a GPU. Isso permite que os usuários obtenham um melhor controle sobre a utilização de recursos da GPU, o que pode levar a um melhor desempenho.

Embora Vulkan seja uma solução multiplataforma, um aplicativo que utiliza Vulkan ainda precisa conter código específico da plataforma, principalmente relacionado à criação de janelas e manipulação de eventos. Desde a versão 5.10, o framework Qt fornece uma maneira de usar Vulkan junto com seu sistema de janelas e sua infraestrutura de eventos já existentes. Além de manter acesso total à API Vulkan original para renderização, o Qt permite, ao mesmo tempo, o uso de sua estrutura.


Objetivos

Este trabalho foi inspirado no material de OpenGL no Qt de Gois e Batagelo (2012). O conteúdo que será apresentado servirá de um guia introdutório para começar a trabalhar com computação gráfica usando Vulkan junto com Qt.

O objetivo deste trabalho é introduzir ao leitor os conceitos principais da API Vulkan fazendo com que se sinta confortável o suficiente para trabalhar com a API Vulkan junto com o framework Qt (ou seja, criar, personalizar e gerar uma variedade de aplicativos gráficos simples), seja capaz de explicar os principais componentes da API e, mais importante, por que e como eles se encaixam para realizar a técnica gráfica necessária.


Pré-requisitos

Destacamos a seguir alguns requisitos para melhor aproveitamento do conteúdo descrito neste trabalho:

  • Uma placa gráfica e driver compatível com Vulkan (NVIDIA, AMD, Intel).
  • Familiaridade com a programação orientada a objetos, preferencialmente em C++.
  • Conhecimento prévio em computação gráfica é necessário. Em particular, o leitor deve estar familiarizado com fundações de transformações geométricas, visualização, iluminação e shading.
  • Conhecimento básico em programação de shaders usando GLSL.

Estrutura

Nos próximos capítulos, iremos guiar o leitor pelo desenvolvimento de um aplicativo interativo usando Vulkan com o Qt. Inicialmente, apresentaremos uma visão geral da API Vulkan e seus recursos distintos em relação ao sua antecessora: a API OpenGL. Vamos entender quais são os objetos Vulkan e como eles se relacionam. Em seguida, vamos cuidar da configuração básica; isso significa que entenderemos como iniciar um projeto Qt com suporte mínimo para o Vulkan. Então, mostraremos as classes principais do Qt que precisamos usar em um aplicativo Vulkan. Logo após, desenvolveremos um aplicativo para renderizar nosso primeiro triângulo usando Vulkan. Depois apresentaremos os passos necessários para mapeamento de textura no Vulkan. Também, mostraremos como carregar um modelo 3D a partir de um arquivo em formato OBJ e renderizá-lo utilizando o modelo de reflexão de Phong junto com o Phong shading. Por fim, implementaremos um trackball virtual para rodar e escalar o modelo 3D.

Também é importante mencionar, que o código que será apresentado neste projeto é baseado no tutorial de Vulkan escrito por Alexander Overvoorde disponível em https://vulkan-tutorial.com/. Este tutorial, além de cobrir boa parte do que veremos, também trata do uso de index buffer, mapeamento MIP e multisampling, que não trataremos aqui. Por outro lado, cobriremos alguns tópicos que não são cobertos nele, como iluminação local e implementação de um trackball virtual. Além disso, trataremos de especifidades do Qt, como criação de janela, uso de suas classes auxiliares para criação e gerenciamento de recursos do Vulkan, e uso de seu sistema interno de eventos. Para aprender mais sobre Vulkan, recomendamos que o leitor também consulte o material escrito por Overvoorde.


Próximo