2010-11-17 3 views
25

Ich versuche, die OpenGL Shading Language (GLSL) Version 1.5 zu verwenden, um Vertex- und Geometrie-Shader zu erstellen.Wie erhalten Sie die Modelview und Projektionsmatrizen in OpenGL?

Ich habe gelernt, dass in GLSL Version 1.5 die eingebauten Variablen wie gl_ModelViewProjectionMatrix veraltet sind, so dass Sie sie manuell übergeben müssen. Wenn ich die Modelview- und Projektionsmatrizen bereits eingestellt habe (zum Beispiel mit gluLookAt und gluPerspective), wie bekomme ich dann die Matrizen in die Vertex- und Geometrie-Shader? Ich habe einige Suche durchgeführt und einige Websites scheinen eine Funktion glGetMatrix() zu erwähnen, aber ich kann diese Funktion in keiner offiziellen Dokumentation finden, und es scheint nicht in der Implementierung, die ich verwende, zu existieren (ich bekomme einen Kompilierungsfehler unknown identifier: glGetMatrix wenn ich versuche, es mit dieser Funktion zu kompilieren).

Antwort

56

Hey, lasst uns hier ein wenig langsamer :) Ja, das ist wahr, dass Sie die Matrix von glGetFloatv(GL_MODELVIEW_MATRIX, ptr) erhalten. .. Aber das ist definitiv nicht das, was Sie hier tun sollten!

Lassen Sie mich erklären:

In GLSL, integrierten Variablen wie gl_ModelViewProjectionMatrix oder Funktionen wie ftransform() sind veraltet - das ist richtig, aber das ist nur, weil der gesamte Matrix-Stack in GL 3.x ist veraltet und Sie sollten Ihren eigenen Matrix-Stack verwenden (oder eine andere Lösung verwenden, ein Matrix-Stack ist hilfreich, aber nicht obligatorisch!).

Wenn Sie immer noch den Matrix-Stack verwenden, dann verlassen Sie sich auf die Funktionalität von OpenGL 2.x oder 1.x. Das ist in Ordnung, da all dies aufgrund des GL-Kompatibilitätsprofils immer noch auf modernen Grafikkarten unterstützt wird - es ist gut, auf eine neue GL-Version umzusteigen, aber Sie können damit vorerst fortfahren.

Aber Wenn Sie eine ältere Version von OpenGL (mit Matrix-Stack) verwenden, verwenden Sie auch eine ältere Version von GLSL. Versuchen Sie 1.2, da höhere Versionen (einschließlich Ihrer Version 1.5) mit OpenGL3 kompatibel sind, wo Dinge wie Projektions- oder Modelview-Matrizen in OpenGL nicht mehr existieren und bei Bedarf explizit als benutzerdefinierte, benutzerdefinierte uniform Variablen übergeben werden sollen .

Die Korrespondenz zwischen OpenGL und GLSL-Versionen verwendeten ein bisschen schwierig sein (bevor sie die Version bereinigt Nummerierung entsprechen), aber es sollte mehr oder weniger ähnlich sein: So lange Geschichte

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 

Kurz - die eingebauten Shader-Uniformen sind veraltet, da die entsprechende Funktionalität in OpenGL ebenfalls veraltet ist. entweder für eine höhere Version von OpenGL oder eine niedrigere Version von GLSL.

+0

+1 Das ist ein ausgezeichneter Punkt, den du angesprochen hast! – Stringer

+0

Also mit dem abgeschriebenen Matrix-Stack bin ich nicht sicher, was der neue Ansatz sein sollte. In unserem alten Code haben wir Transformationen auf instanzierte Objekte angewendet und jede von einer gemeinsamen Funktion gerendert. Es scheint also so zu sein, dass ich die ModelView-Matrix nach jeder Transformation manuell aktualisieren müsste. Was ist das neue Paradigma dafür? – Nigel

+1

Wenn Sie einen Matrixstack in GL3 + erstellen möchten, erstellen Sie einen 'std :: vector ' und übergeben Sie das oberste Matrixobjekt mit 'glUniformMatrix4fv'. Sie können mehrere davon haben, und Sie können entscheiden, wie Sie jedes in Ihren Shadern verwenden. – Kos

10

Um entweder Matrix erhalten Sie die Konstanten GL_MODELVIEW_MATRIX oder GL_PROJECTION_MATRIX mit glGetxxxx verwenden:

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 
1
float modelview[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, modelview); 
Verwandte Themen