变量与数据类型
- 整型(有符号,无符号)
int iValue = 3;
uint uiValue = 3u; - 浮点数(单精度)
float fValue = 3.1415f; - 布尔值
bool bValue = false; - 向量类型
vec2/vec3/vec4 2/3/4分量浮点向量
ivec2/ivec3/ivec4 2/3/4分量整型向量
uvec2/uvec3/uvec4 2/3/4分量无符号整型向量
bvec2/bvec3/bvec4 2/3/4分量无符号布尔向量
// 声明4分量float向量
vec4 v1;
// 声明4分量向量并赋值
vec4 v2 = vec4(1,2,3,4);
vec4 v3 = vec4(0,0,0,0);
// 向量运算
// 向量相加
v1 = v2 + v3;
vec4 v4 = v1;
v1 += vec4(10,10,10,10);
v1 *= 5;
// 通过x,y,z,w 赋值
v1.x = 3.0f;
v1.y = 4.0f;
v1.z = 5.0f;
v1.w = 1.0f;
v1.xy = vec2(1,2);
v1.xyz = vec3(1,2,3);
// 通过r,g,b,a 赋值
v2.r = 1.0f;
v2 = vec4(1.0f,1.0f,1.0f,1.0f);
// 通过s,t,p,q 纹理坐标分量
v1.st = vec2(1.0,2.0);
v1.st = v2.st;
// 不能混用,如下
v1.st = v2.xt;
// 向量类型swizzle调换
// 将RGB转为BGR
v1.bgra = v2.rgba;
// 一次性操作几个分量
v1.x = v2.x + 5.0f;
v1.xyz = v2.xyz + vec3(5.0f,4.0f,1.0f);
- 矩阵类型
mat2/mat2x2 两行两列矩阵
mat3/ mat 3x3 三行三列矩阵
mat4/ mat4x4 四行四列矩阵
mat2x3 二行三列
mat2x4 二行四列
mat3x2 三行二列
mat3x4 三行四列
mat4x2 四行二列
mat4x3 四行三列
mat4 m;
vec4 v;
vec4 out;
m = mat4(
1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0
);
// m = mat4(1.0)
out = v * m ;
限定符
- <none> 普通本地变量,外部不可见不可访问
- const 编译常量,对函数来说是只读参数
- varying 从前一阶段传过来的变量
- varying centroid 从前一阶段传过来的变量,质心插值
- attribute 传递到下一个处理阶段或者在一个函数中指定返回值
- attribute centroid 传递到下一个处理阶段,质心插值
- uniform 一个从客户端代码传递过来的变量,在顶点之间不做改变
实际使用
- xcode创建空白文件,命名为shaderv.vsh,顶点着色器
// 传入的顶点位置向量
attribute vec4 position;
// 传入的纹理向量,需要传到片元着色器
attribute vec2 textCoordinate;
// 旋转矩阵
uniform mat4 rotateMatrix;
// 传到下一阶段参数
varying lowp vec2 varyTextCoord;
void main() {
// 将纹理向量传递到片元着色器
varyTextCoord = textCoordinate;
//position 不可变参数
vec4 vPos = position;
// 顶点向量乘以旋转矩阵,得到新的位置向量
vPos = vPos * rotateMatrix;
// 将变化后的位置传给内建变量
gl_Position = vPos;
}
- 创建空白文件,命名为shaderf.fsh,片元着色器
// 顶点着色器传递过来的
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main() {
// 将顶点着色器传过来的纹理向量,生成2D纹理,并传给内建变量
gl_FragColor = texture2D(colorMap, varyTextCoord);
}
(本文为学习笔记,资料来自CC老师)