1、着色器与 OpenGL ES
现代 OpenGL ES 渲染管线严重依赖着色器来处理传入的数据,如果不使用着色器,那么用 OpenGL ES 可以做到的事情就只有清除窗口内容了,可见着色器与 OpenGL ES 的重要性。
无论是 OpenGL ES 还是其它图形的 API 着色器,通常都是通过一种特殊的编程语言去编写的,对于 OpenGL ES 来说使用的是 GLSL,也就是 OpenGL Shading Language,虽然 GLSL 是一种专门为图形开发设计的语言,但是它与 C 语言非常相似,当然还有一点 C++ 的影子。
2、基础类型
类型 | 说明 |
void | 没有函数返回值或者空的参数列表 |
bool | 布尔值 |
int | 有符号整型 |
float | 浮点类型 |
vec2, vec3, vec4 | 浮点vector数组 |
bvec2, bvec3, bvec4 | 布尔vector数组 |
ivec2, ivec3, ivec4 | 有符号整型vector数组 |
mat2, mat3, mat4 | 2x2,3x3,4x4 浮点矩阵 |
sampler2D | 2D 纹理 |
samplerCube | 立方体纹理 |
3、内置宏
内置宏 | 说明 |
__LINE__ | 十进制整型常量,当前程序行的行号 |
__FILE__ | 当前的源文件名,表示字符串常量 |
__VERSION__ | 十进制整数,例如:100 |
GL_ES | 如果在OpenGL-ES着色语言上运行,定义并设置为整数1 |
GL_FRAGMENT_PRECISION_HIGH | 如果fragment语言支持high,则为undefined |
4、变量修饰符
修饰符 | 说明 |
none | 默认的,可以省略 |
const | 声明变量或者函数的参数为只读类型 |
attribute | 只能用于 vertex shader 中,一般用于保存顶点属性或者法向量等数据 |
uniform | 在运行时 shader 无法改变 uniform 变量,一般用来放置程序传递给 shader 的变换矩阵,材质,光照参数等 |
varying | 主要负责在 vertex 和 fragment 之间传递变量 |
5、函数参数限定符
限定符 | 说明 |
in | 传递给函数的参数 |
out | 用于从函数传回的函数参数 |
inout | 用于传入和传出的函数参数 |
6、精度限定
精度限定符 | 说明 |
highp | 高精度 |
mediump | 中精度 |
lowp | 低精度 |
通过 precision 关键字可以批量声明一批变量的精度或者单个变量的精度
比如在顶点着色器中设置 precision mediump float; 那么就表示顶点着色器中所有浮点数的精度都是高精度
precision mediump float;
7、内置变量
顶点着色器
变量名称 | 类型 | 说明 |
highp vec4 gl_Position | 输出变量 | 顶点位置坐标 |
mediump float gl_PointSize | 输出变量 | 顶点大小,只有当图元类型为点时才生效 |
片段着色器
变量名称 | 类型 | 说明 |
mediump vec4 gl_FragCoord | 输入变量 | 片段在帧缓冲区中的位置 |
bool gl_FrontFacing | 输入变量 | 片段前后面信息 |
mediump vec2 gl_PointCoord | 输出变量 | 点精灵坐标,范围是[0.0, 1.0],左上角是 0,右下角是 1,在画点时可以利用 gl_PointCoord 画出一个圆形的点 |
mediump vec4 gl_FragColor | 输出变量 | 设置当前片段的颜色 |
mediump vec4 gl_FragData[n] | 输出变量 | 设置当前片段的颜色,使用glDrawBuffers数据数组时生效,在 GLES2.0 中 drawBuffers 数量为 1,所以 gl_FragData 在 GLES2.0 中不会使用到 |
8、内置常量
常量名称 | 最小值 | 说明 |
const mediump int gl_MaxVertexAttribs | 8 | gl_MaxVertexAttribs 表示在vertex shader(顶点着色器)中可用的最大attributes数.这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个. |
const mediump int gl_MaxVertexUniformVectors | 128 | gl_MaxVertexUniformVectors 表示在vertex shader(顶点着色器)中可用的最大uniform vectors数. 这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 128 个. |
const mediump int gl_MaxVaryingVectors | 8 | gl_MaxVaryingVectors 表示在vertex shader(顶点着色器)中可用的最大varying vectors数. 这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个. |
const mediump int gl_MaxVertexTextureImageUnits | 0 | gl_MaxVaryingVectors 表示在vertex shader(顶点着色器)中可用的最大纹理单元数(贴图). 这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 甚至可以一个都没有(无法获取顶点纹理) |
const mediump int gl_MaxCombinedTextureImageUnits | 8 | gl_MaxVaryingVectors 表示在 vertex Shader和fragment Shader总共最多支持多少个纹理单元. 这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个. |
const mediump int gl_MaxTextureImageUnits | 8 | gl_MaxVaryingVectors 表示在 fragment Shader(片元着色器)中能访问的最大纹理单元数,这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 8 个. |
const mediump int gl_MaxFragmentUniformVectors | 16 | gl_MaxFragmentUniformVectors 表示在 fragment Shader(片元着色器)中可用的最大uniform vectors数,这个值的大小取决于 OpenGL ES 在某设备上的具体实现, 不过最低不能小于 16 个. |
const mediump int gl_MaxDrawBuffers | 1 | gl_MaxDrawBuffers 表示可用的drawBuffers数,在OpenGL ES 2.0中这个值为1, 在将来的版本可能会有所变化 |