2.2 硬件加速
终于我们进入到标题中的其中一个主题,硬件加速。Hardware Acceleration说穿了就是将算法设计成电路,以达到高速演算的目的。
因此我们要从上述的三种算法中找一种适合以硬件做加速的算法。而最后雀屏中选的算法是Rasterizing。Ray tracing和Radiocity的复杂度、分支度高,数据的locality又太低,大大提高了硬件加速的难度。相对的来说,Rasterizing的算法在这三方面都比前两者好,虽然Ray-tracing和Radiocity在真实度(Realistic)上的优势明显,但是今日硬件的主流还是基于Rasterizing的3D pipeline架构。
在这里我讲的很简略,也没解释其中的专有名词,但是之所以Ray-tracing和Radiocity没有成为硬件加速主流的原因可以是一串很长的讨论,就像为什么x86结构一开始选择了CISC一样。在这篇浅论中我不打算对这点深入的讨论,只说出了结果:
Ray-tracing和Radiocity算法至今仍多数在CPU上完成(虽然有些GPU based的做法,但是那并不是完整的算法,而是去适应GPU硬件的算法)。实时的ray-tracing(Real-time Ray-tracing, RTRT)能处理的场景复杂度仍然不高,而Radiosity就更不用说了。
3 绘图流水线(Rendering Pipeline)
--> Transformation & Lighting --> Viewport Transformation -->Clipping & culling --> Primitive Assembly & Triangle Setup --> Rasterization --> Pixel operation --> Raster operation
这是一个简化过的Rendering pipeline,但是它包含了今日3D pipeline中的主要部件。为什么称作Pipeline呢?因为它就像个一条长长的流水线,输入Vertex data,经过一个又一个Stage的转换,最后输出Pixel color。实际上的GPU pipeline高达数千至上万个cycle,那是因为把整条流水线的运算拆到一个加法或一个乘法那么细的部件来执行了。而我们在这里从high-level去看这条流水线,说明每个Stage做了什么事。
3.1 Transformation & Lighting
Transformation,在这里指的是坐标系的转换,由对象坐标系(object coordinate)转换到全局坐标系(World coordinate)再到视点坐标系(eye coordinate)的过程。
Object coordinate -----------------------------> World coordinate -----------------------> Eye coordinate
Model transformation View Transformation
所谓的对象坐标系,指的是以对象参考点为原点的坐标系。以一个正方体来说,在对象坐标系上(以正方体中心为参考点),八个Vertex的坐标分别是(-1,-1,1) (1,-1,1)(1,1,1) (-1,1,1) (-1,-1,-1) (1,-1,-1) (1,1,-1) (-1,1,1)。
而所谓的全局坐标系,是整个Scene的坐标系,对所有场景中的对象而言都是同一个,以上例的正方体来说,若它的中心点在World coordinate中是(3,6,4),假设没有旋转,那么8个Vertex在World coordinate上的坐标分别是(2,5,5) (4,5,5) (4,7,5) (2,7,5)(2,5,3) (4,5,3) (4,7,3) (2,7,3)。
视点坐标系,则是以视点为原点,视线方向为-Z轴的坐标系。
因此我们将Vertex的坐标,从对象坐标系转换到全局坐标系的过程,称作ModelTransformation。从全局坐标系转换到视点坐标系,称作View Transformation。这包括了上面例子中的平移,以及旋转、伸缩等线性变换。在数学上它是以一个HomogeneousCoordinate System的矩阵运算来达成,一个Vertex有四个坐标值,表达成向量(x,y,z,w),乘上一个4x4的变换矩阵(Transformation Matrix)。
详细的数学并不在我们的讨论范围内,但是请记住「4」这个数字,因为在之后的硬件讨论上我们会需要用到它。
Transformation结束后是Lighting,根据Vertex上带有的颜色(Color)与法向量(Normal),加上光源的方向,来进行光照计算,算出光照过后的颜色。注意原本的颜色更精确的说,是「对于光线的反射强度」。也就是说,就算原本的颜色是全红,表现成RGBA颜色向量是(1.0 ,0.0 ,0.0 ,1.0),如果没有任何的光打到这个顶点上,则最后出来的颜色会是全黑(0.0 ,0.0 ,0.0 ,1.0)。
这里提到了一个颜色向量的表示法,它把颜色当成一个向量来表示,其四个值分别代表了红色 R,绿色 G,蓝色 B,透明度 A。又是一个「4」。