[英]Do global constants still have to be initialized with constant expressions?
由于 GLSL 4.20 const
限定的变量不再需要由常量表达式初始化。 但是当我真正尝试定义一个由非常量表达式初始化的全局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=vx;
行到main
function主体,编译成功结束。
OTOH,nvidia 驱动程序,(像往常一样)更加宽容,接受原始代码而不发出警告。
那么,GLSL 4.20+ 是否实际上禁止全局 scope 中const
限定变量的非常量表达式初始化程序,或者这个错误是 Mesa 错误?
所有版本的 GLSL 都禁止使用除常量表达式(或对于 SPIR-V 绑定的 GLSL,涉及常量表达式和专门化常量的表达式)以外的任何内容来初始化const
限定的全局变量。
在 4.20 中唯一改变的是,以前,任何声明为const
的非参数变量都被限制为通过常量表达式进行初始化。 4.20 允许函数局部变量在被非常量表达式初始化时为const
。 但仅此而已。
本质上,GLSL 中的全局const
变量类似于 C++11 constexpr
变量。 局部const
变量类似于 C++ const
变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.