2012-04-04 20 views
5

Ich arbeite an einem Glsl Shader-Programm als Teil eines Plugins, das innerhalb einer "Closed Source" -Anwendung ausgeführt wird. Die Anwendung (maya) wird mit opengl 2.1 geschrieben, aber unsere Grafikkarten unterstützen opengl/glsl 4.1 und ich möchte Tessellations- und Geometrie-Shader in meinem Programm verwenden. Die Anwendung richtet das OpenGL-Ansichtsfenster und den traditionellen Modell/Ansicht-Matrix-Stack ein und ich habe keine Kontrolle über diesen Teil des Codes.GLSL 4.1 mit gl_ModelViewProjectionMatrix

Mein Pass-Through-Vertex-Shader verwendet GLSL 1.2 und funktioniert gut:

// GLSL VERTEX SHADER 
#version 120 

void main() 
{ 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
} 

Mein Pass-Through-geomery Shader verwendet GLSL 4.1 und arbeitet auch in der Anwendung fein:

// GLSL GEOMETRY SHADER 
#version 410 

layout (lines_adjacency) in; 
layout (line_strip, max_vertices = 2) out; 

void main() 
{ 
    gl_Position = gl_in[1].gl_Position; 
    EmitVertex(); 
    gl_Position = gl_in[2].gl_Position; 
    EmitVertex(); 
    EndPrimitive(); 
} 

Aber diese ist nur ein Durchgangstest. In meinem realen Geometrie-Shader muss ich einige Berechnungen im Welt-Raum durchführen, aber die Geometrie-Shader-Punkte sind im Sicht-Raum. Meine Frage ist: Kann ich auf die gl_ModelViewProjectionMatrix in einem 4.1 Geometrie-Shader zugreifen? Ich verstehe, dass der traditionelle Matrixstack in Glsl 4.1 zugunsten einheitlicher Variablen veraltet ist, aber ich kann die Anwendung nicht ändern. Ich kann Glsl 1.2 nicht in meinem Geometrieshader verwenden, da ich den Eingabetyp lines_adjacency benötige. Muss ich die Matrix in eine einheitliche Variable in der C++ - Quelle meines Plugins kopieren? Oder gibt es eine "Hintertür", um direkt von Glsl 4.1 zu kommen? Oder etwas anderes, an das ich nicht denke?

Antwort

7

können Sie Kompatibilitätsmodus verwenden (wenn Ihre GL-Implementierung unterstützt es) mit den Worten:

#version 410 compatibility 

im Shader. Dadurch wird (unter anderem) der veraltete globale einheitliche Status wieder aktiviert.