我正在开发一个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;
}
Run Code Online (Sandbox Code Playgroud)
我的传递几何着色器使用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();
}
Run Code Online (Sandbox Code Playgroud)
但这只是一个传递测试.在我的真实几何着色器中,我需要在世界空间中进行一些计算,但几何着色器点在视图空间中.我的问题是:我可以在4.1几何着色器中访问gl_ModelViewProjectionMatrix吗?我知道传统的矩阵堆栈已经在glsl 4.1中被弃用,而不是统一变量,但我无法改变应用程序.我不能在几何着色器中使用glsl 1.2,因为我需要lines_adjacency输入类型.我是否需要在我的插件的C++源代码中将矩阵复制到一个统一变量中?或者是否有一个"后门"直接从glsl 4.1获取它?或者其他我没想到的东西?
您可以使用兼容模式(如果您的GL实现支持它):
#version 410 compatibility
Run Code Online (Sandbox Code Playgroud)
在着色器中.这将重新启用所有已弃用的全局统一状态(除其他外)