5

我正在开发一个 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 获得它?还是我没有想到的其他东西?

4

1 回答 1

8

您可以通过以下方式使用兼容模式(如果您的 GL 实现支持它):

#version 410 compatibility

在着色器中。这将重新启用所有已弃用的全局统一状态(除其他外)

于 2012-04-04T17:05:46.550 回答