GLSL变量默认初始化值是什么?int、vec4数组默认值规则
GLSL默认初始化规则说明
GLSL的变量默认初始化逻辑和C/C++、Java都不相同,规则不是全局统一的,核心按变量的存储周期、作用域划分:
- 无存储限定符的局部自动变量(即声明在函数/代码块内部的普通变量,包括main函数内声明的变量):不会被编译器自动初始化,在第一次被显式赋值前读取它的值属于未定义行为,会得到随机垃圾值,这一点和C/C++的局部变量规则一致。
- 具备静态存储周期的变量:如果没有写显式初始化语句,会被编译器自动初始化为对应类型的零值。这类变量包括全局作用域声明的所有变量、
uniform限定符修饰的变量、着色器存储块(SSBO)的成员等。注意:
in/out通道变量的初始值不由着色器本身决定:in变量的值来自渲染管线的上一阶段输出,out变量如果没有被着色器主动赋值,输出到下一阶段/帧缓冲的结果是未定义的。
不同类型的零值规则非常明确:
- 标量类型:
int/uint为0,float/double为0.0,bool为false - 向量/矩阵类型:所有分量为对应标量类型的零值
- 数组/结构体类型:所有元素/成员递归执行上述零值初始化规则
提问中两个变量的默认值分情况判定:
int val;- 若声明在函数内部作为普通局部变量:值未定义,直接读取会触发未定义行为
- 若声明在全局作用域、或带静态存储周期相关的限定符:默认值为
0
vec4 arr[20];- 若声明在函数内部作为普通局部变量:数组内20个
vec4元素的所有分量值全部未定义,读取任意位置都是未定义行为 - 若声明在全局作用域、或属于静态存储周期变量:数组所有元素的全部分量都会被初始化为
0.0,等价于20个vec4(0.0)元素。
- 若声明在函数内部作为普通局部变量:数组内20个
踩坑提示:不要轻信“GLSL所有变量默认初始化为0”的错误说法,局部变量未初始化是很多随机渲染噪点、偶发花屏类bug的常见诱因,实际开发中最好给局部变量显式赋初值。
内容的提问来源于stack exchange,提问作者user11632619
相关产品推荐
相关产品推荐

