移动端图形标准中,目前 OpenGL ES 仍然是比较通用的标准(Vulkan 则是新一代),这里新开一个系列用于记录学习 OpenGL ES 的历程,以便查阅理解。
OverView
OpenGL ES
OpenGL ES 是移动设备中主流图形API,由Khronos 组织创立。其支持平台包括 iOS、Android、BlackBerry、bada、Linux和Windows,同时,它还是浏览器中 3D 图形 WebGL 标准的基础。
目前,Khronos 已经发布了一下几个版本:
- OpenGL ES 1.0 and 1.1: 固定功能管线
- OpenGL ES 2.0: 可编程图形管线
- OpenGL ES 3.0: 图形革命性更新
- OpenGL ES 3.1: 引入图形计算
- OpenGL ES 3.2: 进一步完善功能
下面我们来看一下 OpenGL ES 3.0 的图形管线:
后续部分则会围绕Pipeline的各个部分展开,首先我们顺着Pipeline 走一遍:
-
顶点缓冲区/数组对象
用于存放顶点信息及变换矩阵等输入变量
-
顶点着色器
顶点信息处理,如通过矩阵变换顶点位置、计算照明公式来生成逐顶点颜色以及生成或变换纹理坐标等顶点操作,此外,还可通过着色器代码执行自定义计算等操作。
-
图元装配
顶点着色器下一阶段,图元(Primitive)作为 OpenGL ES 中基本图形单元,是三角形、直线或者点精灵等简单几何对象,图元的每个顶点都会被发送到顶点着色器的不同copy。对于每个图元,在进行下一阶段前会根据视锥体范围进行裁剪,视锥体范围内的图元会被传送到下一光栅化阶段。
-
光栅化
光栅化是讲图元转化为一组二维片段的过程,在此阶段之前,图元处于三维坐标系中,光栅化则将处于视锥体的部分二维化到屏幕坐标系中的一组组片段。然后,将这些片段交由片段着色器进行处理。每个片段的输出包括屏幕坐标(x, y)、颜色等属性以及纹理坐标等。
-
片段着色器
片段着色器将光栅化后的片段进行处理,并抛弃片段或者生成一个或者多个颜色值作为输出。 出了渲染到多重渲染目标之外,片段着色器只输出一个颜色吃。其输入信息为光栅化阶段生成的颜色、深度、模板和屏幕坐标(x, y)。
-
逐片段操作
逐片段操作阶段,对每个片段执行如下功能:
- 像素归属测试 – 确定帧缓冲区位置 (x, y) 的像素是否归 OpenGL ES 所有,即是否属于当前 OpenGL ES 上下文。
- 裁剪测试 – 确定 (x, y) 是否处于裁剪矩形范围内,若否,则被抛弃。
- 模板和深度测试 – 在片段的模板和深度值上测试,以确定片段是否应该丢弃。
- 混合 – 将新生成的片段颜色值于保存在帧缓冲区 (x, y) 位置的颜色组合起来(雾化、透明效果等)。
- 抖动 – 图像算法,用于最小化因帧缓冲区颜色值精度有限而产生的伪像。
-
帧缓冲区
用于显示生成的图像的缓冲区,通常系统中存在多个帧缓冲区以达到更好的显示效果。
EGL
OpenGL ES 进行渲 大专栏 OpenGL ES 学习笔记 - Overview - 小旋的博客染所需要的上下文以及绘制表面等在 OpenGL ES 中并没有定义,这部分内容,Khronos 指定了另外一套 API 标准,即 EGL
来作为 渲染API(如OpenGL ES)和原生窗口系统之间的接口;虽然 OpenGL ES 并没有对 EGL 提供的硬性要求,但在跟系统的交互中,大多采用 EGL
作为系统接口。 目前,唯一支持 OpenGL ES 而不支持 EGL 的平台是iOS.
使用 OpenGL ES 进行渲染,需 EGL 提供以下服务:
- 查询并初始化可用显示器(Display)
- 创建渲染表面(Surface)
- 创建渲染上下文(Context)
API 命令语法
OpenGL ES
OpenGL ES 命令以 gl
前缀开始,API 命名采用首字母大写的小驼峰式命名规则(例如 glGetError)。数据类型规则类似,以 GL
开头。
此外,参数也可带有类型标识以指定参数类型,下面是 OpenGL ES 参数类型的例子:
glUniform2f(location, 1.0f, 0.0f); // float arg2 and arg3
glUniform2f(location, 1, 0); // int arg2 and arg3
后缀 | 数据类型 | C 语言类型 | GL 类型 |
---|---|---|---|
b | 8 位整型 | signed char | GLbyte |
ub | 8 位无符号整型 | unsigned char | GLubyte, GLboolean |
s | 16 位整型 | short | GLshort |
us | 16 位无符号整型 | unsigned short | GLushort |
i | 32 位整型 | int | Glint |
ui | 32 位无符号整型 | unsigned int | GLuint, GLbitfield, GLenum |
x | 16.16 定点数 | int | GLfixed |
f | 32 位浮点数 | float | GLfloat, GLclampf |
i64 | 64 位整型 | khronos_int64_t (取决于平台) | GLint64 |
ui64 | 64 位无符号整型 | khronos_int64_t(取决于平台) | GLuint64 |
用于指针类型 | void | GLvoid |
EGL
EGL 命令都以 egl
前缀开头、API 命名采用首字母大写的小驼峰式命名规则(例如 eglCreateContext)。类似地,EGL 数据类型也以 EGL
前缀开头,类型名命名采用首字母大写的方式来命名(EGLint 和 EGLenum 除外)。
数据类型 | C 语言类型 | EGL 类型 |
---|---|---|
32 位整数 | int | EGLint |
32 位无符号整数 | unsigned int | EGLBoolean、EGLenum |
指针 | void* | EGLConfig、EGLContext、EGLDisplay、EGLSurface、EGLClientBuffer |
好了,概览就到此为止,后续部分等学习相关章节后继续。
Reference: 《OpenGL ES 3.0 编程指南》