OpenGL ES 2.0: configuración de proyección 2D

15

Este artículo describe en general, cómo dibujar gráficos 2D OpenGL nítidos, utilizando una tubería de función fija.

Debido a que OpenGL ES 2.0 tiene algunas funciones ES 1.x no disponibles (como: glOrtho ()), su funcionalidad debe sustituirse en sombreadores Fragment / Vertex.

Mi pregunta es, ¿cómo configurar la siguiente proyección 2D en la canalización de funciones programables?

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

¿Cómo deben configurarse los sombreadores Fragment y Vertex para sustituir completamente la configuración de proyección 2D de función fija mencionada anteriormente?

Bunkai.Satori
fuente

Respuestas:

12

En mi motor OpenGL ES 2.X, calculo la matriz MVP (Model View Projection) en el lado de la CPU e la inyecto en el sombreador de vértices.

La proyección ortogonal es una matriz 4 * 4 . Cuando tengo el MVP, lo inyecto en el sombreador de vértices con:

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

El mMvp es mi matriz 4 * 4 en el lado de la CPU. GetUniformLocation solo se puede realizar una vez después de haber cargado el sombreador del programa.

Un ejemplo de sombreador de vértices:

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

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

Gl_Position es una variable especial predefinida. Debe contener la posición del vértice.

Un ejemplo de fragment shader. Para cada punto a dibujar, se debe calcular el color final "gl_FragColor":

#ifdef GL_ES
precision highp float;
#endif

void main(void)
{
   gl_FragColor = vColor;
}

Este programa dibuja un triángulo con un suavizado de colores definidos para cada vértice.

Para un mejor tutorial, mira este maravilloso documento.

Ellis
fuente
Hola Ellis, esta es una respuesta excelente y completa. Muchas gracias. Saludos.
Bunkai.Satori
9

Del documento glOrtho, con valores sustituidos:

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

Almacene esta matriz en un uniforme, y luego puede aplicarla (es decir, hacer el producto M. V) a sus posiciones de vértice entrantes.

Bahbar
fuente
Querido Bahbar, gracias por la respuesta. Entonces, básicamente, no hay nada más diferente en ES2.0, solo creando manualmente el reemplazo de matriz glOrtho ().
Bunkai.Satori
@ Bunkai.Satori: Bueno, hay un poco más en eso, por lo general, GL carga un compuesto de modelview y proyección a un uniforme.
Bahbar el