Atualizando o jogo para iPhone baseado no OpenGL ES 1.1 para usar o Open GL ES 2.0

7

Eu sou bastante novo para qualquer coisa OpenGL em geral. Eu criei um jogo 2D para iPhone baseado no OpenGL ES 1.1 trabalhando com código de exemplo. Estou com a impressão de que o OpenGL ES 2.0 é substancialmente diferente do 1.1. Então, o que a atualização do código 1.1 para 2.0 implica?

Estou acostumado com o padrão básico de desenho de "empurrar matriz, traduzir, girar, desenhar textura 2D, matriz pop". Qual é o "equivalente" em 2.0?

MrDatabase
fonte

Respostas:

9

O OpenGL ES 2.0 é muito diferente do ES 1.1. Você não tem mais um pipeline de função fixa, portanto, sua familiar "matriz de empurrar, traduzir, girar" etc. desapareceu.

Em vez disso, você tem o conceito de shaders: vértice e fragmento. São pequenos programas que são executados para cada vértice e cada pixel. É aí que todas as transformações e outros efeitos acontecem. Seu código preparará os dados do vértice, informará ao OpenGL como está estruturado e os entregará aos shaders.

Mas nem tudo está perdido: algumas partes do OpenGL não mudaram, como definir estados diferentes (modos de mesclagem, comparações de profundidade) ou criar texturas.

Para usar o OpenGL ES 2.0 de maneira eficaz, você precisa dominar o básico da computação gráfica em 3D, portanto, obtenha um bom livro de introdução e aprenda os princípios. Em seguida, você pode seguir para o OpenGL ES 2.0 e começar a escrever shaders. Este é um bom livro do OpenGL ES 2.0 .

Por fim, não presuma que você precise mudar para o OpenGL ES 2.0. A menos que exista algo específico que você precise e que não possa fazer no ES 1.1, continue usando o ES 1.1, pois todos os dispositivos mais novos são compatíveis com versões anteriores.

Noel Llopis
fonte
2
Empurre a matriz, traduza, gire, etc. ainda estão lá. É o desenho do modo imediato que se foi. Portanto, não há mais glVertex () glNormal () etc. Você precisa usar matrizes de vértices ou objetos de buffer de vértices para obter sua geometria no cartão.
Bob Somers
3
@Bob Somers eu tenho certeza que a pilha de matriz foi removido em OpenGL 2.0 ES no iPhone, por isso não há empurrar matriz, traduzir, etc ..
5ound
Hmm, devo admitir que não tenho 100% de certeza, já que realmente não faço muito o OpenGL para dispositivos móveis e definitivamente não para o iPhone. Eu acho que a pilha de matrizes tem que estar lá, no entanto. Como você instalaria a geometria sem ela?
Bob Somers
@Bob Seu comentário seria preciso se você estivesse comparando o OpenGL ES 1.1 ao OpenGL 1.5. O ES 2.0 é uma fera completamente diferente e as operações da matriz realmente se foram. Claro que existem muitos lugares onde você pode pegar a biblioteca de classes de matriz C ++.
U62 26/07/10
@ Bob Somers: instale geometria passando uniformes de matriz que você calculou para shaders de vértice (a chamada matriz de exibição de modelo).
Bahbar 5/08
7

Eu tenho portado meu mecanismo 3D do OpenGL ES 1.X para o OpenGL ES 2.X porque eu amo shaders. Os renderizadores são distintos e não compartilham nenhum código.

Você pode traduzir facilmente:

  • gerenciamento de texturas
  • objetos framebuffer
  • Misturando

Mais difícil (Precisa de shaders):

  • transformações de tubulação fixa (rotação, escala ...)
  • névoa
  • iluminação

Para portar seu código, eu recomendo que você:

Passo um

  • learn GLSL 1.2: você pode ler os tutoriais WebGL
  • tente escrever alguns shaders shader toy

Passo dois

  • liste todo o material que você possui (ou técnicas de renderização)
  • liste todas as informações de vértices como coordenadas de vértices, normais, coordenadas de texturas, informações de cores necessárias para cada material

    Com essas informações, você saberá quais programas GLSL (vértice + fragment shaders) você deve escrever.

Passo três

  • escreva suas funções de compilador de sombreador e registre cada informação
  • implementar um programa mínimo OpenGL ES 2.X com um quad (dois triângulos)
  • implementar e testar seus programas GLSL, um por um

Etapa quatro: otimizar

Ellis
fonte
3

O OpenGL ES 2.0 não é uma nova revisão do OpenGL ES 1.1. Ou, em outras palavras, o OpenGL ES 2.0 não é um OpenGL ES 1.1 melhor.
Bem, não, eles mudaram tudo.

É fácil ignorar a importação dessa declaração simples. Considere:
OpenGl 2.0 é uma nova revisão do OpenGL 1.5. O OpenGL 2.0 é um OpenGL 1.5 melhor.

Isso significa que, se você estiver usando o OpenGl 1.5 e quiser manter a compatibilidade direta, deverá passar para a 2.0.

O mesmo não se aplica ao OpenGL ES. 1.1 não foi substituído por 2.0. Eles são padrões diferentes. A confusão poderia ter sido eliminada se eles tivessem sido nomeados:

  • OpenGL ES fixed
  • Sombreador OpenGL ES

NOTA: tecnicamente, isso não é perfeitamente verdade. O motivo é que você pode implementar a série 1.0 com a série 2.0. Você apenas teria que definir as funções fixas do pipeline como shaders.

deft_code
fonte
2

Como um aparte das outras respostas aqui, eu recentemente encontrei o gles2-bc, uma biblioteca C ++ 'que torna a API OpenGL ES 2.0 não compatível com versões anteriores compatível com versões anteriores'.

Existem algumas limitações conhecidas e eu não a usei, mas pensei em publicar o link para referência.

http://code.google.com/p/gles2-bc/

Cameron Yule
fonte