2012-04-04 22 views
5

Sto lavorando ad un programma glsl shader come parte di un plugin che gira all'interno di un'applicazione "closed source". L'applicazione (maya) è scritta usando opengl 2.1, ma le nostre schede grafiche supportano opengl/glsl 4.1 e voglio usare tassellatura e shader geometrici nel mio programma. L'applicazione imposta il viewport opengl e il tradizionale stack model/view matrix e non ho il controllo su quella parte del codice.GLSL 4.1 con gl_ModelViewProjectionMatrix

mio pass-through vertex shader utilizza GLSL 1.2 e funziona bene:

// GLSL VERTEX SHADER 
#version 120 

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

mio pass-through geomery Shader utilizza GLSL 4.1 e funziona anche bene all'interno dell'applicazione:

// 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(); 
} 

Ma questo è solo un test pass-through. Nel mio vero shader di geometria ho bisogno di fare alcuni calcoli nello spazio del mondo, ma i punti dello shader della geometria sono nello spazio di vista. La mia domanda è: posso accedere a gl_ModelViewProjectionMatrix all'interno di uno shader di geometria 4.1? Capisco che il tradizionale stack matrix sia stato deprecato in glsl 4.1 a favore di variabili uniformi, ma non posso cambiare l'applicazione. Non posso usare glsl 1.2 nel mio shader di geometria perché ho bisogno del tipo di input lines_adjacency. Devo copiare la matrice in una variabile uniforme nella sorgente C++ del mio plugin? O c'è una "porta di servizio" per arrivare direttamente da glsl 4.1? O qualcos'altro a cui non sto pensando?

risposta

7

È possibile utilizzare la modalità di compatibilità (se l'implementazione GL supporta) dicendo:

#version 410 compatibility 

nello shader. Ciò riattiverà tutto lo stato uniforme globale deprecato (tra le altre cose)