《GPU程式設計與CG語言之陽春白雪下里巴人》 讀書筆記1
阿新 • • 發佈:2019-01-01
Chapter2 GPU圖形繪製管線
圖形管線繪製三個主要階段
應用程式階段
- 高階語言實現
- 主要和CPU,記憶體打交道
- 例如:碰撞檢測,場景圖建立,空間八叉樹更新,視錐裁剪等經典演算法
- 得到幾何體資料(頂點座標,法向量,紋理座標,紋理等),並通過資料匯流排傳遞給圖形硬體(時間瓶頸)
幾何階段
- 頂點變換,光照,裁剪,投影以及螢幕對映
- 得到經過變換和投影之後的頂點座標、顏色、紋理座標
光柵階段
- 為畫素(pixel)正確配色
- 每個畫素的資訊存於顏色緩衝器(color buffer/frame buffer)
注意
涉及深度資訊(Z值)的運算都是在幾何階段進行的
2.1 幾何階段
根據頂點座標變換的先後順序,主要有如下幾個座標空間:
- Object Space 物體座標系/模型座標空間
- World Space 世界座標空間
- Eye Space 觀察座標空間
- Clip and Project Space 螢幕座標空間
2.1.1 從Object Space 到 World Space
Ojbect Space,即物體座標系/模型座標系。光照計算通常發生在世界座標系,而模型檔案中的頂點法向量屬於物體座標系,必須將法向量轉換到世界座標系才可以使用。
2.1.2 從World Space 到 Eye Space
概念
- 視錐體:以視點或攝像機為原點,由視線方向、視角和遠近平面,共同組成的一個梯形三維空間
- 近平面:梯形體較小的矩形面
- 遠平面:梯形體較大的矩形面,投影平面
- 視錐裁剪(Frustum Culling):在視錐體內的頂點資料是可見的,而超出部分,會被視點去除。
2.1.3 從Eye Space 到 Project and Clip Space
空間轉換的裁剪過程
- 用透視變換吧頂點從視錐體中變換到裁剪空間的CVV中
- 在CVV進行圖元裁剪
- 螢幕對映:將經過前述過程得到的座標對映到螢幕座標系上
概念
- 規範立方體(Canonical View Volume)
圖元位置及其對應處理方式
只有當圖元完全或部分存在於視錐體內部時,才需要將其光柵化。
1. 當圖元完全位於視錐體內時,直接進入下一階段。
2. 當圖元完全位於視錐體外時,將被剔除。
3. 當圖元部分位於視錐體內時,對於部分位於視錐體內的圖元進行裁剪。
2.2 Primitive Assembly && Triangle Setup
概念
- Primitive Assembly(圖元裝配):將頂點根據原始的連線關係(primitive)還原出網格結構。
- 網格:網格由頂點和索引組成
- 背面去除:一般頂點按照逆時針排列,有右手定則來確定三角面片的法向量,用於判斷該面為正面還是反面,如果是反面,則要進行去除,較少繪製的頂點數目。
- Triangle Setup:處理三角形的過程。
補充
剪裁演算法有:
1. 視域剔除
2. 背面剔除
3. 遮擋剔除
4. 視口剪裁
2.3 光柵化階段
2.3.1 Rasterization
概念
- 光柵化:決定哪些畫素被集合圖元覆蓋的過程。
2.3.2 Pixel Operation
概念
- Pixel Operation:又稱“Raster Operation”,是在更新幀快取前,執行最後一系列針對每個片段的操作,目的是計算出每個畫素的顏色值。在這個階段,被遮擋面被一個稱為深度測試的過程消除。
Pixel Operation的過程
- 消除遮擋面
- 紋理操作(Texture Operation):根據畫素的紋理座標,查詢對應的紋理值
- 混色(Blending):根據目前已經畫好的顏色,與正在計算的Alpha值混合為兩種顏色,作為新的顏色輸出
- 濾波/濾鏡(Filtering):將正在算的顏色經過某種Filtering後輸出
- 將畫素顏色寫入幀快取
2.4 圖形硬體
首先來看一下GPU的儲存架構:
概念
- Z Buffer:又稱”Depth Buffer”——深度緩衝區,存放的是每個畫素對應頂點空間的的距離衡量,Z值範圍為[0,1],預設情況下,近裁剪面上Z值為0,遠裁剪面上Z值為1。Z值的比較參考 深度緩衝區演算法(depth-buffer method)。Z值並不是歐幾里得距離,非線性變化。
- 模板緩衝區Stencil Buffer:通常附加在Z Buffer中,例如,15位的Z Buffer加上1位的Stencil Buffer,用來做標記,可用來表示畫素對應空間點處於陰影中。
- 幀緩衝器Frame Buffer:用於存放顯示輸出的資料,一般為畫素顏色值。Frame Buffer有時被認為是顏色緩衝器和深度緩衝的組合。