光柵化的理解

2021-08-10 21:39:49 字數 3969 閱讀 1110

計算機的螢幕是二維的平面座標,以左上角為原點,x軸向右增加,y軸向下增加。

在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個畫素點。所以光柵化的連點描邊是乙個近似過程。

ps:目前主流的麵片分割是三角形分割,所以大家在3ds max或者maya裡看3d模型的網格,基本都是三角形網格,但也有以四邊形為最小分割的演算法,這裡不涉及,我們認為3d模型的麵片單元都是三角形。

那麼乙個三角形的顏色怎麼規定呢?

(1)三個頂點顏色取平均值

(2)取某乙個頂點的顏色

(3)三個頂點顏色的漸變

這三種方法都可以,根據實際情況自行斟酌。

光柵化主要有以下幾步:

讀取模型的頂點,3個3個的讀,因為要畫三角形。

將3個頂點兩兩連成線,形成三角形。

計算螢幕畫素點在三角形內還是三角形外。在三角形內部的,就上色(顏色是之前算出來的),在三角形外部的,就不上色。

注意:如果乙個三角形擋在另乙個三角形前面,我們應該只畫前面的三角形。所以這裡還需要比較一下正準備上色的這個畫素點是不是已經上過色了。如果這個畫素點已經上過色了,並且它是被z=1的頂點上的色,而我們正準備上色的這個頂點的z=2(說明這個頂點被擋在了後面),那麼這個頂點就不應該上色,因為它是被擋住的點。)

不斷的迴圈,直到畫完3d模型的所有三角形,這樣乙個模型就出來了!

那麼,假設我們已經得到了3個頂點的座標,並且已知這個三角形是紅色。

v1 (-1.5, 1.5, 1.5)

v2 (1.5, 1.5, 1.5)

v3 (0.2, 0.2, 0.2)如何判斷螢幕的哪些畫素點在該三角形內部?主流的演算法有兩種:

1.lee(linear expression evaluation)

2.scan line

本期只講lee,因為scan line我沒有親自搞過。lee大致原理如下:

首先因為螢幕只有二維,所以判斷點和邊的位置關係的時候可以先不管z,z只是用來判斷前後遮擋的。

按照順時針(或者逆時針)的順序,連線v1v2, v2v3, v3v1,這樣就得到了三條邊。

假定邊的頭是(x+dx, y+dy),尾是(x, y)

計算這3條邊的方程:e(x,y) = dy(x-x)-dx(y-y)

展開之後是dy*x+ (-dx)*y+ (dx*y-dy*x) = 0

即ax+ by+ c =0

其中a = dy, b = -dx, c = dx*y-dy*x

我們把v1v2, v2v3, v3v1三條邊的a, b, c都求出來,就得到了3條邊的方程e1, e2, e3。

將螢幕畫素點的x,y帶入方程,a1x+ b1y+ c1 = e1,如果點在邊上,則e1=0,如果點不在邊上,則e1!=0。

最神奇的地方來了。如果點(x,y)帶入3個方程的結果e1, e2, e3同時大於0或者同時小於0,即同號,則該點在三角形內,如果異號,則在三角形外。

每次獲得3個點之後,取出其中的min_x, max_x, min_y, max_y構成的四邊形,將螢幕畫素點(x,y)中,在該範圍內的點取出,帶入lee公式比較結果。

如果該點在三角形內,並且沒有被遮擋(需要對z進行判斷),則上色,否則不上色。不斷迭代,直到所有的三角形都被處理完成,3d模型也畫到了螢幕上。

需要注意的地方:

如何判斷遮擋,即得到三角形內的點的z值?

答:我們知道了v1, v2, v3三個點,可以求三角形平面方程,求出之後,只需要將某個點的(x,y)代入,即可求出z。

平面方程一般式為:ax + by + cz + d = 0

取e1, e2兩個邊向量,進行叉乘,得到法向量n(a,b,c)

沒錯,你沒看錯,n的x, y, z即是a, b, c。(數學真神奇)

然後取v1(x, y, z)帶入方程,求出d,平面解析式就得到了。

然後將想求z的點的x,y帶入,就可以求出z了。

螢幕的z軸是朝里的,所以z越大說明離我們越遠,z越小就裡我們越近,近處的會遮擋遠處的。

lee的特殊情況

由於多個三角形的邊和邊是互相挨著的,所以如果直接按上面的方法畫,會有很多邊重複畫了2遍,為了提高渲染效率,我們需要保證每條邊只畫一遍

怎麼保證呢?答:只畫三角形的左邊和上邊

如何定義左邊和上邊?由於重畫這個問題只出現在邊上,對於三角形內部的畫素點,都是只畫一次的,所以不用考慮內部點,只考慮三條邊上的點。

如圖所示:

1)假定三角形v1v2v3是這樣的,我們當前要上色的畫素點為p1(紅色),落到了v1v3這條邊上,那麼就取不在這條邊上的頂點v2,計算過v2的水平線與v1v3的交點r1,如果r1在v2的右側,即r1.x > v2.x,那麼說明p1是落在了右側的邊,所以不畫

2)假定我們當前要上色的畫素點為p2(綠色),落到了v2v3這條邊上,那麼就取不在這條邊上的頂點v1,計算過v1的水平線與v2v3的交點r2,如果r2在v1的右側,即r2.x > v1.x,那麼說明p2是落在了右側的邊,所以不畫

3)假定我們當前要上色的畫素點為p3(藍色),落到了v1v2這條邊上,那麼就取不在這條邊上的頂點v3,計算過v3的水平線與v1v2的交點r3,如果r3在v3的右側,即r3.x > v3.x,那麼說明p3是落在了右側的邊,但圖中是r3.x < v3.x,所以p3落在了左側邊,要畫

4)如果存在垂直邊或者水平邊,怎麼判斷左右?垂直邊和上面是一種情況,不用單獨拿出來考慮。

水平邊的畫,只畫上方,即只畫左邊和上邊還是看上圖,假定邊v2v3是水平的,那麼我們取v1,發現v1的y比較小,即v1在v2v3上方,那麼邊v2v3就是下邊,所以不畫,反之則畫。

網頁光柵化

資料 總結來說,分塊的光柵化過程包含了以下三個主要的步驟 1.根據分塊的可見性,將它們劃分到不同的bin中。2.根據記憶體限制策略,從優先順序較高的bin中選集出需要光柵化的分塊。3.為每乙個需要光柵化的分塊分配光柵化記憶體,並且分別為它們建立光柵化任務。光柵化任務的執行過程又主要分為以下兩個步驟 ...

什麼是光柵化

2015 04 02 00 44 555人閱讀收藏 舉報 光柵化是將乙個圖元轉變為乙個二維影象的過程。二維影象上每個點都包含了顏色 深度和紋理資料。將該點和相關資訊叫做乙個片元 fragment 光柵化的目的,是找出乙個幾何單元 比如三角形 所覆蓋的畫素。粗略地講 你模型的那些頂點在經過各種矩陣變換...

什麼是光柵化

計算機圖形學常常聽到乙個名詞,光柵化 什麼是光柵化?光柵化 rasterization 是把頂點資料轉換為片元的過程。具有將圖轉化為乙個個柵格組成的圖象的作用,特點是每個元素對應幀緩衝區中的一畫素。光柵化其實是一種將幾何圖元變為二維影象的過程。該過程包含了兩部分的工作。第一部分,決定視窗座標中的哪些...