由于 GLSL 4.20const
限定变量不再需要由常量表达式初始化。但是当我实际尝试定义一个由非常量表达式初始化的全局const
限定变量时,Mesa会发出错误。下面是示例代码:
#version 420
uniform vec2 v;
const float x=v.x;
out vec4 color;
void main()
{
color=vec4(x,v.y,0,1);
}
以下是我测试编译的方式(以避免任何OpenGL代码(:
$ glsl_compiler --version 420 test.frag
Info log for test.frag:
0:3(15): error: initializer of const variable `x' must be a constant expression
如果我将const float x=v.x;
行移动到main
函数体中,编译将成功结束。
OTOH,英伟达驱动程序,(像往常一样(更加宽容,在没有警告的情况下接受原始代码。
那么,GLSL 4.20+ 是否实际上禁止全局范围内const
限定变量的非常量表达式初始值设定项,或者此错误是 Mesa 错误?
所有版本的GLSL 都禁止使用常量表达式以外的任何内容初始化const
限定的全局变量(对于 SPIR-V 绑定的 GLSL,涉及常量表达式和专用常量的表达式(。
4.20 中关于这一点的唯一变化是,以前,任何声明const
的非参数变量都仅限于通过常量表达式进行初始化。 4.20 允许函数局部变量在由非常量表达式初始化时const
。但仅此而已。
本质上,GLSL 中的全局const
变量类似于 C++11constexpr
变量。局部const
变量类似于C++const
变量。