1. Hidden Line Removal (HLR)
在光柵化的文章中勿侯,我們使用Z-Buffer來(lái)判斷三角形面片是否遮擋懦砂,但Z-Buffer不適用于純線框的模型的遮擋剔除。原因如下抚芦。
就如同上圖左側(cè)率拒,在A點(diǎn)的位置崩泡,左側(cè)的三角形由于只畫(huà)邊不畫(huà)面,所以A點(diǎn)它是不畫(huà)的猬膨,所以就沒(méi)有Z值來(lái)與右側(cè)的三角形的A點(diǎn)的Z值做比較角撞,因此就沒(méi)法判斷A點(diǎn)是誰(shuí)在前誰(shuí)在后。
HLR算法總結(jié)
-
Raycasting(光線投射)
- 算出每條光線在屏幕上某個(gè)像素點(diǎn)上的交點(diǎn)位置
- 在該像素點(diǎn)上只保留最近的交點(diǎn)
Painter’s Algorithm(畫(huà)家算法)
簡(jiǎn)單粗暴勃痴,先畫(huà)后面的物體谒所,后畫(huà)前面的物體,就像畫(huà)畫(huà)一樣召耘,后涂的顏色會(huì)覆蓋掉先涂的顏色百炬。
比較兩個(gè)物體褐隆,當(dāng)前視角來(lái)看污它,如果A的點(diǎn)全都在B的點(diǎn)前面,那么先畫(huà)B再畫(huà)A
但缺點(diǎn)也很明顯:
1)如果A的點(diǎn)不全的B的前面,即A有些點(diǎn)從當(dāng)前視角看是在B的某些點(diǎn)后面衫贬,就會(huì)失敗德澈。
2)物體之間有相交的面時(shí),會(huì)失敗固惯。
(好像飛機(jī)的雷達(dá)顯示是用的這個(gè)算法梆造?)-
Warnock Algorithm (沃諾克算法)
核心:分而治之
不停的四分屏幕(一般是四分,也可以二分或者其他分)葬毫,直到被細(xì)分的子空間只存在簡(jiǎn)單的前后關(guān)系(就是畫(huà)家算法的那個(gè)要求)镇辉,或者子空間已經(jīng)細(xì)分到了一個(gè)像素點(diǎn)的大小。
在曲面和抗鋸齒中很有用贴捡。
1)當(dāng)前子空間沒(méi)有多邊形:完成忽肛!
2)當(dāng)前子空間只有一個(gè)多邊形:畫(huà)!
3)當(dāng)前子空間有簡(jiǎn)單的前后關(guān)系:畫(huà)前面的烂斋!
4)當(dāng)前子空間只有一個(gè)像素那么大了:畫(huà)離該像素點(diǎn)距離最近的多邊形屹逛!
5)否則,繼續(xù)遞歸細(xì)分 -
BSP-Tree (Binary Space Partioning trees, 二維空間分割樹(shù))
不停二分汛骂,在每個(gè)存在簡(jiǎn)單前后關(guān)系的子空間里使用畫(huà)家算法罕模。
優(yōu)點(diǎn)
1)可以處理帶透明度的遮擋
2)快:不用每個(gè)像素點(diǎn)都計(jì)算Z并檢測(cè) Z-buffer
新建一個(gè)數(shù)組,叫Z-buffer帘瞭。
每次將像素點(diǎn)顏色寫(xiě)入frame buffer時(shí)淑掌,把該點(diǎn)的Z值也寫(xiě)入Z-buffer。
每次將像素點(diǎn)顏色寫(xiě)入frame buffer之前图张,如果該位置已經(jīng)被寫(xiě)入過(guò)锋拖,拿出它的Z值與正準(zhǔn)備寫(xiě)的點(diǎn)的Z值比較一下,誰(shuí)離屏幕近寫(xiě)誰(shuí)祸轮。
是目前最流行的方法兽埃。
優(yōu)點(diǎn)
1)簡(jiǎn)單
2)高效
缺點(diǎn)
1)增加了內(nèi)存空間,因?yàn)槎嗔藗€(gè)Z-buffer
2)受限于Z的量級(jí) / 精確度
3)過(guò)度渲染:每個(gè)像素點(diǎn)可能會(huì)寫(xiě)入多次适袜。
4)不支持透明度1怼(不支持透明度竟然還會(huì)最流行?)
2. 面片消除(Culling)
Portals
預(yù)先根據(jù)視角計(jì)算出哪些三角形可見(jiàn)苦酱,那些三角形不可見(jiàn)售貌。
(一換視角就GG了)-
視錐Culling
如果某物體全部頂點(diǎn)都在視錐外面,則不顯示疫萤。 Backface Culling (背面消除)
只適用于封閉物體
通過(guò)每個(gè)面的法線來(lái)判斷是正面還是背面颂跨,如果是背面,就隱藏扯饶。