一:顶点着色器
precision highp float;
varying lowp vec2 vTextCoor;
varying lowp vec4 varyColor;
uniform sampler2D colorMap;
void main()
{
vec4 weakMask = texture2D(colorMap, vTextCoor);
vec4 mask = varyColor;
float alpha = 0.3;
vec4 tempColor = mask * (1.0 - alpha) + weakMask * alpha;
gl_FragColor = tempColor;
}
// gl_Position
// gl_PointSize
2:顶点着色器任务
1:矩阵变换位置
2:计算光照公式生成逐顶点颜色
3:生成/变换纹理坐标
总结:它可以用于执行自定义计算,实施新的变换,照明或者传统的固定功能所不允许的基于顶点的效果。
3:顶点着色器内建特殊变量
gl_VertexID
gl_InstanceID
gl_Position
gl_PointSize
gl_FrontFacing
4:内建Uniform--统一变量
参考:https://blog.csdn.net/linuxheik/article/details/79582106
shader中与外部连接的常量,初始化之后不能够修改其值。否则会引起编译错误。
在shader中定义
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
在外部调用
//11.找到myProgram中的projectionMatrix、modelViewMatrix 2个矩阵的地址。如果找到则返回地址,否则返回-1,表示没有找到2个对象。
GLuint projectionMatrixSlot = glGetUniformLocation(self.myProgram, "projectionMatrix");
GLuint modelViewMatrixSlot = glGetUniformLocation(self.myProgram, "modelViewMatrix");
5:顶点着色器内建常量
const mediump int gl_MaxVertexAttribs = 16; //顶点着色器中属性的最大数量
const mediump int gl_MaxVertexUniformVectors = 256; //顶点着色器中统一变量的最大数量
const mediump int gl_MaxVertexOutputVectors = 16; //顶点着色器中输出向量的最大数量
const mediump int gl_MaxVertexTextureImageUnits = 16; //顶点着色器中纹理单元的最大数量
const mediump int gl_MaxCombinedTextureImageUnits = 32;//顶点着色器和片元着色器中纹理单元最大数量的总和
6:内建特殊变量
变量 | 描述 |
---|---|
gl_VertexID | 输入变量,用于保存顶点的整数索引。highp 精度的整数变量 |
gl_InstanceID | 输入变量,用于保存实例化绘图调用中图元的实例编号。highp 精度的整数变量,通常情况下为 0 |
gl_Position | 输出变量,用于输出顶点作为的裁剪坐标。highp 精度的浮点变量 |
gl_PointSize | 用于指定点精灵的尺寸,单位为像素。highp 精度的浮点变量 |
gl_FrontFacing | 不由顶点着色器直接写入,而是根据顶点着色器生成的位置值和渲染的图元类型生成,它是一个布尔变量 |
6:顶点着色器矩阵变换
MVP(矩阵变换)
模型--->视图--->投影
二:片元着色器
precision highp float;
varying lowp vec2 vTextCoor;
varying lowp vec4 varyColor;
uniform sampler2D colorMap;
void main()
{
vec4 weakMask = texture2D(colorMap, vTextCoor);
vec4 mask = varyColor;
float alpha = 0.3;
vec4 tempColor = mask * (1.0 - alpha) + weakMask * alpha;
gl_FragColor = tempColor;
}
//gl_FragColor
2:片元着色器业务
1:计算颜色
2:获取纹理
3:往像素点中填充颜色值【纹理值/颜色值】
总结:它可以用于图片。视频。图形中每个像素的颜色填充【比如给视频添加滤镜,实际上就是将视频中每个图片的像素点颜色填充进行修改】
3:内建常量
const mediump int gl_MaxFragmentInputVectors = 15; //片元着色器出入的最大数量
const mediump int gl_MaxTextureImageUnits = 16;//可用纹理图像单元的最大数量
const mediump int gl_MaxFragmentUniformVectors = 224;//片元着色器可用vec4 uniform变量的最大数量
const mediump int gl_MaxDrawBuffers = 4; //多重渲染目标最大支持数量
4:内建特殊变量
变量 | 描述 |
---|---|
gl_FragCoord | 只读变量,这个变量保存片元的窗口相对坐标 |
gl_ForntFacing | 只读变量,这个布尔变量是正面图元时为true否则为false |
gl_PointCoord | 只读变量,可以在渲染点精灵的时候使用,保存了点精灵的纹理坐标,这个坐标在点精灵光栅化期间自动生成,处于(0,1)区间。 |
gl_FragDepth | 一个只写输出变量,在片元着色器写入时,覆盖片元的固定功能深度值,尽量减少手动实现深度值写入,这个功能需要谨慎使用,因为它可能禁用许多GPU的深度优化,例如:许多GPU都有“Early-z”的功能,在执行片元着色器之前进行深度测试,使用“Early-z”的好处就是不能通过深度测试的片元就不会被着色(从而降低了着色器的调用次数,提高了性能)但是使用gl_FragDepth,就必须禁用该功能,因为GPU在执行着色器之前不知道深度值。 |
5:内建函数
常用内建函数
函数 | 说明 |
---|---|
dot | 点乘 |
cross | 叉乘 |
texture2D | 用于对纹理采样 |
normalize | 对于一个向量规格化 |
clamp | 将一个向量固定在一个最小值和最大值之间 |
pow | 幂函数(对矢量和标量同样有效,下同) |
exp,log | 指数函数,对数函数 |
abs | 绝对值 |
sqrt | 平方根 |
max,min | 最值 |
ceil,floor | 去大于实参的最小整数,取小于实参的最大整数 |
sin,cos,tan | 正三角函数 |
asin,acos,atan | 反三角函数 |
length | 向量长度 |
distance | 两个向量的距离 |
matrixCompMult | 矩阵对应元素分别相乘 |
transpose,determinant,inverse | 矩阵的转置,行列式,逆 |
lessThan,greaterThan,equal | 小于,大于,等于(对实参向量对应位置的每个分量做大小比较,生成布尔向量) |