🎯 整體比喻:開一場 3D 打印畫展!
想象你在做一件事情:「拿設計圖,把它畫在一張紙上」。
這整個流程就好像 GPU 在渲染一幅畫。
而下面這幾個階段,就是這場「畫展」里每個具體的人或機器要做的事情:
1. 頂點著色器(Vertex Shader)
作用:處理每一個點(頂點),決定它放在哪里、長什么樣。
🧠 比喻:
就像你在設計圖上標出各個點的位置。
比如「頭頂在這里,手在這里」,每個點可能還有顏色、大小之類信息。
🛠 舉例:
- 輸入:一個三角形的三個頂點 (坐標、顏色、法線等)
- 頂點著色器:
- 乘以MVP矩陣,把本地坐標變成屏幕上的位置。
- 可以改變點的顏色、大小等。
- 輸出:每個點的新位置、新屬性。
? 記憶口訣:“點”搬到正確位置上!
2. 圖元裝配(Primitive Assembly)
作用:把一個個點連起來,組成「圖形」比如三角形、線段。
🧠 比喻:
就像把設計圖上的點用線連接起來,畫出三角形、矩形、房子輪廓!
🛠 舉例:
- 輸入:三個頂點
- 圖元裝配:
- 發現這三個點要組成一個三角形
- 輸出:一個確定了頂點順序的三角形
? 記憶口訣:“點連成線/面”!
3. 光柵化(Rasterization)
作用:把連續的三角形變成一堆小格子(像素),決定要涂哪塊。
🧠 比喻:
想象你拿一張方格紙(像素格子),用鉛筆把三角形里屬于的格子都涂黑。
光柵化就是在格子上“染色”!
🛠 舉例:
- 輸入:一個大三角形(頂點位置)
- 光柵化:
- 計算哪些像素格子在三角形內部
- 對每個像素插值顏色、紋理坐標等
- 輸出:每個像素點準備好要著色的信息
? 記憶口訣:“面變成一堆像素點”!
4. 片段著色器(Fragment Shader)
作用:每個像素自己決定怎么最終著色。
🧠 比喻:
就像每個被鉛筆點到的小格子自己決定畫紅的?藍的?加紋理?加亮?
🛠 舉例:
- 輸入:一個像素的位置、插值后的顏色、紋理坐標
- 片段著色器:
- 查紋理,混合顏色,做光照計算
- 輸出:最終這個像素的顏色(比如紅色、綠色、透明度等)
? 記憶口訣:“每個像素自己上色”!
5. 逐片段操作(Per-Fragment Operations)
作用:最終的「管控」:裁剪、不透明度混合、寫進屏幕緩存。
🧠 比喻:
就像審查員,每個格子畫完后,檢查一遍:
- 這個像素要不要丟掉?
- 這個像素透明嗎?
- 如果是透明的,要怎么跟下面的疊加?
🛠 舉例:
- 深度測試:當前片段是不是比已有的片段更靠前?
- 混合:比如透明玻璃的疊加效果。
- 模板測試:做一些遮罩效果。
? 記憶口訣:“最終審核決定能不能留”!
📈 總流程圖示意
頂點數據↓
【頂點著色器】(點的位置、顏色)↓
【圖元裝配】(連接成三角形)↓
【光柵化】(確定哪些像素被覆蓋)↓
【片段著色器】(每個像素自己決定顏色)↓
【逐片段操作】(測試深度/混合,決定最后顯示)↓
屏幕畫面
? 小總結記憶法
階段 | 比喻 | 關鍵詞 |
---|---|---|
頂點著色器 | 點的位置/初步化妝 | 定點位置 |
圖元裝配 | 點連成面 | 連線成形 |
光柵化 | 三角形染色 | 面轉像素 |
片段著色器 | 每個像素化妝 | 顏色決定 |
逐片段操作 | 審核打分 | 能不能畫 |