我正在开发一个 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();
}
但这只是一个通过测试。在我真正的几何着色器中,我需要在世界空间中进行一些计算,但几何着色器点在视图空间中。我的问题是:我可以在 4.1 几何着色器中访问 gl_ModelViewProjectionMatrix 吗?我知道在 glsl 4.1 中不推荐使用传统的矩阵堆栈,以支持统一变量,但我无法更改应用程序。我无法在几何着色器中使用 glsl 1.2,因为我需要 lines_adjacency 输入类型。我是否需要将矩阵复制到插件的 C++ 源代码中的统一变量中?还是有一个“后门”可以直接从 glsl 4.1 获得它?还是我没有想到的其他东西?