一、 什么是光柵化?
光柵化作用是將幾何數據變換后轉換為像素呈現在顯示設備上的一個過程。幾何數據轉換為像素,
本質是坐標變換、幾何離散化,如下:
其中包含了坐標變換和幾何離散化:
二、光柵化完成了什么
3D中,物體是3維的,擁有X, Y, Z三個坐標,并且擁有R, G, B三種顏色,alpha透明度,U, V貼圖坐標,N法線。
三維物體在二維屏幕上的顯示,大致分為以下幾步:
- 坐標變換(transform)
將場景中的三維坐標轉換為二維坐標,這個請參考我的文章坐標系空間變換。 - 顏色計算(shade)
計算每個頂點的顏色,通過UV貼圖的顏色,結合光照,透明度等,計算出模型每個頂點的具體顏色(R, G, B)。 - 光柵化(rasterization)
假定屏幕分辨率為1920×1080,在二維屏幕渲染(光柵化)時,內存中frame buffer只保存著1920×1080個屏幕點的顏色,然后一個一個的畫到屏幕上。(它的實現方式是以一個1920×1080長的一維數組儲存每個頂點的RGB顏色,然后遍歷數組畫出來)
什么X, Y, Z,什么alpha之類的frame buffer都沒有的,在frame buffer里只有3個值:R, G, B。
X, Y, Z, alpha等等屬性要在另外的地方存儲。
光柵化,就是計算出1920×1080這么長的RGB數組中,每一個RGB的值。
三、光柵化怎么完成的
我們計算出了3D模型每個頂點的顏色,這個是基于3維坐標的,頂點的三維坐標可以是小數。
但在屏幕渲染時,屏幕是只有X,Y二維的,并且其像素點坐標都是整數。1920×1080的屏幕只有1920×1080=2073600個像素點。所以光柵化的連點描邊是一個近似過程。
? ? ? 目前主流的面片分割是三角形分割,所以大家在3DS MAX或者MAYA里看3D模型的網格,基本都是三角形網格,但也有以四邊形為最小分割的算法,這里不涉及,我們認為3D模型的面片單元都是三角形。而光柵化主要有以下幾步:
- 讀取模型的頂點,3個3個的讀,因為要畫三角形。
- 將3個頂點兩兩連成線,形成三角形。
- 計算屏幕像素點在三角形內還是三角形外。在三角形內部的,就上色(顏色是之前算出來的),在三角形外部的,就不上色。
(注意:如果一個三角形擋在另一個三角形前面,我們應該只畫前面的三角形。所以這里還需要比較一下正準備上色的這個像素點是不是已經上過色了。如果這個像素點已經上過色了,并且它是被Z=1的頂點上的色,而我們正準備上色的這個頂點的Z=2(說明這個頂點被擋在了后面),那么這個頂點就不應該上色,因為它是被擋住的點。) - 不斷的循環,直到畫完3D模型的所有三角形,這樣一個模型就出來了!
總結:
總的來說,像素和紋素實際上是點,不是實體的塊。屏幕空間原點是左上角的物理像素,但是紋理坐標原點是紋素矩形的最左上角。最重要的是,記住當你要將紋理中的紋素正確的映射到屏幕空間中的像素時,你需要減去0.5個單位。