在 glsl 中初始化全局变量?

Initializing global variables in glsl?

本文关键字:全局变量 初始化 glsl      更新时间:2023-10-16

在我的设置中工作正常,但想确定一下。 使用 glsl 430,我的几何着色器中有这个

#version 430
layout (points) in;
layout (triangle_strip) out;
layout (max_vertices = 24) out;
uniform mat4 u_projMatrix;
uniform mat4 u_viewMatrix;
mat4 viewProjection = u_projMatrix * u_viewMatrix;
void someFunction1(){
// uses viewProjection 
}
void someFunction2(){
// uses viewProjection 
}
void main()
{
// uses viewProjection 
}

我担心的是viewProjection,我希望viewProjectionmain()之前初始化。我浏览了 glsl 手册,看起来它会做到这一点,并且应该编译得很好。如果它不是有效的代码,有人可以参考我到规范中的部分,谢谢

是的,这段代码在技术上很好。该规范允许您使用任意表达式来初始化全局变量,甚至是使用uniforms 等的全局变量。本质上,它们将在main开始之前执行。

但你实际上不应该使用它。

首先,这种事情在着色器代码中非常罕见。因此,OpenGL实现不太可能针对它进行适当的测试。这意味着实现以某种方式出错的可能性更大。main编写代码要安全得多。

其次,你隐藏了着色器的成本。如果您的初始化不是常量表达式,那么它们实际上会花费执行时间。但是你不会在main或任何函数main调用中看到它。它将存在于您通常认为的"代码"之外。但它仍然会性价比高。