一、渲染管线结构
在<<Real-Time Rendering>>一书中将渲染管线从整体上分为了三个阶段:1、应用程序阶段 2、几何阶段 3、光栅化阶段,但是每个阶段都可以细分成更多的流程,这取决于不同管线的设计,并且不同的图形API可能对阶段的划分也有些许差异。
图片来自<<Real-Time Rendering,Third Edition>>,2.1 Architecture
1、应用程序阶段
应用程序阶段主要是在cpu端对图形数据做一些操作和处理,例如场景图更新、碰撞检测、各种cpu端执行的裁剪算法程序等。总之,在这个阶段里,应用程序可以完全掌控图形数据,需要进行什么样的操作完全取决于算法的设计。
2、几何阶段
几何阶段需要进行的操作比较多,但是都主要是集中在顶点变换和光照计算上:
图片来自<<Real-Time Rendering,Third Edition>>,2.3 The Geometry Stage
上图中的Model&View Transform过程其实就是World Transform和View Transform的级联形式,更详细的坐标空间变换过程见下图:
图片来自<<Mathematics For 3D Game Programming And Computer Graphics,3ED>>, 1.2 Vertex Transformation
以上几种变换都是通过4x4矩阵实现的,下面是矩阵的详细推导过程:
世界变换:
视图变换:
投影变换:
视口变换:
但是第二步中的Vertex Shading,一般是计算光照所需要的各个属性,例如视线方向、光线方向、法线等,这些变量之间会进行一系列的运算,所以首先要保证的就是他们都是处于同一个坐标空间中,才能得到正确的计算结果,理论上任意一个空间都可以,然而大多数情况下都是统一变换到World Space中。
而且,在这一步中所需要计算的顶点属性,也取决于管线所实现的光照与着色模式:扁平、Gouraud、Phong
扁平着色基于多边形,所以只需要计算顶点法线等信息,在光栅化时利用多边形各顶点法线等计算出面法线等信息,然后代入光照方程计算出颜色,最后用此颜色直接填充当前多边形。
Gouraud着色基于顶点,所以当计算出法线等信息后,需要立即代入光照方程计算出顶点颜色,然后在光栅化阶段对顶点色进行插值,最后用插值颜色对多边形进行填充。
Phong着色基于像素,所以和扁平一样在顶点中也只需要计算法线等信息,但是不同的是在光栅化阶段中会对法线等顶点属性进行插值,得到多边形内每个像素对应的属性(像素及其属性称之为片元-Fragment),最后在进行扫描线转换的时候获取像素的属性值,代入光照方程计算出颜色并填充该像素。
可见,Vertex Shading的实现方法有很多种,但是都取决于光照与着色模式的应用,详细的光照与着色模式介绍参见:
3、光栅化阶段
这个阶段主要任务是图元的光栅化和顶点属性的插值:
图片来自<<Real-Time Rendering,Third Edition>>,2.4 The Rasterizer Stage
参考:
https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/