圖形管線是目前使用最爲廣泛的渲染方式。
圖形管線
圖形管線中,頂點處理將3D的頂點轉換到屏幕2D空間上,光柵化尋找每個圖元對應的像素生成未着色的片段(fragments),片段處理步驟將每個片段着色,最後混合每個片段生成最終顯示的圖像。
更形象的幾張圖用來幫助理解,從中可以看到每一個操作的輸入和輸出。
頂點處理
在頂點處理中,主要用到的技術是座標變換。
經過多次座標變化,物體從世界座標系中最終變換到2D的屏幕上。
其間,還需要剔除視野之外的物體。
光柵化
屏幕是像素點陣組成,而變換得到的屏幕空間仍然是連續的。光柵化就是將連續空間分配到每個離散像素的過程。
直線
對於直線來說,根據像素中點決定哪個像素在直線上:
三角形
對於三角形,使用質心座標系計算每個像素的 值,然後進行插值處理。
片段處理
在光柵化步驟得到的片段是沒有顏色的,在片段處理階段給像素着色。
抗鋸齒
鋸齒的根本原因在於頻譜混疊,解決辦法是超採樣和使用重建濾波器。
着色
着色主要考慮的是光。和光線追蹤中的光照模型一樣,要考慮環境光、漫反射光和鏡面反射光。
每個像素處的顏色爲:
其中 是每個像素處的紋理特性。這個值可以由頂點顏色插值得到,也可以查詢紋理圖得到。
紋理映射
紋理映射的目的是爲了得到每個像素的紋理值。三角形的每個頂點需要記錄紋理圖中的查詢座標,然後通過數值插值得到每個像素的紋理圖座標,最後查詢紋理圖得到該像素的紋理信息。這些紋理信息帶入到上面的光照模型中可以得到最終的光照信息。
值得注意的是,在插值的時候會有一個問題:本來應該在3D世界座標系上進行插值,但是現在的做法是在屏幕空間上插值,這樣會導致透視錯誤。這一步需要引入透視校正,具體做法就是給 座標做一次校正再去插值。
和光線追蹤類似,在圖形流水線中也要考慮鏡面反射和陰影。這兩個效果分別通過環境貼圖和陰影貼圖來實現的。
環境貼圖的做法是,根據每個像素處的法線和入射光方向,計算反射光的方向,直接在環境貼圖中查詢。
陰影貼圖的做法是先由光源處計算生成陰影貼圖,然後使用相同的座標變換得到每個頂點的深度,把這個深度和陰影貼圖對比,以此判斷這個頂點是否是陰影。
混合
上面得到的着色片段還是帶有深度信息的,根據這些深度信息最終確定每個像素的值,深度小的片段最終才能顯示在屏幕上。主要算法是z-buffer算法。