資料介紹
作者:隱士低手
在學(xué)習(xí)場(chǎng)景管理之前,我們要先學(xué)習(xí)一下視錐體剔除(VFC),因?yàn)闊o(wú)論你使用什么空間劃分算法,劃分的空間都要進(jìn)行視錐體剔除,被剔除的空間內(nèi)部的所有物件都會(huì)被拋棄以此來(lái)加速渲染或碰撞。這也是場(chǎng)景管理的核心目的。
1. 包圍體(BV)與視錐體
包圍體就是把一個(gè)模型或空間包住的最小幾何體,可以是球體,AABB包圍盒,OBB包圍盒。視錐體是一個(gè)被遠(yuǎn)近裁減面截?cái)嗟腻F體(6面體)。視錐體剔除就是判斷包圍體和視錐體的位置關(guān)系。不同的包圍體與視錐體進(jìn)行相交判斷,復(fù)雜度是不一樣的。這里的復(fù)雜度由低到高的順序是球體 < AABB < OBB。另外如果把視錐體變成一個(gè)AABB包圍體,那么相交判斷也會(huì)變的非常簡(jiǎn)單。所以這里有一個(gè)優(yōu)化點(diǎn)就是可以把復(fù)雜的包圍體外面再套一個(gè)簡(jiǎn)單的包圍體,比如AABB上面包裹一個(gè)球體,然后使用球體和視錐體進(jìn)行測(cè)試,如果球體在視錐體內(nèi)再做AABB測(cè)試。再比如可以把視錐體變成AABB然后進(jìn)行測(cè)試,如果在AABB中再進(jìn)行視錐體測(cè)試。這里只是提出一種優(yōu)化的可能性,并不代表性能一定會(huì)提升。這取決于場(chǎng)景,如果一個(gè)場(chǎng)景中有很多節(jié)點(diǎn),并且大部分節(jié)點(diǎn)都在視錐體之外那么這個(gè)優(yōu)化應(yīng)該會(huì)有一定的提升。我們應(yīng)該注意到多一份包圍體,就會(huì)多一份內(nèi)存,天下沒(méi)有免費(fèi)的午餐,又一個(gè)空間換時(shí)間的優(yōu)化算法。
2. 位置關(guān)系
包圍體和視錐體有三種位置關(guān)系
① 包圍體在視錐體外部
② 包圍體在視錐體內(nèi)部
③ 包圍體部分在視錐體內(nèi)部(相交)
如果包圍體在視錐體外部,說(shuō)明這個(gè)節(jié)點(diǎn)下的全部物件都不在可視范圍內(nèi),可以全部丟棄。
如果包圍體在視錐體內(nèi)部說(shuō)明全部物件都在視錐體內(nèi)部,這些物件都會(huì)傳遞到GPU中進(jìn)行渲染。這里有一個(gè)問(wèn)題,如果包圍體在視錐體內(nèi)部也就說(shuō)明所有包圍體中的物件都在視錐體內(nèi)部。物件進(jìn)入到GPU中被拆解成三角面片,這些圖元在GPU中做齊次空間裁剪,但這些三角面片其實(shí)是不需要做齊次空間裁剪的,因?yàn)樗鼈兊奈恢藐P(guān)系已經(jīng)確定了,一定是在視錐體內(nèi)部。GPU做了重復(fù)的工作。以前VFC和三角面片裁剪都在CPU中計(jì)算那么可以做標(biāo)記優(yōu)化,現(xiàn)在cpu和gpu按照流水線的方式工作,gpu并不知道這些三角面片不需要被裁剪,甚至gpu的設(shè)計(jì)就是喜歡蠻干并行處理,根本不管你邏輯是否已經(jīng)被剔除。如果能夠把VFC的工作交給gpu,一方面可以降低cpu的負(fù)擔(dān),另一方面gpu也可以避免一些重復(fù)性的工作,是不是會(huì)更好,這些疑問(wèn)只有等到學(xué)習(xí)完Gpu driven rendering pipelines才能給出答案了。
包圍體部分在視錐體內(nèi)部,這說(shuō)明包圍體中的物件可能在視錐體中,可能在視錐體外,這時(shí)候我們需要做進(jìn)一步的判斷就是用每一個(gè)物件的包圍體進(jìn)行VFC。如果游戲的性能壓力在cpu端,通常我們不會(huì)做進(jìn)一步的測(cè)試。
3. 視錐體的六個(gè)面
視錐體的六個(gè)面由遠(yuǎn)近裁剪面,及上下左右四個(gè)面組成。
我們需要將這六個(gè)面用平面公式表示出來(lái)。
一個(gè)平面可以由平面上的三個(gè)點(diǎn)確定,也可以由平面法線和平面上的一個(gè)點(diǎn)確定。
我們只需要根據(jù)已知變量求解出上圖中的ntl,nbl,ntr,nbr,ftl,fbl,ftr,fbr這八個(gè)點(diǎn)就可以確定6個(gè)平面。
平面方程的確定我簡(jiǎn)單說(shuō)一下思路,具體細(xì)節(jié)網(wǎng)上有很多。
我們?cè)趗nity中確定一個(gè)相機(jī)的參數(shù)是遠(yuǎn)近裁剪面+FOV。
FOV是水平方向的視角,比如60度就是廣角攝像頭。其實(shí)還應(yīng)該有一個(gè)垂直方向的FOV才能確定一個(gè)錐體。如果水平方向和垂直方向的FOV角度相同,那么遠(yuǎn)近裁剪面就是一個(gè)正方形,視平面也是一個(gè)正方形。視平面是相機(jī)和近裁剪面之間的一個(gè)平面,它是用來(lái)接收投影變換的平面。這個(gè)平面的寬高比一定要和屏幕空間的寬高比一致,否則圖片會(huì)發(fā)生拉伸。unity之所以沒(méi)有讓我們?cè)O(shè)置垂直平面的FOV是因?yàn)閡nity會(huì)自動(dòng)根據(jù)屏幕的寬高比及水平FOV反推出垂直平面的FOV。簡(jiǎn)單的說(shuō)確定一個(gè)相機(jī)需要知道它的遠(yuǎn)近裁剪面,水平FOV以及屏幕的寬高比。
上面這些參數(shù)只是確定了一個(gè)視錐體的形狀,它在任何一個(gè)空間中還需要確定位置和朝向。比如我們求解的六個(gè)平面方程是在世界空間中,那么我們還需要知道相機(jī)在世界空間中的位置及朝向。
我們整理一下目前已知的變量
? ? ? 相機(jī)的位置
? ? ? 相機(jī)的朝向
? ? ? 相機(jī)的FOV
? ? ? 相機(jī)的寬高比
? ? ? 近裁剪距離
? ? ? 遠(yuǎn)裁剪面距離
我們根據(jù)這些信息可以推導(dǎo)出
? ? ? 相機(jī)的位置
? ? ? 相機(jī)的朝向(垂直與遠(yuǎn)近裁剪面中心的向量)
? ? ? 近裁剪面的距離
? ? ? 近裁剪面的高度
? ? ? 近裁剪面的寬度
? ? ? 遠(yuǎn)裁剪面的距離
? ? ? 遠(yuǎn)裁剪面的寬度
? ? ? 遠(yuǎn)裁剪面的高度
有了這些信息我們就可以推導(dǎo)出6個(gè)平面的方程了。
4. 如何判斷一個(gè)點(diǎn)是否在視錐體內(nèi)
這個(gè)很簡(jiǎn)單,只要這個(gè)點(diǎn)在6個(gè)平面中任意一個(gè)平面的外部那么這個(gè)點(diǎn)就在錐體外,反之這個(gè)點(diǎn)在所有平面的內(nèi)部那么它就在視錐體內(nèi)部。
如何判斷一個(gè)點(diǎn)在平面內(nèi)部還是外部,假定我們使用朝向錐體內(nèi)部的法線確定的平面方程。那么平面的前面就是法線的方向也就是錐體內(nèi)部。我們把點(diǎn)帶入平面方程,如果大于零,點(diǎn)在平面的前面,也就是錐體的內(nèi)部。
5. 如何判斷AABB包圍盒是否在視錐體內(nèi)部
我一開(kāi)始也會(huì)很天真的以為如果AABB的8個(gè)點(diǎn)都在視錐體外部那么這個(gè)包圍體就在視錐體外部了,事實(shí)是這樣嗎?
事實(shí)是打臉的,圖中的黃色方塊,所有點(diǎn)都在外部,但是它和視錐體卻是相交的。
那如果所有點(diǎn)都在同一個(gè)平面的外部就一定在視錐體外部了吧。這個(gè)沒(méi)錯(cuò),但是反之錯(cuò)了。
事實(shí)再一次打臉,圖中橙色的方塊,雖然所有點(diǎn)沒(méi)有在同一個(gè)面的外部,但是它卻在視錐體的外部。
我們做的是快速判斷,為了追求速度不能做更復(fù)雜的判斷了,二選一選一個(gè)吧,選哪一個(gè)呢?
當(dāng)然是選下面的方案了,上面的方案是錯(cuò)誤的因?yàn)橛行┪锛髅髟谝曞F體中卻不能顯示,這是一種錯(cuò)誤。而下面的方案雖然會(huì)額外傳遞一些無(wú)用的物件到gpu中但它至少是正確的,要先保證正確性才能考慮性能優(yōu)化。
6. 齊次空間裁剪
在投影變換后透視除法之前存在一個(gè)裁剪空間,這個(gè)空間就是齊次裁剪空間,在這個(gè)空間中的視錐體是一個(gè)以相機(jī)為原點(diǎn),邊長(zhǎng)為1的立方體。如果點(diǎn)在世界空間中的坐標(biāo)為(x,y,z),將這個(gè)點(diǎn)通過(guò)矩陣乘法變換到齊次裁剪空間中(x',y',z'),那么判斷(x',y',z')這點(diǎn)是否在視錐體內(nèi)會(huì)變得非常簡(jiǎn)單。
滿足上面條件的(x,y,z)就在視錐體內(nèi)。
這個(gè)方法實(shí)現(xiàn)簡(jiǎn)單,但是效率不高,因?yàn)閳?zhí)行一次坐標(biāo)變換需要16次乘法+12次加法。
但是如果使用平面方程只需要3次乘法+2次加法。
雖然可以使用sse指令集進(jìn)行優(yōu)化,但是平面方程計(jì)算也可以使用sse指令優(yōu)化比如方程為:
Ax + By + Cz + D = 0可以看成是向量(A,B,C,D)和向量(x,y,z,1)的點(diǎn)積,如果用sse4指令集一條指令就可以計(jì)算出結(jié)果。
因此把點(diǎn)轉(zhuǎn)換到齊次空間中進(jìn)行判斷實(shí)現(xiàn)簡(jiǎn)單,但是并不高效。
為什么這里要提到齊次裁剪空間呢,因?yàn)槲覀冊(cè)趯憇hader的時(shí)候會(huì)用到這個(gè)變換矩陣,如果代碼中可以拿到這個(gè)矩陣,我們就可以通過(guò)這個(gè)矩陣快速的反推出視錐體6個(gè)裁剪面的方程,具體實(shí)現(xiàn)就不介紹了,這里只是說(shuō)可以優(yōu)化求解平面方程的速度。
7. 每次都需要判斷8個(gè)點(diǎn)么?
有更快的算法,首先我們要找出長(zhǎng)方體的n點(diǎn)和p點(diǎn),p點(diǎn)就是距離平面最近的頂點(diǎn),n點(diǎn)就是最遠(yuǎn)對(duì)角線的頂點(diǎn)(距離p最遠(yuǎn)的頂點(diǎn))
如果p在平面外側(cè)那么可以判斷這個(gè)長(zhǎng)方體在平面外側(cè)。
如果p點(diǎn)在平面內(nèi)側(cè),n點(diǎn)在平面外側(cè),說(shuō)明它們相交。
如果p點(diǎn)和n點(diǎn)都在內(nèi)側(cè),則說(shuō)明長(zhǎng)方體在平面內(nèi)側(cè)。
之前我們需要判斷8個(gè)點(diǎn)現(xiàn)在只需要判斷2個(gè)點(diǎn),多么好的優(yōu)化。
如何求p點(diǎn)和n點(diǎn)如果是AABB包圍盒的話,求法很簡(jiǎn)單
p = (xmin,ymin,zmin) if (normal.x >= 0) p.x = xmax; if (normal.y >=0)) p.y = ymax; if (normal.z >= 0) p.z = zmax:
n = (xmax,ymax,zmax) if (normal.x >= 0) n.x = xmin; if (normal.y >=0)) n.y = ymin; if (normal.z >= 0) n.z = zmin:
這里的normal是平面的法線向量。
8. 還能再快么
這個(gè)算法在Game Programming Gems 5 中提到名字叫做Radar Approach - Testing Points 。它使用的算法和之前的算法完全不一樣,大體思路是這樣的。
首先我們?yōu)橄鄼C(jī)構(gòu)建一個(gè)坐標(biāo)系,這個(gè)坐標(biāo)系的原點(diǎn)就是相機(jī)的位置z軸就是相機(jī)的朝向。假定這個(gè)坐標(biāo)系的基向量為x,y,z。
圖中紅色的點(diǎn)p是被測(cè)試的點(diǎn),藍(lán)色的點(diǎn)是p在z軸的投影。
v = p - cc
p.z = v ? z
v向量是p點(diǎn)的向量表示,z是單位基向量,所以p點(diǎn)的z坐標(biāo)的值就是v向量和z向量的點(diǎn)積。
如果近裁剪面 < p.z < 遠(yuǎn)裁剪面,那么這個(gè)點(diǎn)在z軸上就在視錐體中了。
同理我們可以求出p.x和p.y,然后拿這兩個(gè)值和一個(gè)平面的長(zhǎng)和寬做對(duì)比,這個(gè)平面就是通過(guò)p點(diǎn)且和視線垂直的平面,假想成和遠(yuǎn)近裁剪面平行的平面。
a為垂直方向的fov,那么h = p.z * 2 * tan(a/2)
-h/2 < pc.y < h/2
(這里的圖是h,如果是unity3d的話可以變成w = p.z * 2 * tan(a/2)那么-w/2
根據(jù)寬高比我們可以求出w = h * ratio;則-w/2 < p.x < w/2
這個(gè)方法和上面np點(diǎn)的算法到底誰(shuí)快,我沒(méi)有測(cè)試過(guò)。等到后面實(shí)現(xiàn)的時(shí)候可以做一下性能測(cè)試,但是測(cè)試的前提是我的demo能加載一個(gè)復(fù)雜的場(chǎng)景。。。
9. 還能再快么
對(duì)于基礎(chǔ)測(cè)試目前我掌握的信息就這些了,如果有大牛還請(qǐng)賜教更快的算法。如果把這些放到gpu計(jì)算是個(gè)不錯(cuò)的想法。
10. 平移旋轉(zhuǎn)一致性測(cè)試
這是邏輯上的優(yōu)化,不是算法層面上的優(yōu)化,我們假定相機(jī)移動(dòng)的很慢,如果一個(gè)AABB被一個(gè)平面拒絕,那么下一幀這個(gè)平面被拒絕的可能性就會(huì)很大,所以我們下次進(jìn)行測(cè)試的時(shí)候可以先從這個(gè)平面進(jìn)行。
11. 八分測(cè)試
這個(gè)算法就是把視錐體切成八部分,然后巴拉巴拉,我總覺(jué)得這個(gè)算法有把簡(jiǎn)單問(wèn)題復(fù)雜化的意思而且它還有限制所以就沒(méi)有仔細(xì)研究,限制如下圖:
使用八分測(cè)試來(lái)檢測(cè)包圍盒,需要包圍盒滿足它的中心到它的頂點(diǎn)距離必須小于視錐體中心到視錐體平面的最小距離。也就是圖中的d2要小于d1,我總覺(jué)得這個(gè)算法有把簡(jiǎn)單問(wèn)題復(fù)雜化的意思。所以就沒(méi)有仔細(xì)研究。
來(lái)源:電子創(chuàng)新網(wǎng)
- 新一代藍(lán)牙最新標(biāo)準(zhǔn)LE Audio音頻技術(shù)
- 二級(jí)建造師機(jī)電工程管理與實(shí)務(wù)考點(diǎn)手冊(cè) 0次下載
- 基于Unity3D游戲引擎的神經(jīng)反饋治療系統(tǒng) 5次下載
- 基于LabVIEW的貪吃蛇游戲源代碼 74次下載
- 病房呼叫管理系統(tǒng)電路圖下載 7次下載
- 游戲場(chǎng)景管理(一)
- 基于運(yùn)動(dòng)平滑約束項(xiàng)的快速誤匹配剔除算法 1次下載
- 《Visual C++游戲編程基礎(chǔ)》電子書(shū).pdf 0次下載
- 基于斜交視錐立體攝像機(jī)模型的虛擬現(xiàn)實(shí)立體視覺(jué)解決方案 1次下載
- 傳感器和安全:從汽車到游戲場(chǎng),新的解決方案保護(hù)參與者 1次下載
- 從零開(kāi)始Android游戲編程(第二版) 0次下載
- 基于凸包的視錐體裁剪精度優(yōu)化 0次下載
- 圖像處理在煙葉雜物剔除系統(tǒng)上的應(yīng)用研究
- 一種基于GPU的遮擋剔除算法改進(jìn)研究
- 三維游戲場(chǎng)景中動(dòng)態(tài)物體的遮擋剔除算法
- 工業(yè)PDA的場(chǎng)景應(yīng)用,以及如何選擇適合的PDA手持終端? 230次閱讀
- 肖特基二極管與普通二極管的區(qū)別 5971次閱讀
- 簡(jiǎn)述Zener(齊納二極管)的使用場(chǎng)景 3082次閱讀
- 簡(jiǎn)述各類二極管的使用場(chǎng)景和要點(diǎn) 2580次閱讀
- 解密游戲推薦系統(tǒng)的建設(shè)之路 448次閱讀
- C語(yǔ)言零基礎(chǔ)項(xiàng)目:生命游戲!詳細(xì)思路+源碼分享 1059次閱讀
- 二極管的應(yīng)用場(chǎng)景 如何選擇合適的二極管 4981次閱讀
- Android游戲開(kāi)發(fā)工具以及游戲調(diào)試、打包和分發(fā)技巧 2820次閱讀
- 機(jī)器感知真正的彩色世界 941次閱讀
- 圖像識(shí)別技術(shù)在模擬器的游戲場(chǎng)景當(dāng)中體現(xiàn)的尤為明顯 4178次閱讀
- 1500r和1800r曲率對(duì)比分析 淺談曲率的變化 19.3w次閱讀
- 基于區(qū)塊鏈的游戲基礎(chǔ)技術(shù)平臺(tái)GES游戲引擎公鏈 3470次閱讀
- 繼OpenAI發(fā)布Dota2的團(tuán)戰(zhàn)AI后,DeepMind今天也發(fā)布了自家的最新研究 3517次閱讀
- Vim 的使用技巧—Vim 命令行游戲 2459次閱讀
- 三維渲染中的裁剪總匯 2444次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費(fèi)下載
- 0.00 MB | 1491次下載 | 免費(fèi)
- 2單片機(jī)典型實(shí)例介紹
- 18.19 MB | 95次下載 | 1 積分
- 3S7-200PLC編程實(shí)例詳細(xì)資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識(shí)別和講解說(shuō)明
- 4.28 MB | 18次下載 | 4 積分
- 5開(kāi)關(guān)電源原理及各功能電路詳解
- 0.38 MB | 11次下載 | 免費(fèi)
- 6100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 7基于單片機(jī)和 SG3525的程控開(kāi)關(guān)電源設(shè)計(jì)
- 0.23 MB | 4次下載 | 免費(fèi)
- 8基于AT89C2051/4051單片機(jī)編程器的實(shí)驗(yàn)
- 0.11 MB | 4次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費(fèi)
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費(fèi)
- 4LabView 8.0 專業(yè)版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費(fèi)
- 5555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33562次下載 | 免費(fèi)
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費(fèi)
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費(fèi)
- 8開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21539次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537793次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191183次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183277次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138039次下載 | 免費(fèi)
評(píng)論
查看更多