No wiki : "a API Vulkan foi inicialmente chamada de 'iniciativa OpenGL da próxima geração' da Khrono" e é "um esforço de reformulação inicial para unificar o OpenGL e o OpenGL ES em uma API comum que não será invertida" compatível com versões existentes do OpenGL ".
Então, os que estão agora entrando na programação gráfica devem ser mais bem servidos para aprender o Vulkan em vez do OpenGL? Parece que eles servirão ao mesmo propósito.
Respostas:
Dificilmente!
Isso parece muito com perguntar "Os novos programadores devem aprender C ++ em vez de C" ou "Os novos artistas devem aprender pintura digital em vez de pintura física".
Especialmente porque NÃO é compatível com versões anteriores, os programadores gráficos seriam tolos em excluir a API gráfica mais comum do setor, simplesmente porque há uma nova. Além disso, o OpenGL faz coisas diferentes de maneira diferente. É perfeitamente possível que uma empresa escolha o OpenGL em vez do Vulkan, especialmente no início do jogo, e essa empresa não estaria interessada em alguém que não conheça o OpenGL, independentemente de conhecer ou não o Vulkan.
A especialização raramente é uma habilidade comercializável.
Para aqueles que não precisam comercializar suas habilidades como tais, como desenvolvedores independentes, seria ainda mais tolo remover uma ferramenta de sua caixa de ferramentas. Um desenvolvedor independente depende ainda mais da flexibilidade e da capacidade de escolher o que funciona, e não o que está sendo financiado. A especialização em Vulkan limita apenas suas opções.
A especialização raramente é um paradigma eficiente.
fonte
Se você está começando agora e deseja trabalhar com a GPU (em vez de sempre usar um mecanismo de jogo como o Unity), você deve começar aprendendo o Vulkan. Talvez você deva aprender GL mais tarde também, mas há algumas razões para pensar primeiro no Vulkan.
GL e GLES foram projetados há muitos anos, quando as GPUs funcionavam de maneira bastante diferente. (A diferença mais óbvia é chamar chamadas de sorte no modo imediato versus filas de comandos e lado a lado.) A GL o incentiva a pensar em um estilo no modo imediato e possui muitos itens herdados. O Vulkan oferece modelos de programação muito mais próximos de como as GPUs contemporâneas funcionam; portanto, se você aprender o Vulkan, terá uma melhor compreensão de como a tecnologia realmente funciona e do que é eficiente e do que é ineficiente. Eu vejo muitas pessoas que começaram com GL ou GLES e imediatamente adotam maus hábitos, como emitir chamadas de empate separadas por objeto, em vez de usar VBOs ou, pior ainda, usar listas de exibição. É difícil para os programadores da GL descobrir o que não é mais incentivado.
É muito mais fácil mudar de Vulkan para GL ou GLES do que vice-versa. O Vulkan torna explícitas muitas coisas que estavam ocultas ou imprevisíveis no GL, como controle de simultaneidade, compartilhamento e estado de renderização. Isso aumenta a complexidade do driver para o aplicativo: mas, ao fazê-lo, dá controle ao aplicativo e simplifica a obtenção de desempenho e compatibilidade previsíveis entre diferentes fornecedores de GPU. Se você tem algum código que funciona no Vulkan, é muito fácil portar isso para o GL ou o GLES, e você acaba com algo que usa bons hábitos do GL / GLES. Se você possui um código que funcione no GL ou no GLES, você quase precisa começar novamente para fazê-lo funcionar com eficiência no Vulkan: especialmente se ele foi escrito em um estilo legado (consulte o ponto 1).
A princípio, fiquei preocupado com o fato de o Vulkan ser muito mais difícil de programar, e que, embora fosse bom para desenvolvedores experientes de empresas maiores, seria uma enorme barreira para indies e entusiastas. Fiz essa pergunta a alguns membros do Grupo de Trabalho e eles disseram que têm alguns dados de pessoas com quem conversaram e que já se mudaram para Vulkan. Essas pessoas variam de desenvolvedores da Epic trabalhando na integração UE4 a desenvolvedores de jogos amadores. A experiência deles foi que começar (ou seja, ter um triângulo na tela) envolvia aprender mais conceitos e ter um código mais elaborado, mas não era muito complexo, mesmo para os indies. Mas, depois de chegarem a esse estágio, eles acharam muito mais fácil criar um aplicativo real e entregável, porque (a) o comportamento é muito mais previsível entre implementações de diferentes fornecedores e (b) chegar a algo que teve um bom desempenho com todos os efeitos ativados não envolveu tanta tentativa e erro. Com essas experiências de desenvolvedores reais, eles me convenceram de que a programação contra o Vulkan é viável, mesmo para iniciantes em gráficos, e que a complexidade geral é menor quando você passa pelo tutorial e começa a criar demos ou aplicativos que você pode oferecer a outras pessoas.
Como outros já disseram: o GL está disponível em muitas plataformas, o WebGL é um bom mecanismo de entrega, há muitos softwares existentes que usam o GL e muitos empregadores contratam para essa habilidade. Isso acontecerá nos próximos anos, enquanto Vulkan aumenta e desenvolve um ecossistema. Por esses motivos, você seria tolo por descartar o aprendizado de GL inteiramente. Mesmo assim, você terá muito mais facilidade com isso e se tornará um programador GL melhor (e um programador de GPU em geral), se começar com algo que o ajude a entender a GPU, em vez de entender como eles funcionavam. 20 anos atras.
Claro, há uma opção a mais. Não sei se isso é relevante para você em particular, mas acho que devo dizer aos outros visitantes de qualquer maneira.
Para ser um desenvolvedor independente de jogos, um designer de jogos ou fazer experiências de realidade virtual, você não precisa aprender Vulkan ou GL. Muitas pessoas começam com um mecanismo de jogos (Unity ou UE4 são populares no momento). Usar um mecanismo como esse permitirá que você se concentre na experiência que deseja criar, em vez da tecnologia por trás dele. Ele ocultará as diferenças entre GL e Vulkan de você, e você não precisa se preocupar com o que é suportado em sua plataforma. Ele permitirá que você aprenda sobre coordenadas, transformações, iluminação e animação 3D sem precisar lidar com todos os detalhes de uma só vez. Alguns estúdios de jogos ou VR funcionam apenas em um mecanismo e não têm um especialista em GL em tempo integral. Mesmo em estúdios maiores que escrevem seus próprios mecanismos, as pessoas que fazem a programação gráfica são minoria,
Aprender sobre os detalhes de como interagir com uma GPU é certamente uma habilidade útil e que muitos empregadores valorizarão, mas você não deve sentir que precisa aprender isso para entrar na programação 3D; e mesmo se você souber, não será necessariamente algo que você usa todos os dias.
fonte
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.
fonte
O principal apelo do OpenGL (pelo menos para mim) é que ele funciona em muitas plataformas. Atualmente, o Vulkan não funciona no OSX, e a Apple possui uma API concorrente chamada Metal. É muito possível que demore algum tempo até que a Apple suporte o Vulkan e, quando o fizerem, o suporte ao Vulkan poderá chegar apenas ao hardware mais recente. O OpenGL já suporta a maioria dos hardwares e continuará a fazê-lo.
fonte
Depende do que você quer fazer. Se você quiser aprender programação gráfica apenas para si mesmo, realmente não importa o que escolher.
Se você está pensando em um trabalho profissional, recomendo o Vulkan. É mais próximo do hardware e acho que o conhecimento sobre o que o hardware faz é importante para os programadores gráficos.
O Vulkan está mais próximo do hardware, porque o OpenGL faz muitas coisas ocultas que, no Vulkan, você faz manualmente, como executar a fila de comandos. O gerenciamento de memória também depende do aplicativo, não do driver. Você precisa se preocupar em alocar memória para
uniforms
(variável que você passa da CPU para a GPU), sobre o rastreamento. Você tem mais com o que se preocupar, mas também oferece mais liberdade no uso da memória. Pode parecer assustador e avassalador, mas na verdade não é. É apenas a próxima API que você precisa aprender.Compreender essas coisas também ajudará a entender como a GPU funciona. O que permitirá que você faça alguma otimização no Vulkan e no OpenGL.
E mais uma coisa que vem à minha mente, se você está começando a aprender programação gráfica, provavelmente quando procura um emprego, pois o Vulkan será mais popular (talvez mais popular que o OpenGL). Além disso, até onde eu sei, a maioria das empresas que estão usando algumas APIs de gravação gráfica possui suas próprias funções, então há uma chance de que, no trabalho, você não esteja escrevendo no OpenGL nem no Vulkan, mas o conhecimento sobre a GPU sempre será útil.
fonte
Estou "entrando" na programação gráfica há alguns meses.
No momento, ainda estou no ensino médio e posso dizer que quase sempre estou procurando desenvolver aplicativos de plataforma cruzada. Na verdade, esse é o meu problema número um com o Vulkan - ele não foi desenvolvido para funcionar em todas as plataformas. Trabalho com OpenGL em Java e trabalho há mais de 6 meses.
Outro problema que tenho é com as afirmações de Vulkan: como afirma ser melhor. Embora o OpenGL certamente não esteja atualizando seu site com muita frequência. Eles continuam lançando atualizações constantemente e estou sempre ansioso por novas atualizações que sejam mais rápidas ou que funcionem melhor com o novo hardware.
Dito isto, enquanto trabalho principalmente com o OpenGL, entendo os princípios básicos do DirectX e do Vulkan. Embora eu não trabalhe com eles extensivamente, especialmente o Vulkan, pois é muito difícil de aprender e não está tão bem estruturado para programação quanto o OpenGl e o DirectX.
Por fim, gostaria de acrescentar que a especialização em um único campo, como eu principalmente uso Java e OpenGL, não é surpreendentemente autônoma e comercializável. Se eu quisesse conseguir um emprego em uma empresa que produzia jogos, o OpenGL seria usado, na maioria das vezes, apenas para criar jogos para o desenvolvimento do Linux e Android e, possivelmente, do OSX. DirectX para Windows e Consoles <O Vulkan pode substituir em alguns casos.
Não posso esperar por atualizações do OpenGL para sempre e não vou. Mas é minha preferência pelo desenvolvimento.
fonte
Gostaria de dar a você a minha perspectiva gráfica para iniciantes sobre o assunto. O que eu percebi (em muitos anos trabalhando como engenheiro em outro campo) é que os conceitos fundamentais são a parte mais importante. Depois de ter um entendimento sólido deles, aprender a última nova API brilhante é a parte menos difícil. Não sei se você é um jovem hobbiest tentando programar o novo Skyrim ou se está procurando um emprego na área de computação gráfica.
Eu digo a você o que eu acho que é a melhor abordagem na minha opinião para aprender computação gráfica "como um profissional".
Começar a se preocupar com o desempenho antes de entender como desenhar uma linha é como se preocupar com a aerodinâmica do seu carro antes de obter a carteira de motorista.
fonte
Sou autodidata em C ++ sem nenhuma educação formal e, nos últimos 15 anos, aprendi o OpenGL 1.0 até o Modern OpenGL e o DirectX 9c, 10 e 11. Eu não entrei no DirectX 12 e tenho vontade de tente minha mão em Vulkan. Concluí apenas alguns tutoriais básicos para desenhar um triângulo simples ou um cubo giratório simples com o Vulkan. Assim como no DirectX 11 e no OpenGL 3.3+, eu escrevi Motores de Jogo 3D totalmente funcionais e até os usei para criar jogos simples.
Eu diria que depende do ambiente geral da pessoa que está aprendendo. Se você está apenas começando a programação de gráficos 3D, eu diria que os iniciantes pularão para o OpenGL ou DirectX 11, já que existem muitos tutoriais, recursos, exemplos e aplicativos já em funcionamento. Aprender gráficos 3D não é de forma alguma um assunto fácil.
Se nos afastarmos do aspecto de programação e focarmos apenas na noção de que tipo de técnicas são usadas, envolvendo os diferentes níveis de matemática, levando a conjuntos de dados, estruturas e algoritmos de dados; há muito que você precisa conhecer e entender primeiro antes de tentar criar um 3D Game Engine ou usar efetivamente um já existente.
Agora, se você já entende toda a matemática e a teoria subjacente e tem alguma experiência em programação, pode usar APIs, bibliotecas e aplicativos já existentes, como Unity ou Unreal Engine, e apenas escrever o código-fonte e os scripts necessários para fazer seu aplicativo funcionar .
Então, do meu próprio entendimento e da maneira que eu vejo, é isso se você deseja criar um jogo rápido apenas para construir um jogo; vá com obras de quadros já existentes que reduziriam muito o tempo de produção. Por outro lado, se você quiser entender o funcionamento interno de como os motores de jogo / mecanismos de física / mecanismos de animação e simuladores são projetados e deseja criar um você mesmo, é aqui que você tem a opção de escolher sua API, como DirectX, OpenGL ou Vulkan. Um dos fatores determinantes aqui também seria o seu conhecimento de programação existente. O que quero dizer com isso é que, se você não sabe nada sobre chamadas multi-threading, síncronas e assíncronas, cercas de memória, corridas de dados, semáforos e paralelismo (programação paralela),
Menciono isso porque se você não souber como gerenciar adequadamente sua memória, juntamente com seus threads e tempo de acesso; Vulkan vai morder sua bunda! Onde o OpenGL e o DirectX seguram sua mão o tempo todo, consumindo muito mais energia da CPU.
Agora, se o seu nível de conhecimento de programação é decente e você possui os seguintes conhecimentos matemáticos que envolvem todos os níveis de Álgebra, Geometria, Trigonometria, Álgebra Booleana, Probabilidade, Estatística, Vetor - Álgebra baseada em matriz, Cálculo I, II, .... Infinty (risos). Cálculo vetorial, álgebra linear, sistemas de equações lineares, geometria analítica com cálculo vetorial de cálculos multivariáveis, teoria dos números e conjuntos, conjuntos e estruturas de dados, análise computacional, projeto computacional e algorítmico. Então você pode entrar nos conceitos do que é necessário para criar um mecanismo de jogo real e isso é sem nenhuma Matemática Aplicada ou qualquer equação de Física que você precise. Depois de ter esse histórico e experiência de programação suficiente, especialmente gerenciamento de memória e aritmética de ponteiros, você poderá começar a criar seu Game Engine.
A questão aqui é que você precisa entender todos os aspectos necessários para criar um Game Engine para fazer a programação gráfica avançada. Se você está criando apenas gráficos 2D, a vida não é muito difícil, pois você pode fazer isso no Python sem nenhuma das APIs mencionadas acima! Mas se você quer ser sério e criar um Game Engine completo e robusto, com muitos conjuntos de recursos, a escolha aqui seria C ou C ++ e usar OpenGL, Direct X ou Vulkan. Qualquer um deles ficaria bem. Agora, se você está construindo o Engine a partir do zero e está procurando o mecanismo em execução "mais eficiente" com a menor quantidade de sobrecarga de recursos, convém escolher o Vulkan. Mas se você seguir esse caminho, pelo menos deve saber tudo o que eu mencionei acima e alguns!
Então, como você pode ver, o Vulkan não é realmente voltado para programadores iniciantes neste campo. É necessário ter amplo conhecimento de todos os matemáticos, paradigmas de programação, todos os diferentes tipos de conjuntos de dados e algoritmos, incluindo encadeamento, sincronização de memória e programação paralela. E mesmo assim, é apenas para fazer com que o aplicativo carregue um triângulo 2D simples na tela. O que pode ser feito em cerca de 100 linhas de código no OpenGL ou 250 linhas de código no DirectX requer quase 1.000 linhas de código no Vulkan!
O Vulkan deixa tudo para você, pois você é responsável por todos os aspectos de como você está usando o Vulkan em seu aplicativo. Não há mãos dadas, não atrapalha, permite que você atinja seu próprio pé ou se enforque e compre um laço recursivo!
Agora, isso não quer dizer que os iniciantes ou aqueles que são novos nesse campo não aprendam o Vulkan, mas o que eu sugeriria é o seguinte: primeiro Aprenda o suficiente sobre o OpenGL e o DirectX para se molhar e ver como O aplicativo básico é estruturado apenas para renderizar um triângulo simples ou um cubo giratório. Familiarize-se com suas APIs e com seus padrões recorrentes de suas estruturas. Enquanto aprende que você pode aprender o Vulkan ao lado em paralelo, desta maneira, você pode ver como cada um dos três está realizando a mesma tarefa, mas sabe como eles o fazem de maneira diferente. Também é possível comparar os resultados entre as diferentes APIs e aí você pode escolher qual é o preferido para você. Esse método também forneceria outra ferramenta em sua caixa de ferramentas, e você poderia até escrever seu aplicativo para dar suporte aos três e ter o "
No final, cabe a essa pessoa escolher qual rota deseja seguir, e a partir daí seu sucesso será determinado por sua dedicação, estudo constante, trabalho duro, tentativa e erro e, o mais importante, suas falhas. Se você não falhar, não terá sucesso! Você só será bem-sucedido se falhar, encontrar seus erros, corrigi-los, seguir em frente, voltar e fazer tudo de novo!
fonte
Você deve aprender o OpenGL primeiro, pois esse é o padrão para gráficos em várias plataformas.
Mesmo se houver uma biblioteca mais nova, entender o básico e trabalhar com uma linguagem usada em todo o setor é muito importante ... Especialmente porque o Vulkan não será usado nas grandes empresas por um tempo desde então.
Ninguém quer se adaptar imediatamente e acabar se atrapalhando com um Framework / Biblioteca não estável.
Eles precisariam contratar / treinar seus atuais programadores Open-GL, e não há necessidade.
Além disso, ouvi dizer que o OpenGL e o Vulkan não são exatamente iguais. Ouvi dizer que o Vulkan é uma API de nível inferior e mais próxima do código da máquina que o OpenGL.
Esta resposta que acabei de encontrar parece ter muitas informações excelentes
https://gamedev.stackexchange.com/questions/96014/what-is-vulkan-and-how-does-it-differ-from-opengl
Outra coisa a considerar é o problema que aconteceu com o OpenGL 1.
O OpenGL 1 para o OpenGL 2 teve alterações MAJOR, e como muitas pessoas estavam usando o OpenGL1, e o hardware o suporta, há uma compatibilidade com versões anteriores pesada a ser implementada em alguns aplicativos / mecanismos, e às vezes é realmente doloroso para os desenvolvedores continuarem a suportá-lo. .
Além do suporte, o idioma mudou tanto, que você teve que aprender coisas novas.
Isso aconteceu com estruturas como JavaFX (de 1.x a 2.x) e Play! Framework (também 1.x a 2.x). Alterações completas na estrutura, o que significa que precisamos reaprender ... tudo ...
Então, essencialmente, o que você deve fazer é esperar até que o Vulkan esteja estável. Isso significa esperar até provavelmente o patch 2.0. TI não significa que você não pode aprender sobre o básico do Vulkan, mas saiba que isso pode mudar. Eu diria que um grupo como o Kronos forneceria uma API muito estável desde o início, especialmente porque existem vários engenheiros da Nvidia e da AMD trabalhando no Vulkan, incluindo uma pessoa da Nvidia que supervisiona o projeto aparentemente, bem como a base de Mantle; no entanto, como qualquer software, nós, os codificadores, veremos o quão bem ele funciona desde o início, mas muitos são cautelosos e esperam para ver o que acontece.
fonte