在 glsl 中初始化全局变量?
Initializing global variables in glsl?
在我的设置中工作正常,但想确定一下。 使用 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
,我希望viewProjection
在main()
之前初始化。我浏览了 glsl 手册,看起来它会做到这一点,并且应该编译得很好。如果它不是有效的代码,有人可以参考我到规范中的部分,谢谢
是的,这段代码在技术上很好。该规范允许您使用任意表达式来初始化全局变量,甚至是使用uniform
s 等的全局变量。本质上,它们将在main
开始之前执行。
但你实际上不应该使用它。
首先,这种事情在着色器代码中非常罕见。因此,OpenGL实现不太可能针对它进行适当的测试。这意味着实现以某种方式出错的可能性更大。用main
编写代码要安全得多。
其次,你隐藏了着色器的成本。如果您的初始化不是常量表达式,那么它们实际上会花费执行时间。但是你不会在main
或任何函数main
调用中看到它。它将存在于您通常认为的"代码"之外。但它仍然会性价比高。
相关文章:
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 静态全局变量初始化顺序
- C++全局变量初始化顺序
- 没有全局变量初始化
- 全局变量初始化
- 生成文件:在全局变量初始化之前通过"make all"命令运行 bash 脚本
- 数学运算中的全局变量初始化,机器做什么
- 共享库中全局变量初始化时出现分段错误