1. 程式人生 > >消隱算法(一)——Z-buffer算法

消隱算法(一)——Z-buffer算法

問題 buffer 逆時針 是否 常用 檢測 size 交點 基礎

第四講 消隱算法

一、消隱

消隱:(消除二義性)就是必須在繪制時消除被遮擋的不可見的線或面,習慣上稱作消除隱藏線和隱藏面;

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

1.1消隱的分類

1.1.1按消隱對象分類
(1)線消隱:消隱對象是物體上的邊,消除的是物體上不可見的邊。
(2)面消隱:消隱對象是物體上的面,消除的是物體上不可見的面,通常做【真實感圖形】消隱時用面消隱。

1.1.2按消隱空間分類
(1)物體空間消隱算法:以場景中的【物體】為處理單元,假設場景中有k個物體,將其中一個物體與其余k-1個物體逐一比較,僅顯示它可見表面以達到消隱的目的,通常用於【線框圖】的消隱。
1.Roberts算法:要求所有被顯示的物體都是凸的

,對於凹體要先分割成多個凸體的組合。【計算量甚大】
2.光線投射法:一條視線與場景中的物體可能有許多交點,求出這些交點後需要排序,在前面的才能被看到。
光線投射:是求光線(視線,如視點與象素連成的線)與場景的交點。

(2)圖像空間消隱算法:以屏幕窗口內的每個【象素】為處理單元。確定在每一個象素處,場景中的k個物體哪一個距離觀察點【最近】,從而用它的顏色來顯示該象素。【消隱算法的主流】

畫家算法:要做到去除隱藏面的最簡單的方法。如果一個場景中有許多物體,就是先畫遠的東西,再畫近的東西。這樣一來,近的東西自然就會蓋住遠的東西。技術分享圖片

技術分享圖片

這張圖片由於三個部分互相疊加,無法判斷誰最遠誰最近,所以用畫家算法就無法解決。
——>畫家算法只能解決【簡單場景】

的消隱問題。


1.Z-buffer算法(深度緩沖器算法)

幀緩沖器對應數組:intensity(x,y)——>屬性數組(幀緩沖器)
存儲圖像每個空間可見象素的光強或顏色
深度緩沖器對應數組:depth(x,y)——>深度數組(z-buffer)
存放圖像空間每個可見象素的z坐標
技術分享圖片
假設xoy面為投影面,z軸為觀察方向,過屏幕上任意象素點(x,y)做平行於z軸的射線R,與物體表面相交於p1,p2點,p1和p2點的z值稱為該點的深度值,z-buffer算法比較p1和p2的z值,將最大的z值存入z緩沖器中,顯然屏幕上(x,y)顯示p1點的顏色。

【算法思想】


先將Z緩沖器中各單元的初始值置為最小值,當要改變某個象素的顏色值時,首先檢查當前多邊形的深度值是否大於該象素原來的深度值(保存在該象素所對應的Z緩沖器的單元中),如果大於原來的Z值,說明當前多邊形更靠近觀察點,用它的顏色替換原象素的顏色。

【優點】

(1)Z-buffer算法比較簡單,直觀;
(2)在象素上以近物取代遠物,與物體在屏幕上的出現順序無關,有利於硬件實現。

【缺點】
(1)占用空間大;
(2)沒有利用圖形的相關性與連續性;
(3)該算法是在象素級上的消隱算法。

對缺點進行改進:
【1>並不需要開辟一個與圖像大小相等的深度緩存數組,只用一個深度緩存變量zb的改進算法】
【關鍵問題】
1.判斷象素點(i,j)是否在pk的投影多邊形之內,不是一件容易的事,節省了空間但犧牲了時間。
2.計算多邊形pk在點(i,j)處的深度。設多邊形pk的平面方程
技術分享圖片

【點與多邊形的包含性檢測】
(1)射線法
技術分享圖片
由被檢測點p處向y=負無窮方向作射線,交點個數為奇數,則被檢測點在多邊形內部,交點個數為偶數表示在多邊形外部。
技術分享圖片
若射線正好經過多邊形的頂點, 則采用“左開右閉”的原則來實現,也就是,當射線與某條邊的頂點相交時,若邊在射線的左側,交點有效,計數,若邊在射線的右側交點無效,不計數。

【射線法弊端】
1.計算量大

2.不穩定

(2)弧長法
技術分享圖片
以p點為圓心,作單位圓,把邊投影到單位圓上,對應一段段弧長,規定逆時針為正,順時針為負,計算弧長代數和。
代數和為0,點在多邊形外部;
代數和為2π,點在多邊形內部;
代數和為π,點在多邊形邊上。
【穩定——>假如算出來代數和不是0,而是0.2、0.1,那麽基本上可以斷定這個點在外部,可以認為是計算誤差引起的,實際上是0】
【效率不高——>弧長並不容易求】

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

技術分享圖片
p是被測點,按照弧長法,p點的代數和為2π,現在,不計算角度,以如下規定取代原來的弧長計算
技術分享圖片
同一個象限認為是0,跨過一個象限是π/2,跨過兩個象限是π。

消隱算法(一)——Z-buffer算法