Hoje, o aprendizado do OpenGL 2.1 é inútil?

44

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?

reefaktor
fonte
10
Não sei muito sobre o OpenGL / DirectX, mas gosto de jogar em uma máquina com mais de um ano de idade. Eu imagino que o seu conhecimento pré OpenGL 3.x seria benéfico para meus hábitos de jogo. Apenas um pensamento.
Simurr 26/07/10
Não gosto da maneira como esta pergunta é formulada. Você pode fazer um jogo no OpenGL 2.1 ? A resposta: um sim definitivo . O que você quer dizer com inútil então? Você pode aprender o básico do 3D em um livro mais antigo ou em uma API obsoleta? Novamente um sim definitivo . É a melhor maneira de fazê-lo? Provavelmente não .
precisa saber é o seguinte

Respostas:

18

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.

Maximus Minimus
fonte
Ótimo ponto no GL3.3 ~ = DX10 / 11 e nas estatísticas de hardware do Steam.
Nate
Apenas para atualizar essas estatísticas - o DX10 / 11 GPU + Vista / 7 agora está em ~ 88%, adicione outros 4,38% para o DX10 / 11 GPU + XP e você está olhando confortavelmente mais de 90% de penetração. A aceitação está aumentando muito mais rápido do que eu havia previsto quando fiz esse post original.
Maximus Minimus
"O GL3.3 + introduziu maneiras muito mais agradáveis ​​(e com melhor desempenho) de lidar com muitas coisas" - Como o 3.2 se sai em comparação? Os usuários de Mac ainda não recebem o 3.3. Eu suponho que é quase o mesmo, mas não quero assumir demais.
precisa saber é o seguinte
38

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).

Jake McArthur
fonte
3
+1 para o tutorial de Joe Groff. Ele o conduz por todo o pipeline no capítulo 2. E qualquer código de "utilitário" que ele adiciona tem apenas duas funções: uma para ler em um arquivo (para GLSL) e outra para ler imagens TGA (e você também pode usar outra biblioteca de imagens ou escreva seu próprio carregador de imagens depois que o exemplo estiver funcionando). Tudo o resto é explicado e parte do tutorial.
michael.bartnett
18

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.

greyfade
fonte
O Snow Leopard suporta a maioria das extensões do OpenGL 3 - até mesmo shaders de geometria.
Axel Gneiting
@Alex O suporte à "maioria" das extensões não significa que o núcleo GL3 seja suportado. E nós estamos apenas falando sobre 3.x
Matias Valdenegro
@Axel Gneiting: Não é o mesmo. A maioria dos recursos interessantes do OpenGL 3.0+ não estão disponíveis como extensões. Há um grande número de alterações principais.
28610 greyfade
12

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- varyingchave e não existem no núcleo 3.3; ele usa ine out, 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 highppor 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.

Nicol Bolas
fonte
8

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.

jsimmons
fonte
4

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.

thbusch
fonte
4

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.

user1800
fonte
3

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.

  • Shaders de vértice e fragmento: Aprenda-os
  • Texturas: Ainda bem.
  • Matrizes: saber como elas funcionam é benéfico, mas glLoadIdentityesse tipo de função está desatualizado e deve ser evitado
  • Luz: É útil saber como a luz pode ser simulada em gráficos de computador, mas glLightfvoutras funções de luz de função fixa devem ser evitadas.
  • Buffers de matriz: Bom
  • glBegin, glVertex, glColor, glEnd: Evitá-los. Pode ser bom para experimentação rápida, mas existem outras maneiras melhores de fazer o mesmo.
  • Listas de exibição: Evitar

A pergunta em que eu originalmente postei essa resposta acabou sendo uma duplicata, por isso estou publicando aqui.

luiscubal
fonte
1

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).

Mungoid
fonte
1

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.

David C. Bishop
fonte