Opengl 全局变量

Opengl 全局变量,opengl,glsl,global,shader,Opengl,Glsl,Global,Shader,GLSL有许多预定义的全局变量,例如gl_光源。它们是全局的,因为任何着色器都可以访问它们 如何在GLSL中定义自定义全局变量?OpenGL中的全局着色器变量称为“制服”。它们是只读的,可以与调用绑定。大致上,它看起来是这样的(这更像是一个伪代码): 在着色器中,需要使用uniform存储限定符限定变量,例如 uniform float foo; GLSL中不存在全局变量。gl.*变量是硬编码变量(将其视为自动添加的编译时变量),用于从着色器访问管道的不可编程元素。在核心OpenGL 3.0中

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


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

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

在着色器中,需要使用
uniform
存储限定符限定变量,例如

uniform float foo;

GLSL中不存在全局变量。
gl.*
变量是硬编码变量(将其视为自动添加的编译时变量),用于从着色器访问管道的不可编程元素。在核心OpenGL 3.0中,大部分都被删除了,包括
gl\u LightSource
。用户现在需要处理自己的矩阵和灯光,并将它们作为制服发送给着色器。如果您想查看所有剩余的列表,您应该查看


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

您可以使用制服缓冲区。这里有一个教程:

持久变量的有用性绝对是值得追求的。OpenGL将实例作为gl3的一部分引入,但实际上是在gl4中完全建模的。此答案的目的是扩展其他答案,并提供有关实例VBO的信息

如果您有权访问gl4,则可以在实例化的VBO中加载数据,这些数据可以在每次绘制(而不是每个顶点)时更改,前提是它用于诸如平铺贴图之类的对象。您可以利用GLSL变量
gl_InstanceID
来检测正在进行的绘图调用

对于平铺贴图,可以使用一个模型(可能是两个三角形,即4个点、4个texcoords、6个索引,以形成一个四边形)渲染大量平铺。您可以使用正常的gl缓冲功能在cpu端轻松更新所述VBO的值。VBO可以保存类似tileid的内容,这有助于计算纹理坐标,为指定的瓷砖索引tilesheet。好处是它会根据每个实例进行更新

“在取款之间保存变量”的典型用例通常归结为需要一个计数器,
gl_InstanceID
绝对符合要求。这是除非你需要GPU做一些需要保存回来的事情

如果您所追求的是在GPU上进行计算,那么UBOs是一种非常好的方法,可以从GLSL着色器获取数据。正如@Arne建议的那样。但是,可能会有一些方法使用其他方法来完成您试图执行的操作,在一般使用中应该避免使用这些方法,除非您实际使用了大量统一变量

如果试图定义常量变量,可以使用const关键字。但是,这不会在着色器之间持续存在。仅在其上定义的着色器

const float example = 5.0;

但是如果program2想要访问foo呢?@KevinKostlan:没有什么能阻止你在多个程序中使用相同的制服。我希望有一个相机矩阵,我可以做一次glUniformX,然后每个着色器都会有它(节省时间)。我想那是不存在的。
const float example = 5.0;