渲染管线
计算机图形学中,计算机图形管线(渲染管线 或简称 图形管线、流水线)是一个概念模型,它描述了t图像系统将 3D场景渲染到2D屏幕所需执行的一系列步骤。渲染管线大的可以分为三个阶段。
(一)应用阶段
应用阶段是开发者掌握一切的阶段,包括对于各种数据的准备以及向GPU进行传输的过程,如顶点数据、摄像机坐标、视锥体数据、场景模型以及光源等。还包括数据的基本处理,比如不可见对象的剔除以及设置渲染状态,包括但不限于材质、纹理、着色器。总而言之就是向图形处理单元输送点、线、面等渲染图元。
(二)几何阶段
集合阶段包括顶点着色、细分着色、几何着色、图元装配、剪切、屏幕映射。
顶点着色
对于绘制命令传输的每个顶点,OpenGL都会调用一个顶点着色器来处理定点相关的数据。顶点着色器可能非常简单,只是将数据复制并传递到下一个着色阶段,叫做传递着色器;也可能会非常复杂,比如执行大量的计算得到定点在屏幕上的位置。一个复杂的程序一般会存在多个顶点着色器,但同时只会有一个顶点着色器起作用。
细分着色
曲面细分着色器是一个可选的阶段。曲面细分是利用镶嵌化处理技术对三角形进行细分,以此来增加物体表面的三角面数量。在这一阶段,程序员可以进行曲面细分操作,看起来就像在原有的图元内加入了更多的顶点。对于一些有大量曲面的模型,进行曲面细分可以让曲面更加圆润;如果为这些细分的顶点再准备一些位置信息,那么这些细分的顶点将有助于我们展现一个细节更加丰富的模型。这也是贴图置换(Displacement Mapping)的基本思路。
集合着色
几何着色器也是一个可选的阶段。顶点着色器以顶点数据作为输入,而几何着色器则以完整的图元(Primitive)作为输入数据。例如,以三角形的三个顶点作为输入,然后输出对应的图元。与顶点着色器不能销毁或创建顶点不同,几何着色器的主要亮点就是可以创建或销毁几何图元,此功能让GPU可以实现一些有趣的效果。例如,根据输入图元类型扩展为一个或更多其他类型的图元,或者不输出任何图元。需要注意的是,几何着色器的输出图元不一定和输入图元相同。几何着色器的一个拿手好戏就是将一个点扩展为一个四边形(即两个三角形)。
图元装配
前几个步骤都是对顶点数据进行处理。本阶段是将传输进来的顶点与相关的几何图元组织起来,准备下一步的剪切和光栅化工作。
剪切
对视窗(viewport)外的顶点进行剔除,避免不会在是窗外绘制。 该步骤是OpenGL自动完成的。
屏幕映射
对输入的坐标仍是范围在单位立方体内的三维坐标,本阶段任务是将每个图元的x、y值变换到屏幕坐标系(屏幕坐标系是一个2D空间)。由于输入坐标范围在[-1,1],因此这是一个拉伸到屏幕分辨率大小的过程。对于输入的坐标z值不做任何处理(实际上屏幕坐标系和z坐标一起构成窗口坐标系),这些值会被一起传递到光栅化阶段。
(三)光栅化阶段
光栅化阶段包括光栅化、片元着色、逐片元操作。
光栅化
光栅化的工作是判断某一部分几何体所覆盖的屏幕空间。得到屏幕空间信息以及输入的顶点数据之后,光栅化单元就可以直接对片元着色器中的每一个可变变量进行线性插值,然后将结果传递给用户的片元着色器。
片元着色
片元着色器是一个非常重要的可编程着色器阶段,前面的光栅化阶段实际上并不会影响每个像素的颜色值,而是会产生一系列的数据信息,用来表述一个三角网格是怎样覆盖每个像素的,而片元就负责存储这样一系列信息,真正会对产生影响的是下一个阶段逐片元操作。
片元着色器的输入是上一个阶段对顶点信息进行插值的结果(是根据从顶点着色器输出的数据插值得到的),而它的输出是像素颜色值。这一阶段可以完成很多重要的渲染技术,其中最重要的技术有纹理采样、逐片光照计算等,覆盖片元的纹理坐标是通过前述的阶段的顶点数据插值得到的。
逐片元的操作
这个阶段会使用深度测试和模板测试来决定一个片元是否可见。如果一个片元成功的通过了所有的激活测试,那它就可以直接被会知道帧缓存中了,它对应的像素的颜色值(也可能包括深度值)会被更新,如果开启了融混模式,那么片元的颜色会与该像素当前的颜色相叠加,形成一个新的颜色值并写入帧缓存中。
总结