2012-01-01 176 views
3

GLSL有许多预定义的全局变量,例如gl_lightsource。它们是全球性的,因为任何着色器都可以访问它们。GLSL全局变量

如何在GLSL中定义自定义全局变量?

回答

4

全局变量在GLSL中不存在。 gl_*变量是硬编码变量(将它们视为自动添加编译时间)从着色器访问流水线的非可编程元素。在核心OpenGL 3.0中,大部分已被删除,包括gl_LightSource。现在,用户需要处理他自己的矩阵和灯光,并将它们作为制服发送给着色器。如果你想查看所有剩下的列表,你应该看看GLSL Reference Pages

你想要的是制服。如果要在着色器之间同步校服,请存储制服的位置,并遍历所有程序以将制服上载到每个着色器。

1

OpenGL中的全局着色器变量称为“制服”。它们是只读的,可以用glUniformX调用绑定。粗略地说,它看起来像这样(这更是一个伪代码的):

// 1. activate the program 
glUseProgram(program) 

// 2. get uniform location 
foo = glGetUniformLocation(program, "foo") 

// 3. bind the value, e.g. a single float 
glUniform1f(foo, 42.0) 

着色器中,您需要uniform存储预选赛中,例如出线变量

uniform float foo; 
+0

但是那么如果program2想访问foo呢? – 2012-01-02 03:01:04

+0

@KevinKostlan:没有什么能阻止你在多个程序中使用同一套制服。只要按照上述过程为每一个。 – 2012-01-02 03:03:09

+0

我希望有一个相机矩阵,我可以做一次glUniformX,然后每个着色器都会有它(节省时间)。我想这不存在。 – 2012-01-02 18:53:26