前言:一些讀書筆記
引用閆令琪老師的課程內(nèi)容速蕊,GAMES101,老師講的很好,可以看原課程視頻廉油。
Rasterization
這節(jié)課主要順著上面的內(nèi)容繼續(xù)講的,上節(jié)課講了如何將一個物體拍照苗傅,并且將其縮放到一個[-1,1]^3的立方塊抒线,這節(jié)課主要講如何將這個立方塊投放到屏幕上。
1)屏幕(光柵)
假設(shè)是一個像素的2維數(shù)組渣慕。
像素暫且認(rèn)為是一個有著統(tǒng)一顏色的方塊嘶炭。
其中每個方塊的中心為(x+0.5,y+0.5)抱慌。
數(shù)組的大小叫作分辨率。
2)立方到屏幕
1.忽略z軸眨猎。
2.把[-1,1]^2拉成[0,width]x[0,height]抑进、
Mviewpoint =
3.圖形學(xué)中經(jīng)常使用三角形來劃分,因?yàn)椋?br>
三角形是最基礎(chǔ)的多邊形睡陪。任意多邊形都可以拆成三角形寺渗。
三角形是一個屏幕,內(nèi)外部定義清晰兰迫,重心坐標(biāo)插值方法信殊。
4.拉伸以后,我們?nèi)绾螌⒆筮叺膱D變?yōu)橄袼財?shù)組呢汁果?
我們要進(jìn)行采樣涡拘,將連續(xù)函數(shù)離散化。
于是据德,像素化的過程可以是:
for(int x = 0;x < xmax; ++x)
for(int y = 0;y < ymax; ++y)
image[x][y] = inside(tri,x+0.5,y+0.5);
這里inside是判斷點(diǎn)是否在三角形tri的函數(shù)鳄乏,用之前介紹過的叉乘的方法來判斷。
5.與此同時棘利,我們可以采用使用邊界盒等方法優(yōu)化汞窗,來加速判斷的過程。
3)反走樣
反走樣是抽樣導(dǎo)致的鋸齒等赡译。
1.傅里葉變換其實(shí)就是將函數(shù)分為不同頻率的段仲吏,從時域到頻域。
2.高頻率需要更高次數(shù)的采樣蝌焚,否則會丟失信息裹唆。
3.濾波Filtering = 卷積 = 平均化
刪去一些特定的頻率內(nèi)容。
高通濾波:只有高頻率的信息可以通過只洒。會得到邊界信息许帐。
低通濾波:只有低頻率的信息可以通過。會得到模糊信息毕谴,邊界信息會被模糊成畦。
時域的卷積=頻域的乘積。
4.減少走樣的方法
A.提高采樣率涝开。
B.反走樣:
采樣前模糊(卷積后再采樣)循帐,這樣會使得模糊的區(qū)域顏色變淺了,采樣后也會是這個顏色舀武。先采樣后模糊不行拄养。
C.超采樣:
MSAA(它的原理是增加計算量,原本4x4的像素塊再細(xì)分下去每個像素塊里有4個小像素塊银舱,先去判斷小像素塊是否在三角形內(nèi)部瘪匿,然后再判斷大像素塊中有幾個小像素塊在三角形內(nèi)部跛梗,用這個比例乘顏色深度。)
FXAA (先得到一個有鋸齒的圖棋弥,再通過圖像匹配的方法找到邊界核偿,再將其處理替換)
TAA(把MSAA應(yīng)用在時間上,暫時保留上一幀的結(jié)果)
題外話:超分辨率方法(本質(zhì)已經(jīng)不是采樣問題)顽染,它可以把低分辨率變?yōu)楦叻直媛氏芟椤LSS。
4)畫家的算法
先畫遠(yuǎn)處的東西家乘,再畫近處的蝗羊,從而使得近處物體可以覆蓋遠(yuǎn)處的。
缺陷在于:如果物體的深度并沒有準(zhǔn)確的順序仁锯,這個算法就無法執(zhí)行了耀找。于是引入了Z-buffer算法。
5)Z-buffer
采用額外的緩存來存每個像素的最淺深度信息业崖。(也即本來有frame-buffer存顏色信息野芒,現(xiàn)在再多個Z-buffer存深度信息。)
z總是正的双炕,越小表示離我們越近狞悲。
時間復(fù)雜度為O(n),因?yàn)槊總€三角形要遍歷的像素可以看作為常數(shù)妇斤,n個三角形要遍歷n次摇锋,所以是O(n)。
假設(shè)不同三角形不會存在相同的深度站超。