glsl语法之变量限定符

|修饰符|说明|

|---|---|

|__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中,可以和任意基本类型变量组合.

猜你喜欢

转载自blog.csdn.net/u012861978/article/details/126511843