OpenGL ES 2.0: impostazione della proiezione 2D


15

Questo articolo descrive in generale come disegnare grafica 2D OpenGL nitida, usando una pipeline a funzione fissa.

Poiché OpenGL ES 2.0 ha alcune funzioni ES 1.x non disponibili (come: glOrtho ()), la loro funzionalità deve essere sostituita negli shader Fragment / Vertex.

La mia domanda è: come impostare la seguente proiezione 2D nella pipeline di funzioni programmabili?

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

Come devono essere configurati gli shader Fragment e Vertex per sostituire completamente la configurazione di proiezione 2D a funzione fissa sopra menzionata?

Risposte:


12

Nel mio motore OpenGL ES 2.X, computo la matrice MVP (Model View Projection) sul lato CPU e la inietto nel vertex shader.

La proiezione ortogonale è una matrice 4 * 4 . Quando ho l'MVP, lo inietto nello shader di vertice con:

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

L'MMvp è la mia matrice 4 * 4 sul lato CPU. GetUniformLocation può essere eseguito solo una volta dopo aver caricato il programma shader.

Un esempio di vertice shader:

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

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

Gl_Position è una variabile predefinita predefinita. Deve contenere la posizione del vertice.

Un esempio di shader di frammenti. Per ogni punto da disegnare, il colore finale "gl_FragColor" deve essere calcolato:

#ifdef GL_ES
precision highp float;
#endif

void main(void)
{
   gl_FragColor = vColor;
}

Questo programma disegna un triangolo con una sfumatura di colori definita per ciascun vertice.

Per un tutorial migliore, guarda questo meraviglioso documento.


Ciao Ellis, questa è una risposta eccellente e completa. Grazie mille. Saluti.
Bunkai.Satori,

9

Dal documento glOrtho, con valori sostituiti:

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

Conserva questa matrice in un'uniforme e puoi quindi applicarla (ad esempio, esegui il prodotto M. V) alle posizioni del vertice in arrivo.


Caro Bahbar, grazie per la risposta. Quindi, in sostanza, non c'è nient'altro di diverso in ES2.0, creando manualmente la sostituzione della matrice glOrtho ().
Bunkai.Satori,

@ Bunkai.Satori: Beh, in genere c'è un po 'di più, GL carica un composito di modelview e proiezione su un'uniforme.
Bahbar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.