前提
可以先看這個 《計算機圖形學基礎》之圖像的光柵化羹蚣,不看的話要記住以下幾件事:
- 屏幕是由很多個像素組成的奢赂,分辨率就是指像素的數(shù)量
- 先把一些 3D 物體在場景中擺放好确虱,光柵化就是從一個角度看這些物體买窟,把看到的畫面顯示在由很多像素組成的屏幕上的過程。
- 一個像素只能顯示一種顏色俺附,你可以理解為一個像素就是一個正方形的小格子萎庭。
- 一個像素里面有 RGB 三種顏色的強度,一般都是用的 8bit 寄存器光稼,也就是每個通道是 0-255 的強度或南。(2^8 = 256)
定義像素坐標
與《計算機圖形學基礎》中定義的方式不同,這門課程的定義方式如下:
從 0 開始艾君,藍色格子的坐標為 (2,1)采够,藍色格子中心點坐標為 (2.5,1.5)。
視口變換
設定屏幕的寬為 weight 像素冰垄,高為 height 像素蹬癌。前面經(jīng)歷了 模型變換,攝像機變換,投影變換(MVP)之后逝薪,得到了一個 [-1,1]^3 的立方體之后隅要,需要將該立方體變換到屏幕上,也就是先放大 [weight/2,height/2]董济,再往右上移動 [weight/2,height/2]步清,就可以使得立方體原來 (-1,-1,0) 的點變換到屏幕坐標的 (0,0) 點。這里的深度感局,也就是 z 軸先不用管尼啡。
把標準立方體映射到屏幕
變換矩陣為:
大框框控制縮放暂衡,小框框控制平移
光柵化
因為模型是由很多三角形組成的询微,所以此時,這個畫面也依然是由很多三角形構(gòu)成狂巢,我們要把它變成一個個小方塊(像素)撑毛。(至于為什么是三角形,是因為三角形有良好的性質(zhì)唧领,比如可以根據(jù)三個角對內(nèi)部進行插值等)
要把左邊由三角形構(gòu)成的圖變成右邊藻雌,也就是使得右邊每一個像素都是單一的顏色
對于完全是橘色的像素,和完全是白色的像素很好上色斩个,但對于一半是橘色胯杭,一半是白色的如何給像素上色就是一個問題。
這就涉及到圖形學中一個常見的方法:采樣受啥。如何上色取決于某個位置是否在三角形內(nèi)部做个,最簡單的方法就是把這個位置定在像素中心點,那么問題就轉(zhuǎn)換成了每個像素中心點是否在三角形內(nèi)部滚局,如果我們有一個
Inside=F(x,y) (0≤x≤weight,0≤y≤height)
的連續(xù)函數(shù)居暖,那么只需要令 (x,y) 等于一個像素的中心點,得到一個 bool 值藤肢,代表了該點是否在三角形內(nèi)部太闺。這就是采樣,就是使連續(xù)函數(shù)離散化的過程嘁圈。上述是在二維空間的采樣省骂,在三維空間也可以采樣,比如對一個 SDF 3D 貼圖進行采樣得到其表示的模型最住。回到如何給一半橘钞澳,一半白的像素上色的問題,對像素中心點采樣之后温学,如果該點在內(nèi)部略贮,則整體都是橘色,反之整體都是白色。
使用像素中心點采樣
確定是否在三角形內(nèi)
添完色
很明顯的鋸齒逃延,光柵化圖形學的問題之一览妖,下一章討論優(yōu)化辦法。
Inside 函數(shù)的實現(xiàn)
如何實現(xiàn)這個函數(shù)呢揽祥?看下面讽膏,判斷 Q 是否在三角形內(nèi)部。
使用三次叉乘(右手定則)即可:
- P1P2 X P1Q > 0
- P2P0 X P2PQ < 0
- P0P1 X P0Q > 0
三個大小不一樣拄丰,所以 Q 不是在三條線的同一側(cè)府树,所以 Q 在三角形外部。
那是否所有的像素中心點都要采樣一次呢料按?也不是奄侠,對于一個三角形而言,只會覆蓋一個有限的矩形區(qū)域:
只需要遍歷藍色部分即可
進一步可能的優(yōu)化是每一行都取最左和最右载矿,對于那種瘦瘦長長斜斜的三角形來說會優(yōu)化很多: