opengl算法學習---消隱


圖形系統

圖形生成
應用程序:頂點
幀緩存:像素
每個頂點與每個像素都要處理

圖形系統實現的兩種策略

基於對象空間

基於圖像空間

圖形繪制系統四階段

建模->幾何處理->光柵化->片元處理

建模:
定義幾何對象的頂點數據庫

幾何處理:
投影、圖元裝配、裁剪、着色
作用於頂點數據

光柵化:
像素賦顏色
掃描轉換
視口變換
屏幕坐標

片元處理
片元賦顏色
隱藏面消除
紋理顏色

消隱

當將三維場景投影到二維平面的時候,需要確定哪些多邊形是可見的,哪些是不可見的
消隱:消除被遮擋的不可見的線或面
未經消隱的圖形存在的問題:雜亂,二義性

后向面消除

外法向:每個多邊形指向物體外部的法向量
前向面:外法向與視線方向夾角為鈍角
后向面:外法向與視線方向夾角為銳角

Z-Buffer算法

繪制物體時,每一個所生成像素的深度即z坐標,保存在一個緩沖區中,稱為z緩沖區或深度緩沖區
Z緩沖區中的單元與屏幕像素單元一一對應
如果場景中另外一個物體也在同一個像素生成渲染結果,繪制系統就會比較二者的深度,保留距離視點較近的物體。然后將這個所保留的深度保存到深度緩沖區中根據深度緩沖區可正確地實現較近的物體遮擋較遠的物體

幀緩沖器一保存各像素顏色值
Z緩沖器一保存各像素處物體深度值
z緩沖器中的單元與幀緩沖器中的單元一一對應

算法思路

當要顯示某個點時,首先檢查該點處的深度值是否大於該像素對應的深度值
如果大於,說明當前點更靠近視點,用它的顏色替換像素原來的顏色
否則說明當前像素處,當前點被前面所繪制的點遮擋,不可見,像素顏色值不改變

偽代碼

1)初始化:
depthBuffer(x,y)=最小值(最遠深度)
frameBuffer(x, y)=I背景
2)消隱繪制:
    for(每一個多邊形)
        for(該多邊形所覆蓋的每個像素(x, y))
            計算該多邊形在該像素的深度值z(x, y);
        if(z(x, y)>depthBuffer(x, y))
        {depthBuffer(x, y)=z,
            frameBuffer(x, y)=I(x, y)}

計算采樣點(x, y)的深度z (x, y)

假定多邊形的平面方程為:Ax+By+Cz+D=Oo

掃描線上所有后繼點的深度值

當處理下一條掃描線y=y-1時,該掃描線上與多邊形相交的最左邊(x最小)交點的X值可以利用上一條掃描線上的最左邊的X值計算:

深度信息

利用透視變換中偽深度

問題

當深度值比較小時,深度比較常會產生錯誤
當深度值比較小時,真實深度值上的一個小變化映射到偽深度值后變為極小的變化
兩個接近的深度值有可能會被映射為相同的偽深度值,這可能會在深度比較時導致錯誤
因此需要使用更多的位來表示偽深度值24位或32位

優缺點

z緩沖器算法在像素級上以近物取代遠物,與形體在屏幕上的出現順序無關
優點: 1)簡單穩定,利於硬件實現
2)不需要整個場景的幾何數據
缺點: 1)需要一個額外的z緩沖器
2)在每個多邊形占據的每個像素處都要計算深度值,計算量大

掃描線Z-buffer算法

Z緩沖器算法中所需要的z緩沖器容量較大,為克服這個缺點可以將整個繪圖區域分割成若干個小區域
按區域顯示,這樣z緩沖器的單元數只要等於一個區域內像素的個數就可以
如果將小區域取成屏幕上的掃描線,就得到掃描線z緩沖器算法

將窗口分割成掃描線

畫家算法

畫家首先繪制距離較遠的場景,然后用繪制距離較近的場景覆蓋較遠的部分
首先將場景中的多邊形根據深度進行排序,然后按照順序進行繪制
這樣可自然解決可見性問題

下列情況無法正確排序
1.多邊形循環遮擋 2.多邊形相互穿透

解決辦法:分割成兩個

算法思想

1)先把屏幕置成背景色
2)先將場景中的物體按其距觀察點的遠近進行排序,結果放在一張線性表中;(線性表構造:距觀察點遠的稱優先級低,放在表頭;距觀察點近的稱優先級高,放在表尾。該表稱為深度優先級表)
3)然后按照從遠到近(從表頭到表尾)的順序逐個繪制物體。

算法步驟

一種針對多邊形的排序算法如下:
Step 1:將場景中所有多邊形存入一個線性表,記為L;
Step 2:如果L中僅有一個多邊形,算法結束;否則根據每個多邊形的Zmin對它們預排序。不妨假定多邊形P落在表首,即Zmin (P)為最小。再記Q為L一{P}(表中其余多邊形)中任意一個;
Step 3:判別P,Q之間的關系,有如下二種:
(1):對所有的Q,有Zmax(P) < Zmin(Q)則多邊形P的確距觀察點最遠,它不可能遮擋別的多邊形。返回第二步
(2) 存在某一個多邊形Q,使Zmax (P)>Zmin(Q),需進一步判別

2 利用包圍盒排序
A)若P, Q的投影P',Q'的包圍盒不相交(圖a),則P,Q表中的次序不重要,令L= L- {P},返回step 2;否則進行下一步
B)若P的所有頂點位於Q所在平面的不可見的一側(圖b)則P, Q關系正確,令L= L- {P},返回step 2;否則進行下一步
c)若Q的所有頂點位於P所在平面的可見的一側(圖C),則P, Q關系正確,令L=L-{P},返回step 2;否則進行下一步
D)對P, Q投影P',Q'求交,若P',Q'不相交(圖d),則P, Q在表中的次序不重要,令L=L-{P},返回step 2;否則在它們所相交的區域中任取一點,計算P, Q在該點的深度值,如果P的深度小,則P, Q關系正確,令L=L-{P},返回step 2;否則交換P, Q,返回step 3.

包圍盒技術

應用一避免盲目求交
定義:一個形體的包圍盒指的是包圍它的簡單形體。
一個好的包圍盒要具有兩個條件:
包圍盒充分緊密包圍着形體;
對其的測試比較簡單。

分析

深度排序計算量大
遇到多邊形相交,或多邊形循環重疊的情形,還必須分割多邊形
畫家算法的這些缺陷導致了深度緩沖技術的發展

光線跟蹤算法

將通過繪圖窗口內每一個像素的投影線與場景中的所有多邊形求交
如果有交點,用深度值最大的交點(最近的)所屬的多邊形的顏色顯示相應的像素
如果沒有交點,說明沒有多邊形的投影覆蓋此像素,用背景色顯示即可

算法原理

算法描述

1.通過視點和投影平面(顯示屏幕)上的所有像素點作一入射線,形成投影線。
2.將任一投影線與場景中的所有多邊形求交。
3.若有交點,則將所有交點按z值的大小進行排序,取出最近交點所屬多邊形的顏色;若沒有交點,則取出背景的顏色。
4.將該射線穿過的像素點置為取出的顏色。

偽代碼

for(圖像中的每條掃描線)
      for(掃描線上的每個像素)
      { 確定從投影中心穿過像素的投影線;
        for(場景中每一個多邊形)
              將投影線與多邊形求交;
        if(有交點)
              以最近交點所屬多邊形的顏色顯示該像素
        else
              以背景色顯示該像素
      }

消隱問題分析

與觀察對象有關:消隱目標
與視點有關:消隱判斷標准
消隱依據:三維坐標
消隱結果:二維坐標
以視點為標准將對象按空間位置遠近進行排序

解決方案

先三維排序,再繪制二維->畫家算法
二維繪制,同時依據三維判定可見性->Z-Buffer算法

物體空間消隱:以場景物體各個面為處理單元
將場景物體各個面與其它面比較,確定其可見性
設場景中有k個多邊形,顯示區域為m*n個像素,則物體空間消隱運算量與k有關

圖像空間消隱:以投影平面上各像素為處理單元
對投影平面上各像素,確定距視點最近物體,以該物體表面顏色來顯示像素
設場景中有k個多邊形,顯示區域為m*n個像素,則圖像空間消隱運算量與k n m有關


免責聲明!

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



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