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?

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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.