2010-11-17 10 views
25

Sto provando ad usare OpenGL Shading Language (GLSL) versione 1.5 per creare vertex e geometrie shader.Come si ottengono le matrici di modelview e di proiezione in OpenGL?

Ho appreso che in GLSL versione 1.5, le variabili predefinite come gl_ModelViewProjectionMatrix sono deprecate quindi è necessario passarle manualmente. Se ho già impostato le matrici modelview e di proiezione (usando gluLookAt e gluPerspective per esempio), come faccio a far passare le matrici nei vertici e negli shader geometrici? Ho fatto qualche ricerca e alcuni siti sembrano menzionare una funzione glGetMatrix(), ma non riesco a trovare quella funzione in alcuna documentazione ufficiale, e non sembra esistere nell'implementazione che sto usando (ottengo un errore di compilazione unknown identifier: glGetMatrix quando provo a compilarlo con quella funzione).

risposta

56

Hey, cerchiamo di rallentare un po 'qui :) Sì, è vero che si riceve la matrice da glGetFloatv(GL_MODELVIEW_MATRIX, ptr). .. Ma non è assolutamente quello che dovresti fare qui!

Mi spiego:

In GLSL, built-in variabili come gl_ModelViewProjectionMatrix o funzioni come ftransform() sono deprecate - che è di destra, ma è solo perché l'intero stack matrice è deprecato in GL 3.x e dovresti usare il tuo matrix stack (o usare qualsiasi altra soluzione, uno stack matrix è utile ma non è obbligatorio!).

Se si utilizza ancora lo stack matrix, si fa affidamento sulla funzionalità da OpenGL 2.xo 1.x. Va bene visto che tutto questo è ancora supportato su schede grafiche moderne a causa del profilo di compatibilità GL - è bene passare a una nuova versione GL, ma per ora puoi stare con questo.

Ma se si utilizza una versione precedente di OpenGL (con stack matrix), utilizzare anche una versione precedente di GLSL. Prova 1.2, perché le versioni superiori (incluso la 1.5) sono progettate per essere compatibili con OpenGL3, dove cose come le matrici di proiezione o modelview non esistono più in OpenGL e dovrebbero essere passate esplicitamente come variabili personalizzate, definite dall'utente uniform se necessario .

La corrispondenza tra le versioni di OpenGL e GLSL usato per essere un po 'complicato (prima ripulito la versione di numerazione per abbinare), ma dovrebbe essere più o meno simile a:

GL GLSL 

4.1 - 4.1 
4.0 - 4.0 
3.3 - 3.3 
3.2 - 1.5 
3.1 - 1.4 
3.0 - 1.3 
2.x and lower - 1.2 and lower 

Insomma, per farla short - le uniformi built-in shader sono deprecate perché anche la funzionalità corrispondente in OpenGL è deprecata; o vai per una versione più alta di OpenGL o una versione precedente di GLSL.

+0

+1 Questo è un punto eccellente che hai sollevato! – Stringer

+0

Quindi, con lo stack matriciale svalutato, non sono sicuro di quale dovrebbe essere il nuovo approccio. Nel nostro vecchio codice abbiamo applicato le trasformazioni agli oggetti istanziati e resi ciascuno da una funzione comune. Quindi sembra che ora per farlo funzionare avrei bisogno di aggiornare manualmente la matrice modelView dopo ogni trasformazione. Qual è il nuovo paradigma per fare questo? – Nigel

+1

Se si desidera uno stack matrix in GL3 +, creare un 'std :: vector ' e passare l'oggetto matrice più in alto con 'glUniformMatrix4fv'. Puoi averne parecchi e sei in grado di decidere come utilizzare ognuno dei tuoi ombreggiatori. – Kos

10

Per ottenere sia di matrice si utilizza il GL_MODELVIEW_MATRIX costanti o GL_PROJECTION_MATRIX con glGetxxxx:

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 
1
float modelview[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, modelview); 
Problemi correlati