GAMES101圖形學(xué)之光柵化(上)

前提

可以先看這個 《計算機(jī)圖形學(xué)基礎(chǔ)》之圖像的光柵化,不看的話要記住以下幾件事:

  • 屏幕是由很多個像素組成的,分辨率就是指像素的數(shù)量
  • 先把一些 3D 物體在場景中擺放好,光柵化就是從一個角度看這些物體,把看到的畫面顯示在由很多像素組成的屏幕上的過程。
  • 一個像素只能顯示一種顏色,你可以理解為一個像素就是一個正方形的小格子。
  • 一個像素里面有 RGB 三種顏色的強(qiáng)度,一般都是用的 8bit 寄存器,也就是每個通道是 0-255 的強(qiáng)度。(2^8 = 256)

定義像素坐標(biāo)

《計算機(jī)圖形學(xué)基礎(chǔ)》中定義的方式不同,這門課程的定義方式如下:


從 0 開始,藍(lán)色格子的坐標(biāo)為 (2,1),藍(lán)色格子中心點坐標(biāo)為 (2.5,1.5)。

視口變換

設(shè)定屏幕的寬為 weight 像素,高為 height 像素。前面經(jīng)歷了 模型變換,攝像機(jī)變換投影變換(MVP)之后,得到了一個 [-1,1]^3 的立方體之后,需要將該立方體變換到屏幕上,也就是先放大 [weight/2,height/2],再往右上移動 [weight/2,height/2],就可以使得立方體原來 (-1,-1,0) 的點變換到屏幕坐標(biāo)的 (0,0) 點。這里的深度,也就是 z 軸先不用管。

把標(biāo)準(zhǔn)立方體映射到屏幕

變換矩陣為:
大框框控制縮放,小框框控制平移

光柵化

因為模型是由很多三角形組成的,所以此時,這個畫面也依然是由很多三角形構(gòu)成,我們要把它變成一個個小方塊(像素)。(至于為什么是三角形,是因為三角形有良好的性質(zhì),比如可以根據(jù)三個角對內(nèi)部進(jìn)行插值等)

要把左邊由三角形構(gòu)成的圖變成右邊,也就是使得右邊每一個像素都是單一的顏色

對于完全是橘色的像素,和完全是白色的像素很好上色,但對于一半是橘色,一半是白色的如何給像素上色就是一個問題。
這就涉及到圖形學(xué)中一個常見的方法:采樣。如何上色取決于某個位置是否在三角形內(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 貼圖進(jìn)行采樣得到其表示的模型。
回到如何給一半橘,一半白的像素上色的問題,對像素中心點采樣之后,如果該點在內(nèi)部,則整體都是橘色,反之整體都是白色。
使用像素中心點采樣

確定是否在三角形內(nèi)

添完色

很明顯的鋸齒,光柵化圖形學(xué)的問題之一,下一章討論優(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ū)域:


只需要遍歷藍(lán)色部分即可

進(jìn)一步可能的優(yōu)化是每一行都取最左和最右,對于那種瘦瘦長長斜斜的三角形來說會優(yōu)化很多:


指路

https://www.bilibili.com/video/BV1X7411F744?p=5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容