OpenGL ES 2.0: configuration de la projection 2D

15

Cet article décrit en général comment dessiner des graphiques OpenGL 2D nets à l'aide d'un pipeline de fonctions fixes.

Étant donné qu'OpenGL ES 2.0 possède certaines fonctions ES 1.x non disponibles (telles que: glOrtho ()), leur fonctionnalité doit être remplacée dans les shaders Fragment / Vertex.

Ma question est, comment configurer la projection 2D suivante dans le pipeline de fonctions programmables?

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

Comment les shaders Fragment et Vertex doivent être configurés pour remplacer complètement la configuration de projection 2D à fonction fixe mentionnée ci-dessus?

Bunkai.Satori
la source

Réponses:

12

Dans mon moteur OpenGL ES 2.X, je calcule la matrice MVP (Model View Projection) côté CPU et l'injecte dans vertex shader.

La projection orthogonale est une matrice 4 * 4 . Quand j'ai le MVP, je l'injecte dans le vertex shader avec:

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

Le mMvp est ma matrice 4 * 4 côté CPU. Le getUniformLocation ne peut être effectué qu'une seule fois après avoir chargé le shader de programme.

Un exemple de vertex shader:

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

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

La gl_Position est une variable spéciale prédéfinie. Il doit contenir la position du sommet.

Un exemple de fragment shader. Pour chaque point à dessiner, la couleur finale "gl_FragColor" doit être calculée:

#ifdef GL_ES
precision highp float;
#endif

void main(void)
{
   gl_FragColor = vColor;
}

Ce programme dessine un triangle avec un lissage des couleurs défini pour chaque sommet.

Pour un meilleur tutoriel, regardez ce merveilleux document.

Ellis
la source
Bonjour Ellis, c'est une réponse excellente et complète. Merci beaucoup. Cordialement.
Bunkai.Satori
9

Du document glOrtho, avec des valeurs substituées:

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

Stockez cette matrice dans un uniforme, et vous pouvez ensuite l'appliquer (c'est-à-dire faire le produit M. V) à vos positions de vertex entrantes.

Bahbar
la source
Cher Bahbar, Merci pour la réponse. Donc, fondamentalement, il n'y a rien d'autre de différent dans ES2.0, il suffit de créer manuellement le remplacement de la matrice glOrtho ().
Bunkai.Satori
@ Bunkai.Satori: Eh bien, il y a un peu plus en cela, généralement, GL télécharge un composite de modelview et de projection dans un uniforme.
Bahbar