1. 程式人生 > >《GPU程式設計與CG語言之陽春白雪下里巴人》 讀書筆記1

《GPU程式設計與CG語言之陽春白雪下里巴人》 讀書筆記1

Chapter2 GPU圖形繪製管線

圖形管線繪製三個主要階段

應用程式階段

  • 高階語言實現
  • 主要和CPU,記憶體打交道
  • 例如:碰撞檢測,場景圖建立,空間八叉樹更新,視錐裁剪等經典演算法
  • 得到幾何體資料(頂點座標,法向量,紋理座標,紋理等),並通過資料匯流排傳遞給圖形硬體(時間瓶頸

幾何階段

  • 頂點變換,光照,裁剪,投影以及螢幕對映
  • 得到經過變換和投影之後的頂點座標、顏色、紋理座標

光柵階段

  • 為畫素(pixel)正確配色
  • 每個畫素的資訊存於顏色緩衝器(color buffer/frame buffer)

注意

涉及深度資訊(Z值)的運算都是在幾何階段進行的

2.1 幾何階段

根據頂點座標變換的先後順序,主要有如下幾個座標空間:

  1. Object Space 物體座標系/模型座標空間
  2. World Space 世界座標空間
  3. Eye Space 觀察座標空間
  4. Clip and Project Space 螢幕座標空間

GPU 處理流程

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

空間轉換的裁剪過程

  1. 用透視變換吧頂點從視錐體中變換到裁剪空間的CVV中
  2. 在CVV進行圖元裁剪
  3. 螢幕對映:將經過前述過程得到的座標對映到螢幕座標系上

概念

  • 規範立方體(Canonical View Volume)
    :裁剪被安排在一個單位立方體中進行,該立方體的對角頂點分別為(-1,-1,-1)和(1,1,1)。CVV的近平面的X,Y座標對應螢幕畫素座標(左下角是0、0),Z座標則代表畫面畫素深度。

圖元位置及其對應處理方式

只有當圖元完全或部分存在於視錐體內部時,才需要將其光柵化
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的過程

  1. 消除遮擋面
  2. 紋理操作(Texture Operation):根據畫素的紋理座標,查詢對應的紋理值
  3. 混色(Blending):根據目前已經畫好的顏色,與正在計算的Alpha值混合為兩種顏色,作為新的顏色輸出
  4. 濾波/濾鏡(Filtering):將正在算的顏色經過某種Filtering後輸出
  5. 將畫素顏色寫入幀快取

Raster Operations

2.4 圖形硬體

首先來看一下GPU的儲存架構:

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有時被認為是顏色緩衝器和深度緩衝的組合。