流程概述
應用程序階段
應用程序階段,使用高級編程語言(C、C++、JAVA 等)進行開發,主要和CPU、內存打交道,諸如碰撞檢測、場景圖建立、空間八叉樹更新、視錐裁剪等經典算法都在此階段執行。在該階段的末端,幾何體數據(頂點坐標、法向量、紋理坐標、紋理等)通過數據總線傳送到圖形硬件。
幾何階段
幾何階段,主要負責頂點坐標變換、光照、裁剪、投影以及屏幕映射,該階段基於GPU進行運算,在該階段的末端得到了經過變換和投影之后的頂點坐標、顏色、以及紋理坐標。
光照計算屬於幾何階段,因為光照計算涉及視點、光源和物體的世界坐標,所以通常放在世界坐標系中進行計算。
光柵階段
光柵階段,基於幾何階段的輸出數據,為像素(Pixel)正確配色,以便繪制完整圖像,該階段進行的都是單個像素的操作,每個像素的信息存儲在顏色緩沖器(color buffer 或者 frame buffer)中。
霧化以及涉及物體透明度的計算屬於光柵化階段,因為上述兩種計算都需要深度值信息(Z 值),而深度值是在幾何階段中計算,並傳遞到光柵階段的。
從幾何階段到光柵化階段:
-
幾何階段:變換三維頂點坐標和光照計算
-
將模型空間坐標(object space coordinate)通過四階矩陣變換矩陣(world matrix)轉換為世界空間坐標( world space coordinate )。
- 進行光照計算。
- 將模型空間下的頂點法向量轉換為世界空間下的,所用的轉換矩陣為world matrix的轉置矩陣的逆矩陣。
-
將物體頂點坐標從世界空間(world space)轉換到觀察空間下(eye space)。
-
將頂點坐標從觀察空間下轉換到裁剪空間下(project and clip space)。
- 投影:用透視變換矩陣把頂點從視錐體(viewing frustum)中變換到裁剪空間的規范立方體(CVV)中。
- 圖元裝配(Primitive Assembly):將頂點根據原始的連接關系還原出網格結構。
- 裁剪:在CVV中將位於視體外的場景數據去除。
-
將得到的完全位於視體中的場景數據映射到屏幕坐標系上。
-
-
光柵化階段:決定哪些像素被集合圖元覆蓋。
-
將頂點以及繪制圖元對應到像素。
-
Pixel Operation
- 消除遮擋面。
- 紋理操作(Texture operation):根據像素的紋理坐標,查詢對應的紋理值。
- 混色(Blending):根據目前已經畫好的顏色,與正在計算的顏色的透明度(Alpha),混合為兩種顏色,作為新的顏色輸出。
- 濾波(Filtering):將正在算的顏色通過某種濾波后輸出。
-