Aprender programação gráfica é mais do que apenas aprender APIs. É sobre aprender como os gráficos funcionam. Transformações de vértice, modelos de iluminação, técnicas de sombra, mapeamento de textura, renderização adiada e assim por diante. Eles não têm absolutamente nada a ver com a API usada para implementá-los.
Portanto, a pergunta é a seguinte: você quer aprender como usar uma API? Ou você quer aprender gráficos ?
Para fazer coisas com gráficos acelerados por hardware, você precisa aprender como usar uma API para acessar esse hardware. Porém, quando você tiver a capacidade de interagir com o sistema, o aprendizado de gráficos deixa de se concentrar no que a API faz por você e, em vez disso, se concentra nos conceitos gráficos. Iluminação, sombras, mapeamento de relevo, etc.
Se seu objetivo é aprender conceitos gráficos, o tempo que você gasta com a API é o tempo que você não gasta aprendendo conceitos gráficos . Como compilar shaders não tem nada a ver com gráficos. Nem como enviar uniformes, como fazer upload de dados de vértices em buffers, etc. Essas são ferramentas e ferramentas importantes para a execução de gráficos.
Mas eles não são realmente conceitos gráficos. Eles são um meio para um fim.
É preciso muito trabalho e aprendizado com o Vulkan antes de você chegar ao ponto em que está pronto para começar a aprender conceitos gráficos. A passagem de dados para sombreadores requer gerenciamento explícito da memória e sincronização explícita do acesso. E assim por diante.
Por outro lado, chegar a esse ponto com o OpenGL requer menos trabalho. E sim, estou falando sobre o OpenGL moderno, com perfil básico baseado em shader.
Basta comparar o que é preciso para fazer algo tão simples quanto limpar a tela. No Vulkan, isso requer pelo menos alguma compreensão de um grande número de conceitos: buffers de comando, filas de dispositivos, objetos de memória, imagens e as várias construções WSI.
Em OpenGL ... é três funções: glClearColor
, glClear
e a chamada buffers de swap específico da plataforma. Se você estiver usando o OpenGL mais moderno, poderá reduzi-lo para dois: glClearBufferuiv
e trocar buffers. Você não precisa saber o que é um buffer de quadros ou de onde vem sua imagem. Você o limpa e troca os buffers.
Como o OpenGL esconde muito de você, é preciso muito menos esforço para chegar ao ponto em que você está realmente aprendendo gráficos, em vez de aprender a interface do hardware gráfico.
Além disso, o OpenGL é uma API (relativamente) segura. Emitirá erros quando você faz algo errado, normalmente. Vulkan não é. Embora existam camadas de depuração que você pode usar para ajudar, a API principal do Vulkan não informará quase nada, a menos que haja uma falha de hardware. Se você fizer algo errado, poderá obter a renderização de lixo ou travar a GPU.
Juntamente com a complexidade do Vulkan, fica muito fácil acidentalmente fazer a coisa errada. Esquecer de definir uma textura para o layout correto pode funcionar em uma implementação, mas não em outra. Esquecer um ponto de sincronização pode funcionar algumas vezes, mas, de repente, falha por aparentemente sem motivo. E assim por diante.
Tudo isso dito, há mais na aprendizagem de gráficos do que na aprendizagem de técnicas gráficas. Há uma área em particular onde Vulkan vence.
Desempenho gráfico .
Ser um programador de gráficos 3D geralmente requer alguma idéia de como otimizar seu código. E é aqui que ocultar informações do OpenGL e fazer coisas pelas suas costas se torna um problema.
O modelo de memória OpenGL é síncrono. É permitido à implementação emitir comandos de forma assíncrona, desde que o usuário não consiga perceber a diferença. Portanto, se você renderizar para alguma imagem, tente ler a partir dela, a implementação deve emitir um evento de sincronização explícito entre essas duas tarefas.
Mas, para obter desempenho no OpenGL, você precisa saber que as implementações fazem isso, para que você possa evitá-lo . Você precisa saber onde a implementação está emitindo secretamente eventos de sincronização e, em seguida, reescrever seu código para evitá-los o máximo possível. Mas a própria API não torna isso óbvio; você deve ter adquirido esse conhecimento de algum lugar.
Com o Vulkan ... você é quem deve emitir esses eventos de sincronização. Portanto, você deve estar ciente do fato de que o hardware não executa comandos de forma síncrona. Você deve saber quando precisa emitir esses eventos e, portanto, deve estar ciente de que eles provavelmente tornarão seu programa lento. Então você faz tudo o que pode para evitá-los.
Uma API explícita como o Vulkan obriga a tomar esses tipos de decisões de desempenho. E, portanto, se você aprender a API Vulkan, já terá uma boa idéia sobre o que as coisas vão demorar e o que as coisas vão ser rápidas.
Se você precisar fazer algum trabalho de buffer de estrutura que o force a criar um novo passe de renderização ... é provável que isso seja mais lento do que se você pudesse ajustá-lo em um subpass separado de um passe de renderização. Isso não significa que você não pode fazer isso, mas a API avisa que isso pode causar um problema de desempenho.
No OpenGL, a API basicamente convida você a alterar seus anexos de buffer de quadros, quer ou não. Não há orientação sobre quais mudanças serão rápidas ou lentas.
Portanto, nesse caso, aprender o Vulkan pode ajudá-lo a aprender melhor sobre como tornar os gráficos mais rápidos. E certamente ajudará a reduzir a sobrecarga da CPU.
Ainda levará muito mais tempo para você chegar ao ponto em que pode aprender técnicas de renderização gráfica.