這篇把「電腦怎麼把 3D 物件變成螢幕上的彩色點」講到你能聽懂。
口訣只有一句:資料進來 → 一站一站處理 → 變成畫面。每一站做什麼?一步一步看。
你的程式(CPU) → 準備資料
│
▼
[輸入組裝] → [頂點處理] → [裁切/投影/對齊到螢幕]
│ │
└──────→ [光柵化:把三角形變成很多像素]
│
▼
[像素著色] → [深度/混色] → 影像輸出
在進入 GPU 前,你的程式會先準備好幾份「材料」:
CPU 做好這些後,把命令交給 GPU:「請把這些資料照著這條管線處理」。
**它在做的事:**把你給的頂點和索引「串起來」,知道要畫哪些三角形。
你要知道的點:這一站不計算,只負責「組裝好隊伍」。
示意:
頂點: v0 v1 v2 v3 v4 ...
索引: [0,1,2] → 第一個三角形
[2,3,4] → 第二個三角形
**它在做的事:**把每個頂點,從「模型自己的座標」一步步換到「相機看到的座標」,最後得到「投影前的座標」。
你只要記住三個盒子(矩陣):
口訣:世界最小的先動 → 模型(M) → 相機(V) → 投影(P)。
示意(不用怕數學):
clipPos = P * V * M * vec4(模型座標, 1)
同時,VS 會把每個頂點附帶的資料(例如 UV、法線)傳下去給之後的站使用。
這裡其實是三件緊連在一起的小事:
示意:
3D 物件 → [投影] → 平面上的座標 → 對齊到 1920×1080 的像素格
小提醒:不同系統「深度值」範圍可能不同(有的是 -1~1,有的是 0~1),這是新手常見的小坑。
它在做的事:「這個三角形覆蓋到哪些像素?」全部找出來,每個像素都變成一個待處理的「片段」。
還會做一件很重要的事:插值。
小圖:
v0----v1
\ | ← 內部每個小點(像素)都會得到「介於 v0,v1,v2 之間」的數值
\ |
\ |
v2
**它在做的事:**決定每個像素最後是什麼顏色。
它會用到:
一句話:這一站是在畫「顏色」。
小示意:
[像素顏色] → (比深度:前面/後面?) → (需要就跟原色混合) → 寫入畫面
小常識:如果你大量用半透明,或常常用到「discard」(直接丟棄像素),效能可能會掉,因為系統更難「先過濾再計算」。
通過以上站點後,GPU 把結果寫到一張「畫面」裡(你可以把它想成一張大貼圖)。
每 1/60 秒(或 1/30、1/144… 依你的設定),就換一張新的,這就是你看到的動畫。
CPU:準備資料 → 交給 GPU
GPU:
IA(串三角形)
→ VS(把點放到對的位置, 同時把UV/法線帶下去)
→ 裁切/投影/對齊螢幕
→ 光柵化(把三角形切成很多像素 + 幫像素算出UV/法線)
→ 像素著色(決定每個像素的顏色)
→ 深度/混色(判斷前後、需要就跟原本顏色混合)
→ 完成一張畫面
渲染管線就是把 3D 物件一步步變成 2D 畫面:
組裝 → 定位 → 投到螢幕 → 切成像素 → 算顏色 → 判斷前後與混色 → 顯示。
把每一站的工作分清楚,你就能找出畫面錯在哪、慢在哪,也更敢動手做。