10.08.2013 Views

Terrain Processing on Modern GPU - Computer Graphics Group ...

Terrain Processing on Modern GPU - Computer Graphics Group ...

Terrain Processing on Modern GPU - Computer Graphics Group ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

některých vrcholů vícekrát. Zavedení index bufferu a použití řetězce trojúhelníků namísto<br />

prostého seznamu je pouze jedna, samozřejmá část optimalizace. Druhá spočívá v lepším využití<br />

vertex cache, tj. vyrovnávací paměti pro transformované vrcholy. Do té jsou ukládány všechny<br />

vrcholy, které prošly vertex shaderem, a podle FIFO pravidla jsou z ní vyjímány ve chvíli, když<br />

přijde nový transformovaný vrchol. Vrcholy jsou zpracovávány přesně v tom pořadí, v jakém jsou<br />

indexovány, takže můžeme předem přesně říci, kolikrát se projeví „cache-miss“ na základě jejich<br />

pořadí. Předpokládejme, že známe velikost vertex cache. V takovém případě jsme schopni<br />

přeskládat indexy vrcholů tak, že se trojúhelníky zpracovávají po řádkách a ve chvíli, kdy<br />

zaplníme vyrovnávací paměť, můžeme přejít na další řádek, kde použijeme polovinu již dříve<br />

transformovaných vrcholů, neboť jsou společné vždy několika trojúhelníkům a jsou dosud<br />

drženy ve vyrovnávací paměti.<br />

Když se na tento problém podíváme z teoretického hlediska, tak oproti naivní implementaci<br />

transformace 3 vrcholů pro každý trojúhelník, můžeme s využitím vyrovnávací paměti<br />

transformovat pouze tolik vrcholů, kolik jich je v naší pravidelné struktuře. Vezmeme-li v úvahy<br />

velmi velkou mřížku, kde se příliš neprojeví okrajové vrcholy, jež náleží méně než 6<br />

trojúhelníkům, tak můžeme teoreticky transformovat až šestkrát méně vrcholů. Pokud bychom<br />

tedy pominuli práci pixel shaderu a dokázali transformovat každý vrchol pouze jednou, můžeme<br />

provést zobrazování až šestkrát rychleji. Realita je samozřejmě odlišná – pixel shader provádí<br />

nějakou netriviální operaci (v případě unifikovaných shaderů navíc bere výk<strong>on</strong> z celkového<br />

rozpočtu) a vertex cache není nek<strong>on</strong>ečná, takže se do ní nevejdou všechny vrcholy a i<br />

inteligentním indexováním je začneme ztrácet. Přesto postupem, který jsme popsali výše,<br />

můžeme reálně dosáhnout až dvojnásobné rychlosti zobrazování. Důležité však je znát velikost<br />

cache a napsat algoritmus indexování vrcholů správně i s ohledem na jejich pořadí<br />

v trojúhelníku. Dozvědět se velikost cache je někdy snadné, neboť výrobci grafických karet tato<br />

čísla občas zveřejňují, v jiných případech jsou tato čísla neznámá a je třeba je zjistit<br />

experimentálně. Stačí výše zmíněný postup opakovat několikrát za sebou a předpokládat v něm<br />

vždy jinou velikost vyrovnávací paměti. Nejlepší výsledek nám pak ukáže pravděpodobnou<br />

hodnotu. Postup jsme úspěšně aplikovali a dosáhli experimentálního nalezení hodnoty, která<br />

souhlasí s výrobcem proklamovanou hodnotou. K<strong>on</strong>ečně s využitím znalosti této hodnoty se nám<br />

podařilo v jednodušších případech získat dvojnásobek až trojnásobek původní rychlosti<br />

zobrazování. Nutno však dodat, že v celém systému se to projeví daleko méně, a že provedení<br />

správné indexace složitějších struktur, než je pravidelná mřížka, může být velmi obtížné. Více se<br />

touto problematikou zabývá například (95), (96) nebo (97). Hloubkový rozbor algoritmů<br />

pracujících nad obecnou sítí najdeme v (98).<br />

Časem se ukázalo zbytečné číst z vertex bufferu kompletní data o vrcholech trojúhelníků, které se<br />

stejně nenakreslí, neboť jsou nahrazeny menšími trojúhelníky při adaptivním dělení. Navíc i pro<br />

trojúhelníkové dělící schéma se jevilo nepraktické zpracovávat samostatně jeden trojúhelník,<br />

když dva trojúhelníky tvořící jeden čtverec sítě potřebují téměř stejná data pro své dělení.<br />

Nahradili jsme tedy triangulovanou mřížku mřížkou obsahující pouze zástupné vrcholy – pro<br />

každé pole mřížky jeden. Geometry shader, který implementoval dané schéma, dostal pouze<br />

jediný bod a vygeneroval na jeho základě geometrii pro dva trojúhelníky základní mřížky.<br />

K<strong>on</strong>ečně poslední úprava opět využila nové vlastnosti Shader Modelu 4.0, který umožňuje využít<br />

64

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!