掃瞄線z buffer消隱演算法思想與資料結構

2021-07-26 21:09:24 字數 1649 閱讀 6762

從馮結青老師上的圖形學課件上摘錄:

基本思想

開兩個一維陣列xresolotion分別作為當前掃瞄線的z緩衝器和幀緩衝器

在處理當前掃瞄線時

求出該掃瞄線與場景中各多邊形的二維投影之間的交點

一條掃瞄線與乙個多邊形有偶數個交點,對每對交點之間的畫素計算其深度值,與z緩衝中的值比較,若可見,將該多邊形的屬性寫入幀緩衝器,更新z-buffer中的深度值

當場景中的所有多邊形處理完畢時,掃瞄線幀緩衝器中的內容為畫面在此掃瞄線的消隱結果

資料結構

分類多邊形表:根據多邊形最大y座標ymax將多邊形放入相應類中

分類邊表:根據邊的上端點y座標ymax將邊放入到相應類中

中間資料結構

活化多邊形表:記錄當前掃瞄線與多邊形在oxy平面上投影相交的多邊形

活化邊表:存放多邊形投影邊界與掃瞄線相交的邊對

演算法描述

首先建立分類的多邊形表和邊表

掃瞄順序從上到下:在處理最上面一條掃瞄線前,活化的多邊形表和邊表是空的

在處理每條掃瞄線前,作如下工作:

把幀緩衝器的相應行置成底色

把z緩衝器的各個單元置成最小值(表示離視點最遠)

檢查分類的多邊形表,如果有新的多邊形涉及該掃瞄線,則把它放入活化的多邊形表中

如果有新的多邊形加入到活化多邊形表中,則把該多邊形在oxy平面上的投影和掃瞄線相交的邊加入到活化邊表中

如果有些邊在這條掃瞄線處結束了,而其所在的多邊形仍在活化多邊形表中,則可以從分類多邊形表中找到該多邊形在oxy平面上的投影與掃瞄線相交的新邊或邊對,修改或加到活化邊表中,邊對在活化邊表中的次序是不重要的

增量式的深度更新:從形成的活化邊表中取出乙個邊對

當前掃瞄線y,當前位置x(xl<=x<=xr),深度值zx(左交點zx=zl)

每向右前進乙個畫素:zx=zx+dzx;

比較zx與當前z緩衝器中的z值

如果zx>z,那麼z=zx,將對應畫素顏色置為該多邊形的顏色

對活化邊表中每乙個

邊對按如上方法處理

對於每一條邊對可計算;

dyl=dyl-1      dyr=dyr-1

若dyl或dyr小於0,相應的邊就要從乙個邊對中去掉,從活化邊表中找到合適的邊來代替

xl=xl+dxl xr=xr+dxr

多邊形所在平面對應下一條掃瞄線在x=xl處的深度為

zl=zl+dzldxl+dzy      

q:(dzl  or dzx ?)

活化多邊形表中的元素修改

每乙個多邊形的dy:dy=dy-1

當dy<0時,該多邊形要從多邊形活化表中刪除

掃瞄線演算法

給出幾個矩形對角端點座標,求這些矩形整體覆蓋的面積。基本思想如下圖 先離散化。掃瞄線 是一根想象中的虛線,從左往右掃瞄,遇到 矩形 則成為 事件 遇到 起始邊 則update相應區間的 厚度 或者 覆蓋次數 covercnt 1。遇到 結束邊 則update相應區間的 厚度 covercnt 1。用...

X 掃瞄線演算法

多邊形有兩種重要的表示方法 頂點表示和點陣表示 頂點表示是用多邊形的頂點序列來表示多邊形。這種表示直觀 幾何意義強 佔記憶體少,易於進行幾何變換。但由於它沒有明確指出哪些象素在多邊形內,故不能直接用於面著色 點陣表示是用位於多邊形內的象素集合來刻畫多邊形。這種表示丟失了許多幾何資訊 如邊界 頂點等 ...

寒江雪 區域填充演算法 掃瞄線

區域填充遞迴演算法已經領教過了。記憶體消耗大,時間效率低,經典的深搜思想。為了解決這個問題,於是有人提出了種子填充掃瞄線演算法。其實就是深搜不行,換寬搜 bfs 該演算法假設已知其中乙個畫素點,然後從這個畫素點出發,去尋找周圍可以著色的點。這個已知點,我們稱其為種子點。每一輪著色之後,記錄下著色的區...