公開課的一些筆記。
三種著色方式
flat shading: 三角形的頂點沒有法向量,三角形整個面才有法向量,打光時整個三角形只呈現一種顏色。
Gouraud shading: 三角形的頂點都有各自的法向量,打光時三個頂點有各自的顏色,接著做雙線性插補 (bilinear interpolation)來求得顏色,使整個三角形有漸層的顏色變化。
Phong shading: 三角形的頂點都有各自的法向量,先對三角形整個面作法向量的雙線性插補,接著打光來求整個三角形的顏色。
:
各自的複雜度:
flat shading的複雜度:N * L
Gouraud shading: 的複雜度:N * (3 * L + b * A)
Phong shading的複雜度:(B + L) * N * A
數學好的人很容易計算出複雜度:Flat<Gouraud<Phong Shading。這裡也因此說明了為何早期電腦都只支援Gouraud shading,就算已經知道Phong shading的效果比Gouraud shading好,但還是選擇效能好而效果不錯的Gouraud shading!如今GPU發展迅速,Phong Shading的效能已得到提升。
Screen-Door Transparency
透明的一種實現-透明紗窗。他用一個b位元紗窗覆蓋在物體上面,bit為1就表示這個像素透明。然後在 shading 階段將相鄰像素根據透明度混合起來。
這個方法最大的優勢就是不用考慮物體的順序,當然,在一些系統中比alpha bending會快很多。
該方法在實現延遲渲染的初期就仔細調研過,它的優點是可以以統一的方式處理半透明和不透明。但缺點也同樣比較致命:
如果以 4 個像素的方塊作為一個混合單元,只能支援 3 層半透明。
如果光照環境和材質細節較複雜,特別是高光較強時,可以看出明顯的顆粒感。且透明層數越多效果越差。
Alpha Blending
透明度用alpha表示,取值[0,1],1表示完全不透明,0表示完全透明。
顏色公式:
C=Cs*alpha+(1-alpha)*Cd
Cs表示透明板的顏色,Cd表示目標顏色。
Z-buffer
也叫深度緩衝。這是一項處理3D物體深度資訊的技術,它對不同物體和同一物體不同部分的當前Z座標進行紀錄,在進行著色時,對那些在其他物體背後的結構進行消隱,使它們不被顯示出來。Z Bufer所用的位元越高,則代表它能夠提供的景深值就越精確。圖形晶片大多支援24bit Z-Buffer而加上8bit的模板Buffer後合稱為32bit Z-Buffer。
Painter algorithm
畫家演算法也叫作優先填充,它是三維電腦圖形學中處理可見度問題的一種解決方案。當將三維情境投影到二維平面的時候,需要確定哪些多邊形是可見的,哪些是不可見的。
“畫家演算法”表示頭腦簡單的畫家首先繪製距離較遠的情境,然後用繪製距離較近的情境覆蓋較遠的部分。畫家演算法首先將情境中的多邊形根據深度進行排序,然後按照順序進行描繪。這種方法通常會將不可見的部分覆蓋,這樣就可以解決可見度問題。
Depth peeling
層次分離技術。用於形狀複雜的透明物體的繪製。如下:
先畫第一層,再畫第二層...
層數越多,越逼真。
Depth peeling可能帶來的問題:
1. 效率降低,且開銷不穩定。(pass數量依賴於相機角度,骨骼動畫等)
2. 方案本身帶來的複雜性。(如何判斷當前有多少層半透明,遮擋查詢?)
3. 無已有的可參考的產品,只有技術demo。