顶点着色器
顶点着色器的内建变量可以分为特殊变量(顶点着色器输入/输出),统一状态(深度范围)以规定的最大值(属性数量,顶点着色器变量数量和统一变量数量)的常量。
顶点着色器内建特殊变量
gl_VertexID : 是一个输入变量,用于保存顶点的整数索引。这个整数型变量用highp精度限定符生命。
gl_InstanceID: 是一个输入变量。用于保存实例化绘图调用中图元的实例编号。对于常规的绘图调用,该值为0;gl_InstanceID是一个整数型变量,用highp精度限定修饰符声明。
** gl_Position**:用于输出顶点位置的裁剪坐标。该值在裁剪和视口变换用于执行相应的图元裁剪以及从裁剪坐标到屏幕坐标的顶点位置转换。如果顶点着色器未写入gl_Position
.则gl_Position
的值未定义。gl_Position
是浮点变量,用highp精度限定修饰符声明。
gl_PointSize:可以写入像素表示点精灵的尺寸,在渲染点精灵时使用。顶点着色器输出的gl_PointSize
值被限定在OPENGL ES 3.0实现支持的非平滑点大小范围之内.gl_PointSize
是一个浮点变量.用于highp精度限定符声明.
gl_FrontFacing:是一个特殊变量,但不是由顶点着色器直接写入的,而是根据顶点着色器生成的位置值和渲染图元的类型是生成的,它是一个布尔值。
内建统一状态
在顶点着色器内可用的唯一内建Uniform状态是窗口坐标中的深度范围。这些由内建变量名gl_DepthRange
给出。
struct gl_DepthRangeParameters {
highp float near; //near z
highp float far; //near far
highp float diff; //far - near
}
uniform gl_DepthRangeParameters gl_DepthRange;
内建常量
const mediump int gl_MaxVertexAttribs = 16;
//可以指定的顶点数据最大的数量
const mediump int gl_MaxVertexUniformVectors = 256;
//顶点着色器可以使用的vec4Uniform变量最大的数量
const mediump int gl_MaxVertexOutputVectors = 16;
//输入向量的最大数量
const mediump int gl_MaxVertexTextureImageUnits = 16;
//顶点着色器可用纹理单元的最大数量
const mediump int gl_MaxCombinedTextureImageUnits = 32;
//顶点/片元着色器的可用纹理单元的最大数量的总和。
顶点中的矩阵变换
mvp矩阵(模型-视图-投影矩阵)顶点着色器的位置输入保存的是物体坐标,而且输入的坐标保存为裁剪坐标。mvp 矩阵是3D图形中进行这种变换的3个非常重要的变换矩阵的乘积:模型矩阵,视图矩阵和投影矩阵
组成MVP矩阵的每个单独矩阵执行变换如下:
模型矩阵—将物体坐标变换为世界坐标
视图矩阵—将世界坐标变换为眼睛坐标
投影矩阵—将眼睛坐标变换为裁剪坐标
片段着色器
内建特殊变量
gl_FragCoord:片段着色器中一个只读变量,这个变量保存片段的窗口相对坐标
gl_FrontFacing:片段着色器中的一个只读变量,布尔变量,正面图元为true,否则为false
**gl_PointCoord **:只读变量,可以在渲染点精灵使用,保存了点精灵的纹理坐标,这个坐标在点精灵光栅化期间自动生成,处于(0,1)区间
gl_FragDepth:一个只写输出变量,在片段着色器写入时,覆盖片段的固定功能深度值,尽量减少手动实现深度值的写入。这个功能需要谨慎使用,因为它可能禁用许多GPU的深度优化,例如,许多GPU都有”Early-Z”的功能,在执行片段
着色器之前进行深度测试,使用”Early-z”的好处就是不能通过深度测试的片段就不会被着色(从而降低了着色器调用的次数,提高性能)。但是使用gl_fragDepth,就必须禁用该功能,因为GPU在执行着色器之前不知道深度值。
内建常量
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;
//多重渲染目标最大支持数量
多重纹理渲染
服务端:
attribute vec2 v_texCoord;
uniform sampler2D s_baseMap;
uniform sampler2D s_SecondMap;
void main()
{
vec4 baseColor;
vec4 secondColor;
baseColor = texture(s_baseMap ,v_texCoord);
secondColor = texture(s_SecondMap ,v_texCoord);
gl_FragColor = baseColor * secondColor;
}
客户端:
glActiveTexutre(GL_TEXTURE0);
glBindTeture(GL_TEXTURE_2D ,baseMapTexId);
glUniformli(baseMapTexId,0);
glActiveTexutre(GL_TEXTURE1);
glBindTeture(GL_TEXTURE_2D ,secondMapTexId);
glUniformli(secondMapTexId,1);
内建函数
dot :点乘
cross :叉乘
texture2D :⽤于对纹理采样
normalize :对一个向量规格化
clamp :将⼀个向量固定在一个最小值和最大值之间
函数 | 描述 |
---|---|
pow() | 幂函数(对矢量和标量同样有效,下同) |
exp(),log() | 指数函数,对数函数 |
abs() | 绝对值 |
sart() | 平方根 |
max(),min() | 最值 |
ceil(),floor() | 取大于实参的最小整数,取小于实参的最大整数 |
sin(),cos(),tan() | 三角函数 |
asin(),acos(),atan() | 反三角函数 |
sinh(),cosh(), <a>tanh() | 双曲正弦,双曲余弦,双曲正切 |
length() | 向量长度 |
distance() | 两个向量的距离 |
dot(),cross() | 数乘,叉乘 |
matrixCompMult() | 矩阵对应元素分别相乘 |
transpose(),determinant(),inverse() | 矩阵的转置,行列式,逆 |
lessThan(),greaterThan(),equal() | 小于,大于,等于 |