- attribute变量:又称属性变量,该变量只能用于定点着色器,不能用于片元着色器,一般用于描述定点着色器的顶点位置、顶点颜色、顶点纹理坐标等;
- Uniforms变量:又称一致变量,该变量可以应用于顶点着色器和片元着色器,作用是把数据从应用程序传递到顶点着色器或者片元着色器,在shader程序内部,uniforms变量就像是C语言里面的常量const,即该变量的值不能被shader程序修改,其一般用于表示变换矩阵、光照参数、纹理采样器等。
- Varying变量:又称易变变量,其是从顶点着色器传递到片元着色器的数据变量。一般在顶点着色器中修改varying变量,在片元着色器中使用该变量,但其前提是在顶点shader和片元shader程序中的声明必须是一致的,如下面代码中的v_Color和v_TextureCoord(标红字体的):
//顶点着色器代码
uniform mat4 u_viewProjectionMatrix; //应用程序传入顶点着色器的总变换矩阵
attribute vec4 a_Position; //应用程序传入顶点着色器中的顶点位置
attribute vec4 a_Color; //应用程序传入顶点着色器中的顶点颜色数据
attribute vec4 a_TextureCoord; //应用程序传入顶点着色器中的纹理坐标
varying vec2 v_Color; //给片元着色器传递的顶点颜色数据
varying vec2 v_TextureCoord; //给片元着色器传递的顶点纹理数据
void main() {
gl_Position = u_viewProjectionMatrix * a_Position; //通过总变换矩阵计算此次绘制的顶点位置
v_Color = a_Color; //将顶点颜色数据传递给片元着色器
v_TextureCoord = a_TextureCoord; //将顶点纹理数据传递给片元着色器
}
//片元着色器代码
precision mediump float; //设置工作精度
varying vec2 v_Color; //接收从顶点着色器传递过来的顶点颜色数据
varying vec2 v_TextureCoord; //接收从顶点着色器传递过来的顶点纹理数据
uniform sampler2D u_texture; //纹理采样器,代表纹理
void main() {
gl_FragColor = texture2D(u_texture, v_TextureCoord) * v_Color;
}
其中gl_Position为内建变量,表示变换后顶点的空间位置。顶点着色器从应用程序中获取最原始的顶点位置,经过顶点着色器的平移、旋转、缩放等数学变换后,生成新的顶点位置,新的顶点位置在顶点着色器中写入到gl_Position,并传递到渲染管线的后继阶段继续处理。
gl_FragColor用来保存片元着色器计算完成的片元颜色值,其将送入渲染管线的后继阶段进行处理。
顶点着色器
片元着色器