消隱算法


消隱算法

一、消隱

當我們觀察空間任何一個不透明的物體時,只能看到該物體朝向我們的那些表面,其余的表面由於被物體所遮擋我們看不到。

若把可見的和不可見的線都畫出來,對視覺會造成多義性。

會有后邊兩種情況

要消除二義性,就必須在繪制時消除被遮擋的不可見的線或面,習慣上稱作消除隱藏線和隱藏面,簡稱為消隱。

消隱不僅與消隱對象有關,還與觀察者的位置有關。

二、消隱的分類

1>按消隱對象分類

線消隱:消隱對象是物體的邊

面消隱:消隱對象是物體上的面

2>按消隱空間分類

物體空間的消隱算法:

以場景中的物體為處理單位。假設場景中有k個物體,將其中一個物體與其余k-1個物體逐一比較,僅顯示它可見表面已達到消隱的目的。(此類算法通常用於線框圖的消隱!)

圖像空間的消隱算法:

以屏幕窗口內的每個像素為處理單元。對屏幕上每個像素進行判斷,決定哪個多邊形在該像素可見(這類算法是消隱算法的主流

三、圖像空間的消隱算法:

1>Z-buffer算法

2>掃描線算法

3>Warnock消隱算法

畫家算法:去除隱藏面最簡單的算法

原理:若場景中有許多物體,就是先畫遠的物體,再畫近的物體。這樣一來,近的物體自然就會蓋住遠的物體。

 

但實際情況並不理想,在三維場景中,一個物體可能有些部分遠,有些部分近,所以不管用什么順序畫,都無法得到正確的結果,所以畫家算法只能解決簡單場景的消隱問題。

 

Z-buffer算法

1、也稱Z緩沖區算法和深度緩沖器算法(能跟蹤屏幕上每個像素深度的算法),讓計算機生成復雜圖形成為可能。

2、該算法有幀緩沖器和深度緩沖器,對應兩個數組:

Intensity(x,y)-屬性數組(幀緩沖器),存儲圖像空間每個可見像素的光強或顏色

Depth(x,y)-深度數組(Z-buffer),存放圖像空間每個可見像素的Z坐標。

Z-buffer保存的是經過投影變換后的z坐標,距離眼睛近的地方z坐標的分辨率比較大,遠處的分辨率小。

 

3、Z-buffer算法思想

(開一個和幀緩存一樣大小的存儲空間,利用空間上的犧牲換區算法上的簡潔)

(1)先將z緩沖器中各單元的初始值置為最小值

(2)當要改變某個像素的顏色值時,首先檢查當前多邊形的深度值是否大於該像素原來的深度值

(3)如果大於原來的z值,說明當前多邊形更靠近觀察點,用它的顏色替換像素原來的顏色。

4、偽代碼

Z-buffer算法(){

幀緩存全置為背景色

深度緩存全置為最小z值(比如賦一個10^-8次方)

For(每一個多邊形){

掃描轉換該多邊形

For(該多邊形所覆蓋的每個像素(x,y){

計算該多邊形在該像素的深度值Z(x,y);

If(Z(x,y)大於Z緩存在(x,y)的值){

Z(x,y)存入Z緩存中(x,y)

把多邊形在(x,y)處的顏色值存入幀緩存的(x,y)

}

}

}

}

 

5、優點:

(1)算法簡單直觀

(2)在像素級上以近物取代遠物。與物體在屏幕上的出現順序是無關緊要的,有利於硬件實現

(3)內存容量不再是問題后很受歡迎

6、缺點

(1)占空間大(因為要開一個和幀緩沖器一樣大的數組,多了z緩存)

(2)沒有利用圖形的相關性和連續性(提高算法的效率要利用圖形的相關性和連續性)

(3)是在像素級上的消隱算法

Z-buffer算法的改進(只用一個深度緩存變量zb的改進算法)

1、將緩存數組zb改為一個深度緩存變量zb

2、偽代碼

Z-buffer算法(){

幀緩存全置為背景色

For(屏幕上的每個像素(i,j)){

深度緩存變量zb置最小值MinValue

For(多面體上的每個多邊形Pk){

If(像素點(i,j)Pk的投影多邊形之內){

計算Pk(i,j)處的深度值depth;

If(depth>zb){

Zb=depth;

Index=k;(記錄多邊形的序號)

}

}

}

If(zb!=MinValue)

計算多邊形Pindex在交點(i,j)處的光照顏色並顯示

}

}

關鍵問題:判斷像素點(i,j)Pk的投影多邊形之內不容易

深度如何求?多邊形的平面方程為ax+by+cz+d=0,可得出z

點與多邊形的包含性檢測

一、射線法

1、由被測點P處向y=-無窮方向作射線

2、交點個數是奇數,則被測點在多邊形內部,交點個數是偶數,則被測點在多邊形外部

 

3、若射線正好經過多邊形的頂點,則采用“左開右閉”的原則來實現

即:當射線與某邊的頂點相交時,若邊在射線的左側,交點有效,計數;若邊在射線的右側,交點無效,不計數;

4、用射線法來判斷一個點是否在多邊形內的弊端:

1)計算量大(因為要大量求交)

2)不穩定(左開右閉有誤差,在左邊但由於誤差算在了右邊,不計數了)

二、弧長法

P點為圓心作單位圓,把邊投影到單位圓上,對應一段段弧長,規定逆時針為正,順時針為負,計算弧長代數和

 

代數和為0,點在多邊形外部;代數和為2π,點在多邊形內部;代數和為π,點在多邊形邊上

算法為什么穩定?即使算出來后代數和不為0,而是0.10.2,那么基本可以斷定這個點在外部,可以認為是有計算誤差引起的。

但是算弧長並不容易,因此派生出一個新的方法-

以頂點符號為基礎的弧長累加方法

1、不計算角度,用一個規定取代原先的計算

 

3、同一個象限認為是0,跨過一個象限是π/2,跨過兩個象限是π。這樣當要計算代數和的時候,就不用投影了,只要根據點所在的象限一下子就判斷出多少度,這樣幾乎沒什么計算量,只有一些簡單的判斷,效率高。

區間掃描線算法

1、該算法放棄了z-buffer算法,是一個新的算法,這個算法被認為是消隱算法中最快的之一,因為不管是哪一種z-buffer算法,都是在像素級上處理問題,每個像素都要進行判斷,甚至一個像素要進行多次(一個像素可能會被多個多邊形覆蓋)

2、

 

3、主要思想:如果把掃描線和多邊形的交點求出來,對每個區間,只要判斷像素畫什么顏色,那么整個區間的顏色都解決了(單位是區間

4、如何確定小區間的顏色?

(1)小區間上沒有任何多邊形,如[a4,a5],用背景色顯示

(2)小區間上只有一個多邊形,如[a1,a2],顯示該多邊形的顏色

(3)小區間上存在兩個或兩個以上的多邊形,如[a6,a7],必須通過深度測試判斷哪個多邊形可見

 

Warnock消隱算法

 

1、思想:采用分而治之的思想,利用了堆棧的數據結構(把物體投影到全屏幕窗口上,然后遞歸分割窗口,直到窗口內目標足夠簡單,可以顯示為止)

2、什么情況,畫面足夠簡單可以立即顯示?

(1)窗口中僅包含一個多邊形

 

(2)窗口與一個多邊形相交,且窗口內無其它多邊形

 

(3) 窗口被多邊形包圍

 

(4) 窗口與一個多邊形分離(窗口顯示背景色)

 

3、如何判別一個多邊形和窗口是分離的?

 

4、如何判別一個多邊形在窗口內?

 

5、算法步驟:

(1)如果窗口內沒有物體則按背景色顯示

(2)如果窗口內只有一個面,則把該面顯示出來

(3)否則,窗口內含有兩個以上的面,則把窗口等分成四個子窗口。對每個小窗口再做上述同樣的處理。這樣反復的進行下去。

 

光柵掃描算法小結

1、直線段的掃描轉換算法

(1)DDA算法主要利用了直線的斜截式方程(y=kx+b,在這個算法里引用了增量的思想,結果把一個乘法變成了一個加法。

(2)中點法是采用的直線的一般式方程,也采用了增量的思想,比DDA算法的優點是采用了整數加法

(3)Bresenham算法也采用了增量和整數加法,優點是這個算法還能用於其它二次曲線

2、多邊形的掃描轉換和區域填充

把邊界表示的多邊形轉換成由像素點表示的多邊形

有四個步驟:求交、排序、配對、填色。為了避免求交運算,引入了一個新的思想-圖形的連貫性。手段就是利用增量算法和特殊的數據結構,兩個指針數組和兩個指針鏈表。

3、直線和多邊形裁剪

Cohen-Suther land算法和Liang-barsky算法

Cohen-Suther land核心為編碼,把屏幕分成9個部分,用4個編碼來描述這9個區域,通過4位編碼的“與”“或”運算來判斷直線段是否在窗口內或外。

Liang-barsky算法:

用參數方程表示

把被裁剪的直線段看成是一條有方向的邊,把窗口的四條邊分成兩類:入邊和出邊

4、走樣、反走樣

用離散量表示連續量,有限的表示無限的會導致一些失真,這種現象成為走樣。

反走樣主要有三種方法:
提高分辨率、區域采樣、加權區域采樣

提高分辨率有物理限制,因為分辨率不能無限增加

區域采樣可以把關鍵部位變得模糊一點,有顏色的過渡區域,產生好的視覺效果

加權區域時不但要考慮區域采樣,而且要考慮不同區域的權重,用積分、濾波等技巧來做。

5、消隱

在繪制場景是消除被遮擋的不可見的線或面,稱作消除隱藏線和隱藏面,簡稱為消隱。

按消隱空間分類:

(1)物體空間  以場景中的物體為處理單元

(2)圖像空間  以屏幕窗口內的每個像素為處理單元

 

區間掃描線算法:發現掃描線和多邊形的交點把掃描線分成若干區間,每個區間只有一個多邊形可以顯示。利用這個特點可以把逐點處理變成逐段處理,提高了算法效率。

Warnock消隱算法:采用了分而治之的思想,利用了堆棧的數據結構

核心思想:

1>增量

2>編碼

3>整數、符號判別

4>圖形連貫性

5>分而治之:把一個復雜對象進行分塊,分到足夠簡單再進行處理

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM