webgl 的 attribute、 uniform 、 vary 变量
webgl 的 attribute、 uniform 、 varying变量
webgl 中可以使用 attribute、 uniform 、 varying给 Shader 传参 。
关键字(变量类型) | 数据传递 | 声明变量 |
---|---|---|
attribute | javascript——>顶点着色器 | 声明顶点数据变量 |
uniform | javascript——>顶点、片元着色器 | 声明非顶点数据变量 |
varying | 顶点着色器——>片元着色器 | 声明需要插值计算的顶点变量 |
attribute
在着色器中声明了attribute变量∶
1 |
|
通过 js 获取 attribute 变量的存储位置
1 |
|
js 给 attribute 变量赋值
1 |
|
**location ** 要修改的uniform 属性位置
value v0, v1, v2, v3 指定传输给uniform 变量各个分量的值
类型:
浮点值 Number(方法名跟”f”).
浮点数组 ( 例如 Float32Array 或 Array 的数组) 用于浮点型向量方法 ( 方法名跟 “fv” ).
通过缓存 给 attribute 变量赋值
1 |
|
uniform
uniform变量一般用于从 JavaScript程序向顶点着色器和片元着色器传输 (静态)不变的 数据 。
在着色器中声明了 uniform 变量∶
1 |
|
通过 js 获取 Uniform 变量的存储位置
1 |
|
通过 js 给 Uniform 变量赋值
1 |
|
1 |
|
**location ** 要修改的uniform 属性位置
value v0, v1, v2, v3 指定传输给uniform 变量各个分量的值
类型:
- 浮点值 Number(方法名跟”f”).
- 浮点数组 ( 例如 Float32Array 或 Array 的数组) 用于浮点型向量方法 ( 方法名跟 “fv” ).
- 整型值 Number (方法名跟”i”).
- 整型数组 Int32Array 用于整型向量方法 (方法名跟 “iv”).
varying
uniform 变量可以向片元着色器传递静态的值 ,varying 却可以向片元着色器传递动态的值 (插值) ,varying 变量的只能从顶点着色器向片元着色器传输数据,不能直接通过js 向片元着色器传递。
示例代码:
1 |
|
上述代码中,我们在 varying 变量中为三角形的3个不同顶点指定了3种不同颜色,而三角形表面上这些片元的颜色值都是WebGL 系统用这3个顶点的颜色内插出来的。
什么是内插
例如,考虑一条两个端点的颜色不同的线段。一个端点的颜色为红色(1.0,0.0,0.0),而另一个端点的颜色为蓝色(0.0,0.0.1.0)。我们在顶点着色器中向 varying 变量y color 赋上这两个颜色(红色和蓝色),那么 WebGL 就会自动地计算出线段上的所有点(片元)的颜色,并赋值给片元着色器中的 varying 变量v_color(如图所示)。
在这个例子中 RGBA中的R值从1.0降低为0.0,而 B值则从0.0上升至1.0,线段上的所有片元的颜色值都会被恰当地计算出来——这个过程就被称为内插过程。一旦两点之间每个片元的新颜色都通过这种方式被计算出来后,它们就会被传给片元着色器中的 v_color变量。