全局常量是否仍然必须使用常量表达式进行初始化?



由于 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变量。

相关内容

  • 没有找到相关文章

最新更新