阅读 174

(三)OpenGL 渲染管线

渲染管线(rendering pipeline),它是一系列数据处理的过程,并且将应用程序的数据转换到最终渲染的图像。

OpenGL管线.png

OpenGL 首先接收用户提供的几何数据(顶点和几何图元),并且将它输入到一系列 着色器阶段中进行处理,包括:顶点着色、细分着色(细分控制着色器和细分计算着色器),以及最后的几何着色,然后它将被送入光栅化单元(rasterizer)。光栅化单元负责对所有剪切区域(clipping region)内的图元生成片元数据,然后对每个生成的片元都执行一个片元着色器。

1)准备向 OpenGL 传输数据

OpenGL 需要将所有的数据都保存到缓存对象(buffer object)中,它相当于由 OpenGL 服务端维护的一块内存区域。

2)将数据传输到 OpenGL

OpenGL 的绘制通常就是将顶点数据传输到 OpenGL 服务端。我们可以将一个顶点视为 一个需要统一处理的数据包。这个包中的数据可以是我们需要的任何数据。

3)顶点着色

对于绘制命令传输的每个顶点,OpenGL 都会调用一个顶点着色器来处理顶点相关的数据。一个复杂的应用程序可能包含许多个顶点着色器,但是在同一时刻只能有 一个顶点着色器起作用。

4)细分着色

细分着色器会使用 Patch 来描述一个物体的形状,并且使用相对简单的 Patch 几何体连接来完成细分的工作, 其结果是几何图元的数量增加,并且模型的外观会变得更为平顺。

5)几何着色

允许在光栅化之前对每个几何图元做更进一步的处理, 例如创建新的图元。这个着色阶段也是可选的

6)图元装配

图元装配阶段将这些顶点与相关的几何图元之间组 织起来,准备下一步的剪切和光栅化工作。

7)剪切

顶点可能会落在视口(viewport)之外— 也就是我们可以进行绘制的窗口区域— 此 时与顶点相关的图元会做出改动,以保证相关的像素不会在视口外绘制。这一过程叫做剪切(clipping),它是由 OpenGL 自动完成的。

8)光栅化

剪切之后将更新后的图元传递到光栅化单元,生成对应的片元。我们可以将一个片元视为一个“候选的像素”,也就是可以放置在帧缓存中的像素,但是它也可能被最终剔除,不再更新对应的像素位置。之后的两个阶段将会执行片元的处理, 即片元着色和逐片元的操作。

9)片元着色

通过编程控制屏幕上显示颜色的阶段,叫做片元着色阶段。如果我们觉得不应该继续绘制某个片元, 在片元着色器中还可以终止这个片元的处理,这一步叫做片元的丢弃(discard)。

10)逐片元的操作

片元操作的下一步就是最后的独立片元处理过程。在这个阶段里会使用深度测试(depth test,或者通常也称作 z-buffering)和模板测试 (stencil test)的方式来决定一个片元是否是可见的。 如果一个片元成功地通过了所有激活的测试,那么它就可以被直接绘制到帧缓存中了, 它对应的像素的颜色值(也可能包括深度值)会被更新,如果开启了融合(blending)模式,那么片元的颜色会与该像素当前的颜色相叠加,形成一个新的颜色值并写入帧缓存中。

简单记忆:顶点着色(包括细分和几何着色)决定了一个图元应该位于屏幕的什么位置,而片元着色使用这些信息来决定某个片元的颜色应该是什么。

文章分类
iOS
文章标签