Cesium 1.102以上的版本主要支持WebGL 2,这意味着着色器语言(GLSL)的版本也有所变化。在WebGL 2环境下,GLSL ES 3.00版本被广泛采用,而WebGL 1则通常使用GLSL ES 1.00版本。这种版本的改变影响了着色器的编写方式和可用的API。
下面是一些关键的语法区别:
1. texture
函数
在WebGL 1中,纹理采样使用texture2D
函数,而在WebGL 2中,推荐使用texture
函数。texture
函数提供了更多灵活性,并且能够支持不同类型的纹理单元。
WebGL 1 (GLSL ES 1.00):
vec4 texColor = texture2D(uTextureSampler, vTexCoord);
WebGL 2 (GLSL ES 3.00):
vec4 texColor = texture(uTextureSampler, vTexCoord);
2. 数据类型
在WebGL 2中引入了一些新的数据类型,例如uint
、int
等,以及更高精度的浮点数类型。
WebGL 1 (GLSL ES 1.00):
float myFloat;
WebGL 2 (GLSL ES 3.00):
uint myUint;
int myInt;
float myFloat;
3. 精度修饰符
WebGL 2增加了highp
、mediump
和lowp
精度修饰符的支持,这允许开发者更加精细地控制着色器中的精度。
WebGL 1 (GLSL ES 1.00):
varying vec2 vTexCoord;
WebGL 2 (GLSL ES 3.00):
varying mediump vec2 vTexCoord;
4. 着色器构造
WebGL 2允许使用更复杂的着色器结构,例如struct
,以及更高级的数学函数。
WebGL 2 (GLSL ES 3.00):
struct Light {
vec3 position;
vec3 color;
};
Light light;
void main() {
...
}
5. discard
关键字
在WebGL 2中,discard
关键字可以用来丢弃一个像素的片段,这在WebGL 1中是不允许的。
WebGL 2 (GLSL ES 3.00):
if (someCondition) {
discard;
}
6. in
和 out
关键字
在WebGL 2中,attribute
和varying
被in
和out
关键字所取代。
WebGL 1 (GLSL ES 1.00):
attribute vec4 aVertexPosition;
varying vec2 vTexCoord;
WebGL 2 (GLSL ES 3.00):
in vec4 aVertexPosition;
out vec2 vTexCoord;
7. layout
关键字
在WebGL 2中,layout
关键字可以用来指定变量的位置和其他属性。
WebGL 2 (GLSL ES 3.00):
layout(location = 0) in vec4 aVertexPosition;
8. 函数重载
在WebGL 2中,可以定义多个同名但参数类型不同的函数,这在WebGL 1中是不允许的。
9. 纹理采样器类型
WebGL 2支持多种类型的纹理采样器,例如sampler2D
, samplerCube
, isampler2D
等。
9. 片段着色器中用于输出最终颜色gl_FragColor改为out_FragColor
WebGL 1 (GLSL ES 1.00):
gl_FragColor = mix(gl_FragColor,helsing_invisibleAreaColor,.5);
WebGL 2 (GLSL ES 3.00):
out_FragColor = mix(out_FragColor ,helsing_invisibleAreaColor,.5);