GLSL 4.1 с gl_ModelViewProjectionMatrix

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

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

// GLSL VERTEX SHADER
#version 120

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

Мой сквозной геометрический шейдер использует 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? Или что-то еще, о чем я не думаю?

5
задан atb 4 April 2012 в 15:52
поделиться