1. 程式人生 > 其它 >GPU 圖形繪製管線——讀書筆記之《gpu程式設計與cg語言之陽春白雪下里巴人》

GPU 圖形繪製管線——讀書筆記之《gpu程式設計與cg語言之陽春白雪下里巴人》

GPU 圖形繪製管線

本章描述GPU渲染流程和實時繪製技術的基本原理,由圖形繪製管線到各個階段的工作和原理自頂向下。比較偏向於概念科普,所涉及到的知識點由下圖顯示:

如上圖所示,GPU渲染流程可概括為:應用程式 -> 幾何 -> 光柵

  • 應用程式階段:使用高階程式語言進行開發,主要和CPU、記憶體打交道
  • 幾何階段:主要負責頂點座標變換、光照、裁剪、投影以及螢幕對映
  • 光柵階段:基於幾何階段資料,為每個畫素計算顏色值

幾何階段

這個階段的工作為的是將現實世界人類所理解的3D轉換為計算機可以理解的2D資料,繪製在螢幕上形成3D效果

流程如下圖所示:

  1. 從object到world:

    給物體一個參照座標系確定自己所在的位置,座標頂點由四階矩陣world matrix控制,頂點法向量由world matrix的轉置矩陣的逆矩陣轉換

  2. 從world到eye:eye space以相機為原點,由視線方向、視角和遠近螢幕組成梯形體——視錐(viewing frustum),超出這個梯形體的資料會被裁剪(frustum culling)![image-20211031173337514](/Users/zxin/Library/Application Support/typora-user-images/image-20211031173337514.png)

  3. 從eye到project & clip:

    裁剪被安排在一個單位正方體裡進行,又稱規範立方體(Canonical view volume, CVV),變換過程為:

    • 投影:用透視變換矩陣把頂點從視錐體中變換到裁剪空間的 CVV 中;

    • 圖元裁剪;

    • 螢幕對映:將經過前述過程得到的座標對映到螢幕座標系上。

  4. Primitive Assembly && Triangle setup:根據索引將頂點連線組成線、面,得到一堆在螢幕座標上的三角面片,用於光柵化

光柵化

  1. Rasterization
    • 將浮點型別的螢幕座標值確定為整數型別的畫素值(四捨五入?)
    • 根據畫素點繪製線、面(DDA、Bresenham;多邊形填充演算法、邊界填充演算法)
  2. Pixel Operation
    • 消除遮擋面
    • 紋理操作
    • 混色(Blending):alpha值(透明度),需要利用z buffer對物體進行排序
    • Filtering

補充緩衝區概念:

  1. Z Buffer:存放深度資料,判斷空間點的遮擋關係,z值不一定是線性變化的
  2. Stencil Buffer:模版緩衝區,用於做記號,例如存放1表示該畫素點處於陰影體
  3. Frame Buffer:幀緩衝區,用於存放顯示輸出的資料,一般是畫素顏色值(對於集顯,存放在記憶體中)




最後想記錄一下自己在這本書開頭看到的一段話:

Alice 羞澀地說:“呲牙貓,請問你能告訴我應該走哪條路嗎?”呲牙貓說: “這取決於你想去哪兒。”Alice 說:“我不怎麼介意到哪兒去。”呲牙貓回答說: “那你走哪條路都可以”Alice 說:“只要我能到某個地方”呲牙貓說:“只要你 走的足夠遠,你肯定能到某個地方”。
-------Lewis Carroll 的 Alice’s adventures in Wonderland 借用上面的一句話,只要你走的足夠遠,你肯定能到某個地方。加油!

最近受外部環境和自身心情影響,處於一段非常的焦慮的時期,以至於不敢於去嘗試自己感興趣的事情、不願走出舒適圈。當我看到這段話的時候,內心被勇氣填滿——或許是時候做出一些改變了。正如康大在本章開頭寫下的“欲登高而窮目,勿駐臺於浮沙”。感謝作者給予正處於浮躁與低迷的我力量與指引。