OpenGL ES 2.0: Configurando a projeção 2D

15

Este artigo descreve, em geral, como desenhar gráficos OpenGL 2D nítidos, usando o pipeline de função fixa.

Como o OpenGL ES 2.0 possui algumas funções do ES 1.x não disponíveis (como: glOrtho ()), sua funcionalidade deve ser substituída nos shaders de Fragmento / Vertex.

Minha pergunta é: como configurar a seguinte projeção 2D no pipeline de função programável?

const XSize = 640, YSize = 480
glMatrixMode (GL_PROJECTION)
glLoadIdentity ();
glOrtho (0, XSize, YSize, 0, 0, 1)
glMatrixMode (GL_MODELVIEW)

Como os shaders Fragment e Vertex devem ser configurados para substituir completamente a configuração de projeção 2D de função fixa acima mencionada?

Bunkai.Satori
fonte

Respostas:

12

No meu mecanismo OpenGL ES 2.X, eu computo a matriz MVP (Model View Projection) no lado da CPU e a injeto no vertex shader.

A projeção ortogonal é uma matriz 4 * 4 . Quando tenho o MVP, injeto-o no vertex shader com:

 mMvpLoc = getUniformLocation("uMvp");
 glUniformMatrix4fv(mMvpLoc, 1, false, mMvp.pointer());

O mMvp é minha matriz 4 * 4 no lado da CPU. O getUniformLocation pode ser feito apenas uma vez após o carregamento do sombreador do programa.

Um exemplo de shader de vértice:

uniform mat4    uMvp;
attribute vec3 aPosition;
varying vec4 vColor;

void main() {
   vec4 position = vec4(aPosition.xyz, 1.);
   gl_Position = uMvp * position;
}

A gl_Position é uma variável predefinida especial. Ele deve conter a posição do vértice.

Um exemplo de shader de fragmento. Para cada ponto a desenhar, a cor final "gl_FragColor" deve ser calculada:

#ifdef GL_ES
precision highp float;
#endif

void main(void)
{
   gl_FragColor = vColor;
}

Este programa desenha um triângulo com uma suavização de cores definida para cada vértice.

Para um tutorial melhor, veja este documento maravilhoso.

Ellis
fonte
Olá Ellis, esta é uma resposta excelente e completa. Muito obrigado. Saudações.
Backai.Satori 6/10/10
9

No documento glOrtho, com valores substituídos:

         2
    ------------       0              0             -1
       XSize
                       2
        0         ------------        0              1
                   - Ysize
        0              0              -2            -1
        0              0              0              1

Armazene essa matriz em um uniforme e você poderá aplicá-la (por exemplo, faça o produto M. V) às suas posições de vértice de entrada.

Bahbar
fonte
Caro Bahbar, Obrigado pela resposta. Então, basicamente, não há nada diferente no ES2.0, apenas criando manualmente a substituição da matriz glOrtho ().
Backai.Satori 6/10/10
@ Bunkai.Satori: Bem, há um pouco mais nisso, normalmente, o GL carrega um composto de modelview e projeção para um uniforme.
Bahbar 6/10/10