2015年9月15日 星期二

3D繪圖概論 Introduction of 3D Graphics Pipeline

 


一、The Graphics Process Model


1. Modeling and Rendering


在3DComputer Graphics領域中的兩個主題:Modeling與Rendering
  • Modeling : 從虛擬的場景概念到Vertex與Mesh
  • Rendering : 以及從Vertex與Mesh到螢幕上的pixel color這兩個階段。


2. Basics of 3D scenes (Modeling)


a. 頂點(Vertex)與屬性(Attribute) : 一個頂點可以帶有許多資料,稱作屬性,比如說
  • 空間座標系中的座標(Coordinate)
  • 法向量(Normal)
  • 顏色(Color)
  • 紋理座標(Texture coord.)

頂點同時也可以作為貝茲曲面或NURBS曲面的控制點。因此我們用頂點來表達一個三維的空間。當我使用越多的頂點,意味著帶有越多的資訊,就可以把圖形表現得越細緻。

b. Mesh與Primitive : 有了頂點,我們必需知道這些頂點如何組成一個3D場景中的物件,也就是說,哪些頂點組成了一個面、哪些面又組成了一個物體。
  • Mesh : 由頂點(Vertex)組成的結構稱為Mesh,想像許多的頂點由線連結起來,形成一個類似魚網狀的圖形。
  • Primitive : 線條說明了Vertex如何連結成為Mesh,我們稱作Primitive,注意Primitive並不是線條而是一個抽像的連結概念。最簡單的Primitive有三種,點、線、三角形。

之後,由3D繪圖技術將這些Vertex與Primitive的資料,轉換成螢幕上一個一個點的顏色。從一組數位資料(Vertex與Primitive)運算出另一組數位資料(例如 1024*768,32bit depth color)。


3. Basics of Rendering


3D繪圖中我們理解Rendering為「由Scene投影到screen,決定顏色」的過程。將於後面詳述。






二、Three-Color Theory


在解說rendering之前,先了解最基礎的色彩三原色理論和各種色彩編碼的方法。

1. The RGB Color Model


  • Additive color : Form a color by adding amounts of three primaries. 
  • For CRTs, projection systems, positive film



2. The CMY、CMYK Color Model


  • Subtractive color : Form a color by filtering white light with Cyan(C), Magenta (M), and Yellow (Y) filters. 
  • For hardcopy(printing), Light-material interactions, Negative film
  • Printers use four process colors, cyan, magenta, yellow and black (CMYK)



3. The HSV Color Model


  • Hue (roughly, dominant wavelength)
  • Saturation (purity)
  • Value (brightness)
  • user-oriented : Basis of popular style of color picker






三、Rendering : 光線追蹤 Ray-Tracing


光線追蹤是三維電腦圖形學中的特殊渲染演算法,跟蹤從眼睛發出的光線而不是光源發出的光線,對於反射與折射有更準確的模擬效果,當追求高品質的效果時經常使用這種方法。

  • 優點:
    光線跟蹤的流行來源於它比其它渲染方法如掃描線渲染或者光線投射更加能夠現實地模擬光線,反射和陰影這樣一些對於其它的演算法來說都很難實作的效果,卻是光線跟蹤演算法的一種自然結果。
  • 缺點:
    光線跟蹤的一個最大的缺點就是效能,掃描線演算法以及其它演算法利用了資料的一致性從而在像素之間共享計算,但是光線跟蹤通常是將每條光線當作獨立的光線,每次都要重新計算。但是,這種獨立的做法也有一些其它的優點,例如可以使用更多的光線以抗混疊現象,並且在需要的時候可以提高圖像品質。





四、Rendering : 繪圖管線 Rendering Pipeline


雖然Ray-tracing在真實度上的優勢明顯,但是今日硬體的主流還是基於Rasterizing的3D pipeline架構,主要是由於效能的因素。

從輸入Vertex data,經過眾多Stage的轉換,最後輸出Pixel color。3D pipeline中的主要部件由前至後的順序如下:

  • Transformation & Lighting
  • Viewport Transformation
  • Clipping & culling
  • Primitive Assembly & Triangle Setup
  • Rasterization
  • Pixel operation
  • Raster operation

1. Transformation & Lighting


a. Transformation

在這裡指的是座標系的轉換,由物件座標系轉換到全域座標系,再到視點座標系的過程。過程由上至下如下所示:

  • 物件座標系(object coordinate) : 以物件參考點為原點的座標系
    • Model transformation : 從物件座標系轉換到全域座標系的過程
  • 全域座標系(World coordinate) : 整個Scene的座標系,對所有場景中的物件而言都是同一個
    • View Transformation : 從全域座標系轉換到視點座標系
  • 視點座標系(eye coordinate) : 以視點為原點,視線方向為-Z軸的座標系

中間的轉換(transformation)包括了上面例子中的平移,以及旋轉、伸縮等線性變換。在數學上它是以一個HomogeneousCoordinate System的矩陣運算來達成,一個頂點有四個座標值,表達成向量(x,y,z,w),乘上一個4x4的變換矩陣(Transformation Matrix)。


b. Lighting

Transformation結束後是Lighting,根據Vertex上帶有的顏色(Color)與法向量(Normal),加上光源的方向,來進行光照計算,算出光照過後的顏色。



2. Viewport Transformation & Clipping & Culling


光照完成之後,接著又是一個座標系的轉換,這次是從視點座標轉換到裁切座標系(Clip coordinate)再轉換到螢幕座標系(screen coordinate)的過程。

  • Eye coordinate:以視點為原點,視線方向為-Z軸的座標系。
    • Projection transformation:從Eye coordinate轉換到Clip coordinate的過程
  • Clip coordinate:加上視角與遠近平面,超出這個梯形體的場景,都被視點去除(Frustum Culling)掉
    • Viewport Transformation:從Clip coordinate轉換到Screen coordinate的過程
  • Screen coordinate:Clip coordinate梯形體轉換為一個立方體,以螢幕像素(x,y)和畫面深度(z)表示。

為什麼我們在Viewport Transformation之後還要留下Z座標的值呢?這是因為「Vertex離投影面的距離」可以用來處理三角面間相互遮蓋的情形,也就是哪個三角面在前,哪個三角面在後。這個稱作Z-buffer的技術會在之後提到。


  

3. Primitive Assembly & Triangle Setup


把與頂點相關的操作完成後,接下來進行的Primitive Assembly,將Vertex根據Primitive,還原出Mesh結構並進行裁切。

  • Primitive Assembly : 將Vertex根據Primitive,還原出Mesh結構
  • Clipping與Back-face Culling : 主要是為了減少處理的三角面數量,不會看到的三角面就不用進行處理。

最後,我們得到了一堆三角面(Triangle Setup),準備拿去做光柵化(Rasterizing)。 



4. 光柵化(Rasterizing)

從Screen coordinate準備的三角形中,找出三角形內部有哪些整數點的過程。Rasterize之後,我們把處理的對像從頂點(Vertex)變成了像素(Pixel)。

以此為分界整個3D pipline在處理Vertex的部份被稱為前端(front-end),而處理像素的部份則是後端(back-end)。


[用心去感覺] Z-buffer and Rasterization
今日的硬體在做Rasterize的時侯「Z字形」的去搜尋的。如下圖所示:

1 2 5 6 17 18 21 22 65 66 69 70
3 4 7 8 19 20 23 24 67 68
9 10 13 14 25 26 29 30
11 12 15 16 27 28 31 32
33 34 37 38
35 36 39 40
41 42
43 44

優點:資料的Locality、方便Supersample、Multisample的實作



5. Pixel Operation

Pixel operation最後的目的只有一件事:算出Pixel color,但是這中間包含了很多種計算顏色的方法以及技術。在目前介紹的固定式管線(Fixed pipeline)中包含:

  • Texture operation : 紋理操作,也就是根據Pixel的紋理座標,查詢相應的紋理(Texture),來計算Pixel該有的顏色。
  • Blending : 混色,根據目前已經畫好的顏色,與現在正在算的顏色的透明度(Alpha),混合兩種顏色,當作新的顏色輸出。
  • Filtering : 將正在算的顏色經過某種濾鏡(Filtering)後輸出。關於filtering的理論牽涉到數位訊號學,請暫時理解為,經過一種數學運算之後變成了新的顏色。



[用心去感覺] 內插法(interpolation)
像素的 X,Y 座標是經由Rasterizing,而其他資訊如z座標、現有的顏色、透明度等,是用內插法從Vertex的資訊變成了Pixel的數據。



6. Raster operation (ROP)

Raster operation是一個把Pixel顏色填進frame buffer的過程。

在前一個Pixel operation的Stage中,我們最後得到了Pixel的顏色(RGBA)、深度(Z)等各種記錄在Pixel上的資訊。最後我們要決定要將什麼顏色輸出到Framebuffer上。

這裡提到了一個名詞:Framebuffer,它的意思是在輸出到螢幕之前,將目前Rendering的結果都存在一個緩衝記憶體(buffer)裡。等整個Frame都完成之後再輸出到螢幕上。通常我們透過雙重緩衝(Double-buffering)的技術,在兩個buffer之間切換。一個buffer輸出到螢幕的同時,在另一個buffer裡Render下一個frame,完成之後就切換過來。

以下是一些Raster operation
  • Scissor Test (剪切測試) :
    測試目前的Pixel X,Y座標是否在程式設計者指定的範圍內
  • Alpha Test (透明度測試) :
    測試目前的Pixel Alpha值是否大於、小於、等於某個數值
  • Depth & Stencil Test (深度與模版測試) :
    深度測試,是將目前depth-buffer(深度緩衝,可能有z-buffer及w-buffer)中的值與目前Pixel的Z值做比較,來測試目前的Pixel是在已經繪制好的圖片前方(靠近螢幕)或之後。
  • Blending(混色) :
    將目前的Pixel Color與framebuffer中已經繪制好的圖形做不同比例的混色。


7. 總結


從一個Vertex,加上Primitve變成Triangle,Triangle光柵化(Rasterizing)成很多的Pixel,Pixel再經過Raster operation之後進到framebuffer中。

這是一個適合平行化的結構,以Pixel operation為例,因為每個Pixel之間是獨立的,因此我可以使用十條平行的Pixel operation管線,一次處理十個Pixel的資料。而這是Rasterizing演算法的優點之一。

深入探討的方向
  • 程式設計者操作使用的pipeline : OpenGL 、 Direct3D
  • 硬體加速(Hardware Acceleration) : voodoo、G80、R600






References


3D繪圖(3D Graphics Pipeline )

逍遙文工作室:繪圖管線 (Rendering Pipeline)

Game Programming 2015




技術提供:Blogger.