Page 6

2011.09.10. 14:58

Kis kitérő, bár a témánál maradok. A BVH fát a GPU-n is lehet generálni. Ennek az egyik módja a Morton-görbe, avagy Morton-code. A wikin átfutva elég rémísztőnek tűnik az egész, pedig ismét egy pofonegyszerű dologról van szó.

A BVH-tree felépítése úgy optimális, ha egy ág az egymáshoz közel eső primitíveket foglalja egybe. Nem is a távolságot szokás számolni, hanem a közös befoglaló doboz felületetét.

Egyenként lehet párba rendezni a primitíveket ezen értékek szerint, de ez sok ídő, ami realtime alkalmazásoknál és/vagy nagy polygon-szám esetén nem járható út. Megtehetjük azt, hogy a befoglaló leghosszabb éle irányát vesszük bázisiránynak, és a primitívek ezen koordinátái alapján rendezzünk. Aki már próbálta ezt a módszert, az tudja, hogy a keletkező fa messze nem lesz optimális. Az lenne az igazi, ha mindhárom tengely szerint tudnánk EGYSZERRE rendezni.

Nos, a Morton-görbével eszerint lehet rendezni. Egyszerre mindhárom térirány szerint.

Hogyan lehetséges ez? Egy végtelenül egyszerű módszerrel. A három koordinátából egyet készít. És nem bonyolítja túl a dolgot, simán összefésüli a három binárisan ábrázolt számot az  alábbiak szerint.

x(koordináta)  xbit3 xbit2 xbit1 xbit0 

y(koordináta) ybit3 ybit2 ybit1 ybit0

z(koordináta) zbit3 zbit2 zbit1 zbit0

Morton code          zbit3 ybit3 xbit3, zbit2 ybit2 xbit2, zbit1 ybit1 xbit1, zbit0 ybit0 xbit0

Itt most minden tér-koordináta egy négy bites szám. Úgy kell egybeolvasztani ezeket, hogy a keletkező szám akkor is közeli értéket adjon, ha a két eredeti koordináta x-ben volt közel, és akkor is ha y-ban, vagy z-ben. Ez úgy oldható meg, ha az alacsony bitek mind alacsonyan is maradnak, egymás után sorakoznak a Morton.code alján. A magasabb bitek 3 bitenként, csoportokban követik egymást.

Mint kitűnik, itt nem is igazán egy görbéről van szó, hanem egy speciális számábrázolásról, ahol összekeverjük a térkoordináták bitjeit. Mivel az egész ábrázoláshoz legtöbbször 32-bitet használnak, ezért egy koordinátára legfejebb 10 bit használható. Ez korlátozott felbontást jelen, a scene terének minden koordináta-tengelyét fel kell osztani 1024 részre. Ekkora az elérhető felbontás egy 32 bites Morton kóddal.

Ha eszerint a kód szerint rendezzük a primitíveket, akkor az egymáshoz közeliek egymás közelében maradnak rendezés után, így a fa közel optimásil lesz. Nem lesz olyan jó, mint a leglassabb módszerrel generált fa, de realtime fa generáláshoz sokkal hatékonyabb módszert ad a kezünkbe.

 

 

 

 

 

 

 

süti beállítások módosítása