Ray Casting vs. Rendering Pipeline
Ray Casting
For each pixel
For each object
*整个场景必须要在内存中
*Depth复杂度:隐藏部分没有计算
*原子计算
*更具一般性,更灵活
Rendering Pipeline
For each triangle
For each pixel
*一次处理一个基元
*只能对顶点进行几何变换
*早期阶段涉及分析过程
*运算随着pipeline的深度增加而增加
*取样在pipeline的后期发生
*有最小状态要求
The Graphics Pipeline
图形流水线的线路是这样的:
Modeling Transformations->模型变换
Illumination(Shading)->光照
Viewing Transformation(Perspective/Orthographic)->视角变换
Clipping->裁剪
Projection to Screen Space->投影至屏幕空间
Scan Conversion->光栅化
Display->显示
对上述的图形流水线进行一个小结:
*几乎每个阶段都涉及坐标变换,理解了变换,也就理解了3D计算机图形学
*基元在通过一系列阶段的过程中被处理
*每个阶段将其结果传至下一个阶段
*流水线可以用多种方式实现
*一些阶段是在硬件中实现,一些是用软件实现
*优化以及附加编程在一些阶段是允许的
下面逐一介绍流水线的各个阶段.
模型变换阶段
3D模型在其对象坐标内被定义出来,然后变换到世界坐标系中.
光照阶段
根据材质属性,表面属性以及光源,将顶点打亮.使用的是局部光照模型,如Phong模型等.所谓局部光照,即只考虑光源照到物体表面的光线,而全局光照则要考虑整个场景中的反射,物体的透视等.光线跟踪算法可以实现全局光照.
视角变换
将世界空间映射到视觉空间
裁剪
变换至NDC,即正规设备坐标.在视口外的对象部分将被裁剪掉.
投影至屏幕
将NDC中的对象投影到屏幕空间,屏幕空间是一个二维的空间.
扫描转换(光栅化)
将对象光栅化为像素点.同时对各像素点进行插值.
显示
每个像素记录最近的对象.
其中涉及的空间依次是对象空间,世界空间,视角空间,裁剪空间(NDC)以及屏幕空间.
投影变换
各种Transformations
刚性变换(Rigid-Body Transforms): 变换对象内部的距离和角度都不变,比如平移和旋转.
相似变换(Similarity Tranforms): 变换对象内部的角度保持不变,包括各向同性的缩放.
线性变换(Linear Tranformations): 满足L(p+q)=L(p)+L(q), L(ap)=aL(p),包括一般缩放,反射和斜切.平移不是线性变换!
仿射变换(Affine Transformations): 变换对象内部的平行线保持不变.包括刚性,相似,线性变换.
投影变换(Projective Transformations): 变换对象内部的线保持不变.
各种基本变换的齐次坐标方程:
平移:
缩放:
特殊旋转(绕原点旋转):
一般旋转(绕轴(Xk,Yk,Zk)旋转):
正交投影 vs. 透视投影
简单的正交投影,比如将所有点都沿着z轴投降z=0平面,变换矩阵如下:
简单的透视投影,比如将所有点投向z=d平面,变换矩阵如下:
世界空间到视角空间的变换
已知世界坐标系W,通过变换矩阵C,变换到视觉坐标系V.有V=CW.对于W中的一点p(x,y,z)
正交视觉空间转换为NDC
该投影变换矩阵把一个(left,right,bottom,top,-near,-far)的视见体变换为中心位于原点,边长为2的立方体.这个矩阵其实是由平移矩阵T和缩放矩阵S级联得到.首先,通过平移把指定视见体的中心移动到规范视见体的中心即T(-(left+right)/2, -(top+bottom)/2, +(near+far)/2);其次,要缩放指定的视见体使得其每条边的长度都为2,即S(2/(right-left), 2/(top-bottom), 2/(near-far)).
投影视觉空间转换到NDC
该透视投影变换矩阵P=NSH,其中H是剪切矩阵,与投影射线的角度有关,将视见体化为对称棱台;S是缩放矩阵,将上下左右裁剪面化为标准值;N是投影规范化矩阵,将视见体化为规范裁剪体.