OpenGL ES 2.0: misturando 2D com 3D

7

É possível misturar gráficos 2D e 3D em um único jogo OpenGL ES 2.0, por favor?

Eu tenho muitos gráficos 2D no meu jogo. Os gráficos 2D são representados por dois polígonos triangulares (formando um retângulo) com textura neles. Eu uso a matriz ortográfica para renderizar toda a cena.

No entanto, preciso adicionar alguns efeitos 3D ao meu jogo. Portanto, desejo usar a câmera em perspectiva para renderizar as malhas.

É possível misturar câmeras ortográficas e de perspectiva em uma cena? Se sim, haverá um grande custo de desempenho para isso? Existe alguma abordagem recomendada para fazer isso de forma eficaz? Eu terei 90% dos gráficos 2D e apenas 10% dos 3D.

A plataforma de destino é o OpenGL ES 2.0 (iOS, Android). Eu uso C ++ para desenvolver.

Obrigado.

Bunkai.Satori
fonte
Corrigido o tag openg falso para você. :)
ChrisE

Respostas:

10

Isso é feito facilmente.

Defina a transformação da vista como ortográfica para o material 2D e renderize-a. Antes de limpar o buffer de moldura, desenhe os efeitos com uma projeção em perspectiva. A projeção afetará apenas a geometria desenhada após ela; portanto, apenas defina o modo desejado antes do desenho.

É da mesma maneira que lidamos com HUDs em nosso FPS. :)

O único impacto no desempenho é que você está alterando uma variável uniforme (a matriz do seu projeto), certo? Portanto, tente agrupar as coisas para minimizar as alterações de estado - as mesmas coisas antigas.

ChrisE
fonte
11
+1 para uma boa resposta. Acho que a pergunta foi claramente respondida, fornecendo informações sólidas para começar a experimentar por conta própria. Estou marcando isso como a resposta aceita .
Backai.Satori
1

Só haverá um pequeno impacto no desempenho se você calcular a matriz de projeção ortográfica e de perspectiva toda vez que renderizar no buffer de quadros. Sugiro armazená-las em uma variável, calculando e armazenando-as uma vez no código de inicialização e, em seguida, usando-as glLoadMatrixpara carregar a matriz. O método de renderização ficaria assim em pseudo-código:

// Draw 3D things first
glMatrixMode(GL_PROJECTION);
glLoadMatrix(perspective_projection_matrix);
glMatrixMode(GL_MODELVIEW);
Draw3DObjects();
// Draw 2D things second
glMatrixMode(GL_PROJECTION);
glLoadMatrix(orthographics_projection_matrix);
glMatrixMode(GL_MODELVIEW);
Draw2DObjects();
Oskar
fonte
Não há glMatrixMode ou glLoadMatrix no OpenGL ES. Todas as rotinas de matriz baseadas em CPU foram removidas. Você pode fazer o equivalente, mas precisaria fazer o mesmo.
John Meacham