全局常量还必须用常量表达式初始化吗?

Rus*_*lan 0 constants global-variables glsl

自 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);
}
Run Code Online (Sandbox Code Playgroud)

以下是我测试编译的方法(以避免任何 OpenGL 代码):

#version 420
uniform vec2 v;
const float x=v.x;

out vec4 color;
void main()
{
    color=vec4(x,v.y,0,1);
}
Run Code Online (Sandbox Code Playgroud)

如果我将const float x=v.x;行移到函数体中main,编译将成功结束。

OTOH,nvidia 驱动程序(像往常一样)更加宽容,接受原始代码而不发出警告。

那么,GLSL 4.20+ 实际上是否禁止const在全局范围内使用 -限定变量的非常量表达式初始值设定项,或者这个错误是 Mesa 错误吗?

Nic*_*las 5

GLSL 的所有版本都const禁止使用常量表达式(或者对于 SPIR-V 绑定的 GLSL,涉及常量表达式和专门化常量的表达式)以外的任何内容来初始化限定的全局变量。

4.20 中唯一改变的是,以前声明的任何非参数变量都const仅限于通过常量表达式进行初始化。4.20 允许函数局部变量被const非常量表达式初始化。但仅此而已。

本质上,GLSL 中的全局const变量类似于 C++11constexpr变量。局部const变量就像 C++const变量。