【问题标题】:Do global constants still have to be initialized with constant expressions?全局常量还需要用常量表达式初始化吗?
【发布时间】:2019-10-03 18:18:45
【问题描述】:

自 GLSL 4.20 起,const 限定变量不再需要由常量表达式初始化。但是当我真正尝试定义一个由非常量表达式初始化的全局const-qualified 变量时,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,nvidia 驱动程序(像往常一样)更加宽容,接受原始代码而不发出警告。

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

【问题讨论】:

    标签: global-variables glsl constants


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多