|修饰符|说明|
|---|---|
|__none__|(默认的可省略)本地变量,可读可写,函数的输入参数既是这种类型|
|__const__|声明变量或函数的参数为只读类型|
|__attribute__|只能存在于vertex shader中,一般用于保存顶点或法线数据,它可以在数据缓冲区中读取数据|
|__uniform__|在运行时shader无法改变uniform变量, 一般用来放置程序传递给shader的变换矩阵,材质,光照参数等等.|
|__varying__|主要负责在vertex 和 fragment 之间传递变量 |
__const__:
和C语言类似,被const限定符修饰的变量初始化后不可变,除了局部变量,函数参数也可以使用const修饰符.但要注意的是结构变量可以用const修饰,
但结构中的字段不行.
const变量必须在声明时就初始化 `const vec3 v3 = vec3(0.,0.,0.)`
局部变量只能使用const限定符.
函数参数只能使用const限定符.
```cpp
struct light {
vec4 color;
vec3 pos;
//const vec3 pos1; //结构中的字段不可用const修饰会报错.
};
const light lgt = light(vec4(1.0), vec3(0.0)); //结构变量可以用const修饰
```
__attribute__:
attribute变量是`全局`且`只读`的,它只能在vertex shader中使用,只能与浮点数,向量或矩阵变量组合,
一般attribute变量用来放置程序传递来的模型顶点,法线,颜色,纹理等数据它可以访问数据缓冲区
(还记得__gl.vertexAttribPointer__这个函数吧)
```cpp
attribute vec4 a_Position;
```
__uniform__:
uniform变量是`全局`且`只读`的,在整个shader执行完毕前其值不会改变,他可以和任意基本类型变量组合,
一般我们使用uniform变量来放置外部程序传递来的环境数据(如点光源位置,模型的变换矩阵等等)
这些数据在运行中显然是不需要被改变的.
```cpp
uniform vec4 lightPosition;
```
__varying__:
varying类型变量是 vertex shader 与 fragment shader 之间的信使,一般我们在 vertex shader 中修改它然后在fragment shader使用它,但不能在
fragment shader中修改它.
```cpp
//顶点着色器
varying vec4 v_Color;
void main(){
...
v_Color = vec4(1.,1.,1.,1);
}
//片元着色器
varying vec4 v_Color;
void main() {
gl_FragColor = v_Color;
}
要注意全局变量限制符只能为 const、attribute、uniform和varying中的一个.不可复合.
总结比较:__uniform__与__attribute__都是全局只读,attribute只能在vertex shader中使用,只能与浮点数,向量或矩阵变量组合,uniform可以用在vertex和fragment Shader中,可以和任意基本类型变量组合.