Я работаю над программой 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? Или что-то еще, о чем я не думаю?