关于 opengl:GLSL 在程序之间共享制服 #130

GLSL share uniforms among programs #130

我目前正试图弄清楚如何在旧 GLSL 中的着色器之间共享制服。
在制服前坚持"共享"并没有编译。
编辑:我知道制服的范围是一个程序。
一个例子可以是模型-投影-矩阵。不想为每个程序单独设置一次。

有什么办法吗?

这是(顶点)着色器代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#version 130
in vec4 position;
in float size;
in vec4 incol;
out vec4 color;
shared uniform ivec4 relWorldOffset;
uniform vec4[14] cubestrip;
uint cubeindex;
void main()
{
  gl_Position = gl_ModelViewProjectionMatrix
   * (cubestrip[cubeindex] * size
   + relWorldOffset + position);
  cubeindex++;
  color = incol;
  cubeindex %= 14U;

这是错误:

1
0:6(1): error: syntax error, unexpected NEW_IDENTIFIER, expecting $end


在 GLSL 中没有像这样的 shared 关键字。您可能正在寻找统一块或统一缓冲区对象 (UBO)。根据 OpenGL wiki,它们需要 OpenGL 3.1 版(因此需要 GLSL #version 140 或更高版本)。如果这不是问题,GLSL 语法如下:

1
2
3
4
5
uniform MatrixBlock
{
    mat4 projection;
    mat4 modelview;
};

另外,请查看本教程和 GLSL 1.40 规范(第 4.3.5.1 章)以获取更多指导。

(编辑:实际上,在最近的 OpenGL 版本中定义了 shared 关键字,但它仅用作计算着色器中的布局限定符,以使变量在工作组内共享。)