Eu sou novo no mundo 3D OpenGL / DirectX e descobri que as especificações OpenGL 4.1 e GLSL foram lançadas hoje.
Um amigo meu me deu o Red Book para OGL v2.1, mas, até onde eu li, 3.xe 4.x diferem muito de 2.xe muitas coisas estão obsoletas agora.
Posso usar o livro para começar a aprender o básico de 3D e CG ou é melhor encontrar uma cópia mais recente?
Respostas:
Em tempos como esse, sempre vou para a Pesquisa de hardware do Steam: http://store.steampowered.com/hwsurvey/ - você verá que a penetração no mercado dos sistemas da classe DX10 / 11 é de quase 80%; sendo amplamente equivalente ao GL3.3 ou superior. Esses 80% são restritos aos usuários do Vista / 7 - adicione uma GPU DX10 / 11 com XP e você aumentará para pouco mais de 90%.
Tendo em mente que estamos falando de jogadores um pouco mais hardcore aqui, você precisa começar a pensar no seu público-alvo. Essas são as pessoas que você deseja atingir? Você está visando aqueles com mais hardware de nível inferior? E os gráficos da Intel? E os usuários de Mac e Linux? Essas são todas as perguntas que você precisa responder por si mesmo; portanto, as diretrizes gerais são as melhores que você obterá.
Além disso, você precisa levar em conta o fato de que, se você está começando a aprender hoje com a intenção de enviar algo, está olhando para um período de cerca de um ano no mínimo antes de chegar lá (a menos que estejamos conversando sobre casos realmente triviais / simples). Com a tendência ascendente dos recursos gfx continuando, estamos olhando para uma real absorção de quase 100% do hardware GL3.3 + até então.
Depois, considere que, com o GL2.1 ou inferior, você aprenderá e usará uma enorme quantidade de bobagens antigas, mesmo se você se restringir ao subconjunto de shaders e VBOs do GL2.1 (as versões GLSL de nível inferior são desagradáveis de usar e os VBOs de streaming são praticamente inutilizáveis sem GL_ARB_map_buffer_range) - O GL3.3 + introduziu maneiras muito mais agradáveis (e com melhor desempenho) de lidar com muitas coisas, você estará fazendo um melhor uso do hardware do player (e eles ficarão gratos por por isso) e estará gastando mais tempo escrevendo código produtivo em vez de combater uma API que realmente não deseja cooperar com você.
E depois, claro, há a temida situação do motorista. O fato difícil, porém verdadeiro, é que os drivers GL no Windows estão em um estado lastimável - a NV suporta coisas que não deveriam, a AMD não suporta coisas que deveriam e, com a Intel, você realmente precisa se restringir à funcionalidade GL para a qual há um equivalente em D3D. Quanto mais novo o GL_VERSION, maior a probabilidade de encontrar bugs de driver, mas para o GL3.3 as coisas estão razoavelmente estáveis agora.
Portanto, o resumo é que, na ausência de outras informações (público-alvo, etc.), eu visaria o GL3.3 como uma linha de base (possivelmente obtendo funcionalidade de GL_VERSIONs mais altas, onde estiver disponível e onde não perturbe a base de código demais), a menos que houvesse uma razão muito específica e definitivamente identificada para diminuir (e eu gostaria de ter 100% de certeza disso em vez de usar alguma noção vaga de " mas e aqueles com hardware mais antigo "). No último caso, eu não ficaria abaixo do GL2.1 e procuraria obter o máximo possível da funcionalidade 3.x mesmo assim.
fonte
Eu sugeriria manter a interseção de 2.1 e 3. Ainda há muito hardware e drivers que suportam apenas o OpenGL 2.1, mas as práticas incentivadas pelo núcleo do OpenGL 3 são melhores. Este tutorial é um bom ponto de partida (ensina o OpenGL 2.0 sem recursos que foram descontinuados na 3).
fonte
Eu diria que não é inútil.
Por quê? Bem, enquanto o resto do mundo suporta o OpenGL 3.xe 4.0, o Mac OS X ainda suporta apenas o OpenGL 2.1. E o OpenGL ES, que é usado na maioria das plataformas portáteis, se não em todas, ainda é amplamente suportado em todas as versões: 1.0, 1.1 e 2.0; que são aproximadamente comparáveis ao OpenGL 1.4, 1.5 e 2.1, respectivamente.
Portanto, até o OpenGL ES 1.0 desaparecer completamente da face da Terra, saber que o OpenGL 2.x não será um desperdício.
Isso não quer dizer que não há valor no uso do OpenGL 3.x ou 4.0 em plataformas que o suportem, é claro.
Atualização: Desde o lançamento do Mac OS X Lion (10.7), o perfil OpenGL 3.2 Core agora é suportado no Mac. Esta versão substitui grandes partes do OpenGL 1.x para simplificar a API. Usuários de versões mais antigas do OS X (e gráficos Intel de gama baixa) ainda estão limitados ao OpenGL 2.0 e 2.1. Conhecer o OpenGL 2.x, no entanto, ainda é útil e permanecerá assim por algum tempo.
fonte
A resposta do mh01 cobriu grande parte do básico, então vou adicionar alguns complementos.
OpenGL ES
Vamos falar sobre o ES 2.0 vs. o desktop GL 2.1 vs. o desktop GL 3.3. Para os fins desta discussão, o termo "GL XY" se refere à área de trabalho OpenGL versão XY, enquanto "ES XY" se refere a OpenGL ES XY
Estruturalmente , o ES 2.0 tem mais em comum com o GL 3.3 principal do que com o GL 2.1. GL 3.3 e ES 2.0 são baseados em shader puro. Ambos são baseados em objeto de buffer puro. Etc. O GL 2.1 possui muitos traps de desempenho e codificação que facilitariam a criação de um aplicativo GL 2.1 que não seria facilmente transportável para o ES 2.0.
No entanto, em termos de sintaxe da linguagem de sombreamento , o GLSL ES 1.00 (mapeado para ES 2.0) se parece muito mais com o GLS do GL 2.1 do que com o GL 3.3. As palavras
attribute
-varying
chave e não existem no núcleo 3.3; ele usain
eout
, que é muito mais consistente e razoável quando você está lidando com mais de 2 estágios de shader (é por isso que o ES 3.0 adotou a sintaxe GL 3.3).É fácil mapear os conceitos aprendidos no GL 3.3 para ES 2.0. Portanto, se você aprender o GL 3.3 para qualquer uma das várias ferramentas para isso, entenderá como trabalhar no mundo ES 2.0. Você precisará descobrir onde está o subconjunto, é claro (ou seja: as coisas que o GL 3.3 pode fazer e o ES 2.0 não), mas os conceitos são os mesmos.
Mapear a sintaxe do GLSL, para que você possa copiar shaders de um para o outro, é um pouco mais difícil. Mas, na verdade, basta alguns #defines nos lugares certos. Além disso, o GLSL 3.30 possui alguns recursos de compatibilidade com o ES, assim
highp
por diante (que não fazem nada no GLSL da área de trabalho).Então você ganha algo com o ES 2.0 ao aprender com o GL 3.3 em vez do GL 2.1.
fonte
Para jogos que não exigem alterações maiores ao OpenGL expostas apenas nas versões mais recentes, o uso de apenas 3.x + limita você a uma série nvidia 8 e superior (não tem certeza dos outros fornecedores de gráficos que deseja procurar). Portanto, se você não estiver usando os recursos 3.x +, está apenas criando um limite artificial, impedindo que pessoas com placas gráficas mais antigas, mas muito poderosas, joguem seu jogo.
Por esse motivo, recomendo que você aprenda o subconjunto compatível com versões anteriores e as versões mais recentes e, em seguida, escolha a versão mais baixa na qual você pode aprimorar seu jogo. Você pode
Também observarei, em resposta a outra pergunta, que o OpenGL: ES 2.0 remove o pipeline de funções fixas, portanto é mais equivalente a 3.0 do que o 2.1.Também sempre suporte recursos diferentes por versão gl suportada em tempo de execução.
fonte
Eu diria que é importante aprender o OpenGL usando o seu Red Book, apenas ignore as coisas que estão obsoletas nas versões mais recentes (como glBegin (), glEnd () - use VBOs). A maior parte da funcionalidade nas versões mais recentes já estava disponível antes através de extensões.
fonte
Eu concordo principalmente com o thbusch. Mas eu não ignoraria completamente as APIs obsoletas: ainda há muito código por aí que as usa. Eu lhes daria muito menos atenção, no entanto. Não faz sentido, por exemplo, aprender glBegin (), glEnd () o suficiente para escrever seu próprio código usando-os. Mas você deve reconhecê-los quando vê-los e ter alguma idéia do que eles estão fazendo.
Ainda vale a pena ler todo o Red Book pelo menos uma vez, mesmo que você não construa o código de exemplo e faça exercícios para cobrir os recursos descontinuados no OpenGL 3.x.
fonte
A resposta curta:
Não. Aprender o OpenGL 2.1 é uma boa idéia, ainda hoje, desde que você aprenda as "partes boas".
A resposta longa:
O OpenGL pode ser basicamente dividido em duas partes: "As partes boas" e "Funções herdadas".
Honestamente, não vejo muitos benefícios em aprender funções herdadas (a "função fixa"). No entanto, uma parte substancial do OpenGL 2.1 (as partes boas) ainda está disponível hoje com alterações relativamente pequenas.
Como tal, aprender algumas partes do OpenGL 2.1 pode ser benéfico. Em particular, o OpenGL ES 2 é muito popular atualmente e o ES 2 é principalmente (mas não exatamente) um subconjunto do OpenGL 2.1. Para programação 3D em smartphones, o OpenGL ES 2 é obrigatório.
Então, o que é "bom"? Essencialmente, qualquer coisa que esteja no "perfil principal" do OpenGL 3.x (em oposição ao "perfil de compatibilidade") e / ou no OpenGL ES 2.
glLoadIdentity
esse tipo de função está desatualizado e deve ser evitadoglLightfv
outras funções de luz de função fixa devem ser evitadas.glBegin
,glVertex
,glColor
,glEnd
: Evitá-los. Pode ser bom para experimentação rápida, mas existem outras maneiras melhores de fazer o mesmo.A pergunta em que eu originalmente postei essa resposta acabou sendo uma duplicata, por isso estou publicando aqui.
fonte
Não acredito que seja uma má ideia. Muitos conceitos de GL abrangem todas as versões do OpenGL e ainda assim ajudarão você. Eu tenho vários livros do OpenGL de 10 anos atrás que ainda hoje ajudam. Eu diria que, se você é novo no OpenGL e há alguns livros melhores mais antigos, aprenderá bastante e o código ainda deverá funcionar. A maior parte do OpenGL é compatível com versões anteriores (acredito).
fonte
Aconselho que você aprenda o material moderno primeiro e apenas finja que o material herdado não existe até que você precise.
O material desatualizado pode ser útil em alguns casos, por exemplo, se você estiver tentando programar algo compatível apenas com OpenGL 1.5 ou mais antigo (pode ser encontrado em netbooks ruins e sistemas MacOS mais antigos), OpenGL ES 1.x (os iPhones mais antigos e Android antes da versão 1.6), ou OpenGL SC (subconjunto do Saftey Critical, se você estiver programando uma exibição no caça a jato). O Minecraft, por exemplo, foi desenvolvido com o OpenGL 1.3, para suportar hardware muito antigo (mas mesmo isso possui uma opção 'avançada').
Também pode ser útil se você quiser obter pixels na tela e não se importar em fazê-lo da maneira 'certa'.
É útil confiar em alguns dos recursos que o OpenGL faz por padrão ao aprender, como configurar uma viewport de -1.0 a 1.0 e renderizar sem shaders. Isso permite que você aprenda sem ter que fazer tudo de uma só vez.
Mas, além disso, deve ser ignorado, se possível.
Sugiro que você verifique minhas respostas aqui e aqui para obter informações mais detalhadas.
fonte