2012-04-04 4 views
5

Я работаю над программой glsl shader как частью плагина, который работает внутри приложения с закрытым исходным кодом. Приложение (майя) написано с использованием opengl 2.1, но наши графические карты поддерживают opengl/glsl 4.1, и я хочу использовать тесселяционные и геометрические шейдеры в своей программе. Приложение устанавливает окно просмотра opengl и традиционный стек модели/представления, и я не контролирую эту часть кода.GLSL 4.1 с gl_ModelViewProjectionMatrix

Мой сквозная вершинные шейдеры использует GLSL 1.2 и работает отлично:

// GLSL VERTEX SHADER 
#version 120 

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

Мой сквозная geomery шейдер использует GLSL 4.1, а также прекрасно работает внутри приложения:

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

Но это это просто проходной тест. В моем реальном геометрическом шейдере мне нужно сделать некоторые вычисления в мировом пространстве, но геометрические шейдерные точки находятся в пространстве вида. Мой вопрос: могу ли я получить доступ к gl_ModelViewProjectionMatrix внутри геометрического шейдера 4.1? Я понимаю, что традиционный матричный стек устарел в glsl 4.1 в пользу однородных переменных, но я не могу изменить приложение. Я не могу использовать glsl 1.2 в моем шейдере геометрии, потому что мне нужен тип ввода lines_adjacency. Нужно ли копировать матрицу в однородную переменную в исходном C++-источнике плагина? Или есть «задняя дверь», чтобы добраться до него непосредственно из glsl 4.1? Или что-то еще, о чем я не думаю?

ответ

7

Вы можете использовать режим совместимости (если реализация GL поддерживает его), говоря:

#version 410 compatibility 

в затенении. Это позволит повторно использовать все устаревшее глобальное однородное состояние (среди прочего)