繁体   English   中英

全局常量还需要用常量表达式初始化吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM