OpenGL ES 3.0 渲染管线介绍

一、前言

  • OpenGL 1.x 系列采用的还是固定功能管线。
  • 从 OpenGL ES 2.0 开始采用了可编程图形管线。
  • 而 OpenGL ES 3.0 兼容了 2.0,并加入了很多 2.0 不具备的功能。
  • Android 4.3 之后开始支持 OpenGL ES 3.0。

二、渲染管线

记住下面这张图,其中带阴影的方框表示 OpenGL ES 3.0 管线中可编程阶段。
OpenGL ES 3.0 渲染管线介绍_第1张图片

1. 顶点着色器

顶点着色器主要进行顶点相关的一些操作。可以用于通过矩阵变换位置、计算照明公式来生成逐顶点颜色以及生成或者变换纹理坐标等基于顶点的传统操作。产生纹理坐标、颜色、点位置等信息送往后续阶段。

2. 图元装配

顶点被组合成图元的过程叫做 图元装配。图元是指点、直线和三角形。
该过程还有两个重要操作:裁剪和淘汰。裁剪是指对于不在视锥体(屏幕上可见的3D区域)内的图元进行裁剪;淘汰是指根据图元面向前方或后方选择抛弃它们(如物体内部的点)。

3. 光栅化

将图片转化为片段(fragment)的过程叫做 光栅化。在这里,虚拟3D世界中的物体投影到平面上,并生成一系列的片段。
而将每个图元顶点输出生成每个片段值的机制叫做 插值
片段(fragment)可以简单的理解为带有深度等信息的像素点。屏幕上的一个像素点可能对应多个片段。

4. 片段着色器

通常我们在这里对片段进行处理(纹理采样、颜色汇总等),将每个片段的颜色等属性计算出来并送给后续阶段。

5. 逐片段操作

这里又包括下图所示一些步骤:
OpenGL ES 3.0 渲染管线介绍_第2张图片

像素归属测试

判断当前像素是否归 OpenGL 所有,即 OpenGL ES 帧缓冲区窗口的部分被另一个窗口所遮蔽,则被遮挡像素不属于 OpenGL 上下文。

裁剪测试

判断当前像素是否位于剪裁矩形范围内,如果位于裁剪区域外则被抛弃。

模板测试

模板测试主要将绘制区域限定在一定范围内,一般用在湖面倒影、镜像等场合。

深度测试

深度测试是将输入片元的深度与帧缓冲区中对应片元的深度进行比较,确定片段是否应该被拒绝。

混合

将新生成的片段和保存在缓冲区的片段进行混合。

抖动

用于最小化因为使用有限精度在帧缓冲区中保存颜色值而产生的伪像,使用少量颜色模拟更宽的颜色范围。

6. 帧缓冲区

OpenGL 管线的最终渲染目的地被称作帧缓存(framebuffer)。

三、其它

借鉴《OPENGL ES 3.0 编程指南》一书。

下一篇:
Android 为例编写一个 OpenGL ES 3.0 实例,Native & Java 两种实现

你可能感兴趣的:(OpenGL)