Zobrazování terénů pomocí GPU

Podobné dokumenty
Zobrazování terénu. Abstrakt. 1. Úvod. 2. Vykreslování terénu

Fakulta informačních technologíı. IZG cvičení 6. - Zobrazování 3D scény a základy OpenGL 1 / 38

Co je grafický akcelerátor

Programování shaderů GLSL

Hierarchický model Josef Pelikán CGG MFF UK Praha. 1 / 16

GIS Geografické informační systémy

Android OpenGL. Práce s texturami

GIS Geografické informační systémy

Základy 3D modelování a animace v CGI systémech Cinema 4D C4D

Textury v real-time grafice Josef Pelikán, MFF UK Praha Josef.Pelikan@mff.cuni.cz

Úvod do GIS. Prostorová data II. část. Pouze podkladová prezentace k přednáškám, nejedná se o studijní materiál pro samostatné studium.

StatSoft Jak vyzrát na datum

13 Barvy a úpravy rastrového

8. přednáška z předmětu GIS1 Rastrový datový model a mapová algebra

Návod k použití softwaru Solar Viewer 3D

Programátorská dokumentace

Vektorové grafické formáty

Grafika na počítači. Bc. Veronika Tomsová

Zobrazování těles. problematika geometrického modelování. základní typy modelů. datové reprezentace modelů základní metody geometrického modelování

11 Zobrazování objektů 3D grafiky

GEOGRAFICKÉ INFORMAČNÍ SYSTÉMY 6

Úvod. Programovací paradigmata

Reprezentace 3D modelu

Algoritmy výpočetní geometrie

Geekovo Minimum. Počítačové Grafiky. Nadpis 1 Nadpis 2 Nadpis 3. Božetěchova 2, Brno

Rastrová reprezentace

Diplomová práce Prostředí pro programování pohybu manipulátorů

Pohled do nitra mikroprocesoru Josef Horálek

1. Úvod do obsluhy AutoCADu

Počítačová grafika 2 (POGR2)

Rastrová reprezentace geoprvků model polí Porovnání rastrové a vektorové reprezentace geoprvků Digitální model terénu GIS 1 153GS01 / 153GIS1

2. úkol MI-PAA. Jan Jůna (junajan)

Rasterizace je proces při kterém se vektorově definovaná grafika konvertuje na. x 2 x 1

1 Obsah přípravné fáze projektu Poohří

Autodesk AutoCAD 2020

9 Prostorová grafika a modelování těles

09. Memory management. ZOS 2006, L.Pešička

Implementace systémů HIPS: historie a současnost. Martin Dráb

Počítačová grafika 1 (POGR 1)

Geometrické algoritmy pro počítačovou grafiku

Jana Dannhoferová Ústav informatiky, PEF MZLU

Jana Dannhoferová Ústav informatiky, PEF MZLU

2. přednáška z předmětu GIS1 Data a datové modely

Ing. Jan Buriánek. Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Jan Buriánek, 2010

Algoritmizace prostorových úloh

Reprezentace bodu, zobrazení

Zobrazovací jednotky a monitory

Počítačová grafika. Studijní text. Karel Novotný

Novinky v Solid Edge ST7

Vyhodnocení 2D rychlostního pole metodou PIV programem Matlab (zpracoval Jan Kolínský, dle programu ing. Jana Novotného)

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit

Nvidia CUDA Paralelní programování na GPU

Souřadnicové prostory

KTE/TEVS - Rychlá Fourierova transformace. Pavel Karban. Katedra teoretické elektrotechniky Fakulta elektrotechnická Západočeská univerzita v Plzni

Terestrické 3D skenování

SOU Valašské Klobouky. VY_32_INOVACE_3_01 IKT Pc grafika základní pojmy Mgr. Radomír Soural. Zkvalitnění výuky prostřednictvím ICT

Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Surfels: Surface Elements as Rendering Primitives

Android OpenGL. Pokročilé shadery

Vzdálený přístup k počítačům

12 Metody snižování barevného prostoru

Práce s velkými sestavami

Systém adresace paměti

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

1. Vektorové algoritmy jejich výstupem je soubor geometrických prvků, např.

7. Geografické informační systémy.

Úvod do počítačové grafiky

Pro tvorbu samostatně spustitelných aplikací je k dispozici Matlab library.

AGP - Accelerated Graphics Port

Metamorfóza obrázků Josef Pelikán CGG MFF UK Praha

Controlweb. Úvod. Specifikace systému

5 Algoritmy vyplňování 2D oblastí

Sítě SFN Systém pro analýzu a vizualizaci pokrytí a rušení vysílacích sítí

Laserové skenování (1)

PROGRAMY PRO GIS. Formovat/formulovat problém pro aplikaci v počítači. Fungování GIS programů na základní úrovni - "uvažovat" jako počítač

VY_32_INOVACE_INF.10. Grafika v IT

Připravil: David Procházka. Vertex Buffer Objects

Programování v jazyku LOGO - úvod

Rekurzivní sledování paprsku

Využití ICT techniky především v uměleckém vzdělávání. Akademie - VOŠ, Gymn. a SOŠUP Světlá nad Sázavou

TÉMATICKÝ OKRUH Softwarové inženýrství

Deformace rastrových obrázků

Dynamické datové struktury III.

Počítačová grafika RHINOCEROS

Maturitní témata pro 1.KŠPA Kladno, s.r.o. Výpočetní technika

Vytváříme dobré aplikace vykreslovače grafiky v programovém prostředí Control Web

G R A F I C K É K A R T Y

Satori. Uživatelský manuál

Autodesk AutoCAD Civil 3D

OPS Paralelní systémy, seznam pojmů, klasifikace

ak. rok 2013/2014 Michal Španěl,

IVT. Rastrová grafika. 8. ročník

Geometrické transformace

Počítačová grafika SZŠ A VOŠZ MERHAUTOVA 15, BRNO

Obecný princip 3D numerického modelování výrubu

Windows a real-time. Windows Embedded

ČÁST 1. Základy 32bitového programování ve Windows

Transkript:

MASARYKOVA UNIVERZITA FAKULTA INFORMATIKY #ris m p Zobrazování terénů pomocí GPU DIPLOMOVÁ PRÁCE Marek Mauder Brno, jaro 2008

Prohlášení Prohlašuji, že tato diplomová práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. Vedoucí práce: doc. Ing. Jiří Sochor, CSc. 11

Shrnutí Pro vizualizaci terénů v reálném čase vznikla celá řada algoritmů, ty novější pak využívají i schopností moderních grafických karet. Cílem této práce je návrh metody pro zobrazování velice rozsáhlých terénů vycházející ze stávající metody Geomipmapping. Součástí práce je implementace návrhu pomocí OpenGL a jazyka GLSL. Uvedeny jsou také výsledky a rozbor testování na různých konfiguracích PC. m

Klíčová slova zobrazování terénu, OpenGL, GLSL, GPU, geomipmapping, úroveň detailu

Obsah 1 Úvod 2 2 OpenGL a GLSL 3 2.1 Rozhraní OpenGL 3 2.2 Verze a rozšíření OpenGL 4 2.3 Jazyk GLSL 5 3 Zobrazování terénu 8 3.1 Reprezentace terénu 8 3.2 Zobrazování 10 3.3 Úroveň detailů 11 3.4 Přehled a vývoj zobrazovacích metod 12 3.5 Geomipmapping 16 3.6 Možnosti využití GPU 18 4 Víceúrovňový geomipmapping 22 4.1 Motivace 22 4.2 Princip modifikace 22 4.3 Načítání a budování terénu 24 4.4 Podrobnosti o některých aspektech metody 26 5 Zpracování metody 28 5.1 Základní architektura 28 5.2 Zobrazování terénu 29 5.2.1 Zobrazování uzlů a geometrie 30 5.2.2 Výběr aktivních uzlů a úrovně detailu 31 5.2.3 Vizualizace povrchu 33 5.3 Data terénu 37 5.3.1 Budování dat 38 5.3.2 Správa dat terénu 40 5.3.3 Formáty výškových map 42 5.3.4 Formáty textur 43 5.3.5 Komprese dat terénu 46 5.4 Možná vylepšení a rozšíření 46 5.4.1 Vertex texture fetch 47 5.4.2 Data terénu 47 5.4.3 Texturování a další 49 6 Implementační programy 51 1

6.1 Spouštěcí program 51 6.2 Hlavní program 52 6.3 Prohlížení terénu 52 6.4 Budování terénu 53 6.5 Testovacímód 53 7 Testování 55 7.1 Testovací scénáře 55 7.2 Měřené veličiny 56 7.3 Konfigurace PC 56 7.4 Výsledky a rozbor 57 8 Závěr 60 Literatura 61 Dodatky 63 A Obrazová příloha 63 B Záložky spouštěcího programu 65 C Obsah přiloženého disku 67 2

Kapitola 1 Úvod S vizualizací rozsáhlých terénů se můžeme setkat v široké škále aplikací počítačové grafiky Jde například o geografické informační systémy (GIS), virtuální realitu, vojenské simulátory a počítačové hry Vykreslování rozsáhlých terénů v reálném čase je i pro dnešní počítače náročný úkol - množství zobrazovaných trojúhelníků je obrovské. Jsou proto vyvíjeny algoritmy a postupy, které detail snižují na místech, kde to pro pozorovatele nebude příliš patrné. S rozvojem výkonných grafických karet s možností programování (GPU) jsou nové metody zaměřeny i na využití jejich potenciálu. Dalším problémem při zobrazování velice rozsáhlých terénů je objem jejich zdrojových dat, který může snadno překročit kapacitu instalované operační paměti. Je tedy nutné delší dobu nepoužitá data průběžně uvolňovat z paměti a místo nich načítat nová. Hlavním cílem této práce je pomocí grafického rozhraní OpenGL a jazyka GLSL implementovat zobrazovací metodu Geomipmapping rozšířenou o možnost zpracování velice rozsáhlých terénů. Práce se skládá z osmi kapitol a několika dodatků. Po tomto úvodu následuje kapitola druhá, ve které se seznámíme s grafickým rozhraním OpenGL a jazykem GLSL pro programování GPU. Třetí kapitola pojednává o zobrazování terénu na počítači, o reprezentaci jeho dat a úrovni detailu vykreslování. Představuje některé používané metody zobrazování terénu a podrobněji zmiňuje Geomipmapping jakožto základ této práce. Nakonec v této kapitole zmíníme několik možností využití moderních GPU. Kapitola čtvrtá popisuje principy víceúrovňového Geomipmappingu jako hlavního tématu práce, pátá se pak věnuje detailnímu rozboru jeho implementace. Obsahuje popis základních struktur, postupu vykreslování, správy a formátů dat, popisu GLSL programů a dalších aspektů implementace. V kapitole šesté popíšeme samotné implementační programy a jejich ovládání. Sedmá kapitola uvádí výsledky testování implementace na různých konfiguracích počítačů a jejich rozbor. Poslední osmá kapitola je závěrečným shrnutím práce. 3

Kapitola 2 OpenGL a GLSL OpenGL je programové rozhraní (API) určené pro tvorbu aplikací zobrazujících 2D i 3D grafiku. V této kapitole uvedeme základní informace o OpenGL, jeho historii, současném stavu a budoucnosti. Dále následuje stručný přehled jazyka GLSL. 2.1 Rozhraní OpenGL OpenGL bylo vytvořeno společností Silicon Graphics Inc. (SGI) v roce 1992 na základě její předchozí proprietární knihovny IrixGL. V základu se jedná pouze o specifikaci grafických funkcí a jejich přesného chování. Výrobci hardwaru poskytují implementace těchto specifikovaných funkcí využívající jejich zařízení. Dostupné jsou i softwarové implementace (např. knihovna Mesa 3D 1 ). OpenGL se postupně stalo standardem v oblasti počítačové grafiky a našlo široké uplatnění v oblastech CAD, virtuální reality, vizualizace vědeckých dat a tvorby počítačových her. O vývoj standardu a specifikaci OpenGL se od založení do roku 2006 starala rada The OpenGL Architecture Review Board (ARB) mezi jejíž členy patřily společnosti SGI, Intel, Microsoft, IBM, ATI, NVidia a další. V současnosti je specifikace pod kontrolou Khronos Group 2 a jejího podvýboru OpenGL ARB Working Group. Rozhraní se nyní skládá z více než 250 různých funkcí a dalších rozšíření, která jsou často specifická jen pro určitého výrobce hardware. Vlastní OpenGL specifikace je nezávislá na operačním systému a procesorové architektuře, a proto neobsahuje žádné funkce pro úkoly jako tvorba oken a uživatelský vstup. OpenGL je také přístupné z mnoha různých programovacích jazyků. Dostupnost implementace na určité platformě je plně v rukou jejího dodavatele. OpenGL obsahuje funkce výhradně pro vykreslování, ale pro správnou funkci je třeba zajistit, aby tento grafický výstup byl směřován do okna naší aplikace. Pro toto napojení OpenGL na operační systém existují doprovodné knihovny jako WGL pro Windows, XGL pro XI1 a AGL pro Mac OS. Existuje mnoho dalších podpůrných knihoven pro tvorbu OpenGL aplikací jako např. GLU, GLUT, GLUI a GLFW. API je navrženo s důrazem na dva požadavky uživatelů: Ovládání odlišných grafických karet pomocí jednotného rozhraní. 1. http://www.mesa3d.org/ 2. http://www.khronos.org/ 4

2. OPENGL A GLSL Zakrytí odlišnosti hardwarových platforem - po každé implementaci je vyžadováno, aby obsahovala všechny funkce OpenGL jádra (i když by některé musely být prováděny softwarově bez HW akcelerace). ^ Display List ^J ' \ 1 Evaluator P er-verte K Operations Primitive Assembly Operations t Texture Memory t T. Rasterization Per Fragment Operations Frame buffer n Obrázek 2.1: Blokové schéma OpenGL (převzato ze specifikace OpenGL) OpenGL je někdy označováno jako stavový stroj (state machine). Pomocí volání různých funkcí měníme nastavení komponent OpenGL a tím i jeho stav. Vstupní data prochází tzv. pipeline a jednotlivými komponentami jsou zpracovávány, dokud nedostaneme výsledek na obrazovce, jehož vzhled je závislý právě na aktuálním stavu OpenGL. Současnou verzi specifikace OpenGL spolu s mnoha dalšími informacemi najdeme na oficiální webové stránce http: / /www. opengl. org. 2.2 Verze a rozšíření OpenGL OpenGL poskytuje již od své první verze vše podstatné k vizualizaci trojrozměrného světa i pro práci s 2D rastrovou grafikou: kreslení 3D primitiv pokrytých materiály, práci s osvětlením, mlhou, 2D rastrové operace, míchání barev, transformace atd. Postupně se začaly objevovat nové schopnosti hardwaru umožňující rychleji zpracovávat některé z již podporovaných operací, ale i úplně nové techniky. Jejich použití v OpenGL umožňují tzv. rozšíření (OpenGL extensions). Jako v případě samotného OpenGL se jedná o specifikace funkcí a konstant, nyní však popisující pouze jistou novou funkcionalitu. Konkrétní OpenGL implementace pak některá z rozšíření může implementovat. S novým rozšířením nejčastěji přichází výrobce hardwaru a tedy poskytovatel implementace. Pojmenování rozšíření potom obsahuje jeho identifikátor (např. SGIS_multitexture nebo ATI_texture_f loat). Taková rozšíření nejčastěji podporuje pouze HW tohoto výrobce, ale existují i výjimky. Úspěšná rozšíření mohou být povýšena na EXT (např. EXT_multitexture nebo EXT_texture_f ilter_anisotropic), která již po dohodě podporuje více výrobců. Rada Architecture Review Board také může některé 5

2. OPENGL A GLSL rozšíření povýšit na standardní, které potom získá prefix ARB (např. ARB_multitexture nebo ARB_texture_f loat). ARB rozšíření často bývají přímo včleněna do jádra nové verze OpenGL specifikace. Podstatná část nové funkcionality verzí OpenGL byla nejdříve dostupná jako rozšíření. Původní OpenGL verze 1 z roku 1992 bylo rozšířeno celkem pětkrát: Verze 1.1 (1997) přinesla texturové objekty, interní formáty textur, logické operace na barvách a další funkce. Verze 1.2 & 1.2.1 (1999) přidává multitexturování, trojrozměrné textury, pole vrcholů a koncept ARB rozšíření. Verze 1.3 (2001) přináší mnoho rozšíření týkajících se texturování: komprese, krychlové textury, nové kombinační módy a další. Také se objevuje celoobrazovkový antialiasing pomocí multivzorkování. Verze 1.4 (2002) rozšiřuje OpenGL o automatické generování mipmap, textury hloubky a stínů a další. Verze 1.5 (2003) přidává možnost uchovávání geometrie ve video paměti a okluzní dotazy. V roce 2004 bylo představeno OpenGL verze 2.0, kde je hlavní novinkou začlenění jazyka GLSL pro programování GPU přímo do jádra OpenGL. Již dříve bylo možné pomocí OpenGL programovat GPU, ale jen pomocí nízkoúrovňového jazyka typu assembler, což bylo poměrně nepohodlné. O GLSL podrobněji pojednává následující oddíl kapitoly. Aktuální verze 2.1 vyšla roku 2006, její kompletní specifikaci najdeme v [1]. Radikální změnu celého rozhraní má přinést OpenGL 3.0 původně plánované na září 2007. API má být kompletně přepracováno, nicméně pro podporu starších aplikací bude dostupné i stávající API (ovšem jen jako rozhraní k novému jádru). Nové API bude založeno na práci s objekty a OpenGL se změní ze stavového modelu na objektový. Bude odstraněna méně používaná funkcionalita (např. typ GL_DOUBLE nebo zadávání primitiv pomocí funkcí glbeginaglend)a části pipeline, které je možné nahradit GPU programem (mlha, osvětlení atd.). Celkově má být API pročištěno. Bohužel OpenGL 3.0 je již zpožděno téměř o rok a i po jeho vydání bude ještě trvat než výrobci GPU dokončí jeho implementace. 2.3 Jazyk GLSL GLSL (OpenGL Shading Language, také glslang) je jazyk vysoké úrovně, jehož syntax vychází z programovacího jazyka C. Je určen pro programování moderních GPU a je součástí jádra OpenGL specifikace od verze 2.0 (dříve jako ARB rozšíření). Aktuální verze GLSL je 1.2, plnou specifikaci najdeme v [2]. Kompilátor GLSL je součástí OpenGL implementace a dodává jej tedy výrobce HW - výsledný binární kód může optimalizovat právě pro svoje zařízení. 6

2. OPENGL A GLSL GLSL program se skládá ze dvou částí: jsou to vertex shader (zpracovávající vrcholy) a fragment shader (aplikován na fragmenty 3 ). Tyto shadery jsou nezávisle na sobě zkompilovány a poté linkovány dohromady, čímž vznikne kompletní a použitelný GLSL program (viz obrázek 2.2). GLSL program S i linkování zkompilovaný vertex shader zkompilovaný fragment shader kompilace zdroj, kód vertex shaderu kompilace zdroj, kód fragment shaderu Obrázek 2.2: Schéma tvorby GLSL programu Stejně jako v C je vstupním bodem shaderu funkce main. GLSL používá některé standardní C typy jako int a float a přidává vektory, matice, a vzorkovače textur (typ sampler). Dostupné jsou také běžné příkazy pro kontrolu běhu programu a smyčky (if-the-else, for, while atd.). GLSL má několik desítek vestavěných funkcí (built-in) v několika skupinách (trigonometrie, operace s vektory a maticemi, přístup k texturám atd.). Uživatel může deklarovat funkce vlastní. Součástí GLSL kompilátorů je preprocesor, i když s omezenými možnostmi oproti C. Pomocí vestavěných proměnných můžeme přistupovat k nejrůznějších nastavením aktuálního OpenGL stavu jako je nastavení světel, transformační matice, materiály, mlha atd. Důležitou součástí GLSL jsou proměnné s modifikátory attribute, uniform a varying. Atributy jsou dovoleny pouze ve vertex shaderu a představují proměnné, jejichž hodnoty jsou specifické pro jednotlivé vrcholy. Běžné atributy přístupné přes vestavěné proměnné jsou např. souřadnice v prostoru, texturovací koordináty, barva nebo normála. Uniformní proměnná představuje nějaký obecný parametr shaderu a je přístupná z obou typů shaderu. Její hodnota je obvykle společná pro větší množství vrcholů a fragmentů. Proměnné typu varying slouží k předávání vypočítaných hodnot z vertex do fragment shaderu. Hodnoty vypočítané ve vertex programu pro jednotlivé vrcholy jsou lineárně interpolovaný po povrchu trojúhelníků tvořených těmito vrcholy. Ve fragment programu jako vstup dostaneme interpolovanou hodnotu v závislosti na pozici fragmentu v promítnutém 3. pixely obrazovky spolu s dalšími příslušnými informacemi jako např. hloubka 7

2. OPENGL A GLSL trojúhelníku. Typickým použitím tohoto typu proměnných je předávání barev nebo texturovacích koordinátu. V následujícím ukázkovém vertex shaderu vidíme deklarace všech tří zmíněných typů proměnných. V těle funkce main nejprve uložíme do vektoru souřadnice vrcholu z vestavěné proměnné (ty se vyznačují prefixem gl_). Následně jako souřadnici Z nastavíme atribut vrcholu a do proměnné ViewDir uložíme směrový vektor od vrcholu ke kameře. Pozice kamery je shaderu předána jako uniformní parametr a směr je předán fragment shaderu. Nakonec provedeme transformaci vrcholu a jeho projekci do souřadného systému obrazovky násobením příslušnými maticemi. i attribute float Height; 2 uniform vec3 CameraPos; 3 varying vec3 ViewDir; 4 s void main() 6 { 7 vec4 Pos = gl_vertex; s Pos. z = Height; 9 ViewDir = CameraPos Pos. xyz; io gl_position = gl_projectionmatrix * gl_modelviewmatrix * Pos; n } Ukázkový fragment shader vezme barvu z textury na daných souřadnicích a interpoluje ji s barvou zadanou jako uniformní. i uniform vec4 color; 2 sampler2d texo; 3 4 void main() 5 { 6 vec4 texture = texture2d (texo, gl_texcoord [0]. xy); 7 vec3 col = mix( color. rgb, texture, rgb, texture.a); s gl_fragcolor = vec4(col, color.a); 9 } V GLSL ovšem nemůžeme napsat libovolně rozsáhlý program. GPU mají limity na počty atributů a jiných proměnných, na počet instrukcí přeložených programů apod. Tyto limity se však neustále posouvají - např. maximální počet instrukcí fragment programu prvních programovatelných GPU byl menší než 16, zatímco nejnovější mají limity v řádu tisíců. Pro usnadnění tvorby shaderu byly vytvořeny různé nástroje jako Render Monkey 4, Shader Designer 5 nebo open source projekt Lumina 6. 4. http://ati.amd.com/developer/rendermonkey 5. http://www.typhoonlabs.com/ 6. http://lumina.sourceforge.net/ 8

Kapitola 3 Zobrazování terénu Pro zobrazení terénu na počítači potřebujeme nejprve nějakou jeho reprezentaci. Na rozdíl od obecných modelů má terén jisté specifické vlastnosti, kterých můžeme pro jeho zobrazování s výhodou využít. V této kapitole nejprve popíšeme možné reprezentace terénu a dále obecný postup při jejich zobrazování. Následuje představení pojmu úroveň detailu terénu a přehled několika zobrazovacích metod, kde také podrobněji popíšeme metodu, jejíž rozšíření je hlavním tématem této práce. Závěrem uvedeme několik možností využití programovatelných grafických karet. 3.1 Reprezentace terénu Terén můžeme chápat jako spojitý trojrozměrný povrch z = f(x,y), kde z je výška terénu v bodě [x, y] roviny (např. průmět terénu do roviny v kartografii). Stejně jako při vizualizaci obrazů a jiných spojitých signálu na počítači musíme i povrch terénu diskretizovat, tedy pořídit vzorky v určitých místech terénu. Nejčastěji používanou reprezentací takto navzorkovaného terénu jsou výškové mapy (height maps, elevation maps). Výšková mapa je dvojrozměrné pole hodnot (označovaných někdy jako hexely - analogie k pixelům) představujících výšky terénu v daných místech vzorkování. Tato místa jsou nejčastěji rozmístěna v pravidelné nebo semipravidelné dvojrozměrné mřížce. Převod bodu výškové mapy na výsledný trojrozměrný bod lze definovat jako funkci / : R 2 > R 3, kde f(x, y) = [x, y, z(x, y)]. Funkce z vrací hodnotu výškové mapy na daných souřadnicích a právě její hodnoty jsou uchovávány. Souřadnice bodu 2D mřížky x a y není nutné ukládat, protože jsou odvoditelné z pozice výškové hodnoty ve zmíněném dvourozměrném poli. Každý vzorek povrchu terénu je tedy uchováván jako jedna skalární hodnota a paměťové nároky se odvíjí pouze od velikosti terénu a vyžadované přesnosti vzorků. Výškové mapy můžeme ukládat jako obrazové soubory v běžných formátech jako PNG nebo JPEG (obvykle šedotónní s osmi nebo šestnáctibitovou hloubkou). Existují také specializované formáty (DEM, DTED, GeoTIFF) obsahující i geografické informace o reprezentovaném terénu (georeferenční bod, datum, použitý elipsoid atd.). Výškové mapy reálných krajin se pořizují satelitním snímkováním povrchu Země. Vlastní mapy můžeme nakreslit nebo procedurálně vygenerovat. Procedurální metody jsou často založeny na fraktálech (např. přesouvání středního bodu) nebo se používají šumové funkce (např. Perlinova). Extrahováním hodnot z výškové mapy za použití souřadnic mřížky získáme množinu bezrozměrných bodů v prostoru. Abychom mohli na současném grafickém hardwaru zob- 9

3. ZOBRAZOVÁNÍ TERÉNU Obrázek 3.1: Typická výšková mapa razit aproximaci původního spojitého terénu pomocí této množiny, musíme nejprve provést triangulaci. Vytvoření tzv. pravidelné trojúhelníkové sítě je triviální, jelikož i rozmístění bodů mřížky je pravidelné. Část povrchu terénu ohraničenou čtyřmi sousedícími body mřížky můžeme vyjádřit jako dva rovnoramenné pravoúhlé trojúhelníky, které dohromady tvoří čtyřúhelník. Takto vytvořená síť bude složena z (n 1) x (m 1) x 2 trojúhelníků, kde n je šířka a m je výška zdrojové mřížky. Pro reprezentaci terénu můžeme použít i nepravidelné trojúhelníkové sítě (triangulated irregular networks, TIN). Jejich vstupní data nejsou pravidelně rozložena na základě mřížky a nepředstavují terén jako funkci z = f(x, y), jednomu bodu [x, y] může odpovídat více výškových hodnot z a mohou tedy představovat libovolně členitý terén i s převisy a jeskyněmi. Jedná se tedy v podstatě o obecné polygonové 3D modely, které dané aproximace terénu dosahují za použití menšího množství trojúhelníků než pravidelné sítě. Algoritmy pro jejich zpracování a manipulaci s nimi jsou ovšem složitější a náročnější na výkon (např. zjištění výšky libovolného bodu na povrchu terénu nebo pohledové ořezávání). Také vyžadují větší množství paměti, protože již nestačí uchovávat skaláry, ale kompletní prostorové souřadnice bodů a také informace o triangulaci. 10

3. ZOBRAZOVÁNÍ TERÉNU 3.2 Zobrazování Máme-li k dispozici trojúhelníkovou síť aproximující daný terén, můžeme ho za použití stávajícího hardware zobrazit. Současná nejrozšířenější rozhraní OpenGL a Direct3D umožňují několik způsobů jak sítě zobrazit. Nejjednodušší je předávat rozhraní jeden trojúhelník po druhém vždy s jeho třemi vrcholy. Každý trojúhelník sítě terénu ovšem sdílí své vrcholy s dalšími trojúhelníky, při tomto postupu je tedy každý vrchol předán několikrát. Rozhraní dovolují definovat množinu trojúhelníků i ve formě trojúhelníkových pásů a vějířů (strips and fans). Obrázek 3.2: Trojúhelníkový pás a vějíř Pás je tvořen dvěma počátečními vrcholy a každý další přidaný vrchol pak tvoří trojúhelník spolu s dvěma předchozími vrcholy. Vějíř je definován podobně, jen trojúhelník není tvořen dvěma předchozími, ale pouze jedním předchozím a prvním vrcholem v posloupnosti. Všechny trojúhelníky vějíře tedy sdílejí tento první vrchol. Vidíme, že pro zobrazování sítě terénu je vhodnější trojúhelníkový pás - každá řada trojúhelníků (vycházející z řady pixelů výškové mapy) může být rozhraní předána jako pás. S využitím degenerovaných trojúhelníků je dokonce možné předat celý terén najednou jako jeden pás. Degenerovaný trojúhelník je takový, který má nulovou plochu a běžně je tvořen dvěma stejnými a jedním různým vrcholem. Je vložen na konec každé řady, aby tvořil počátek nové. Reprezentace trojúhelníků Počet indexů Počet částí Idx. celkem n=m=1025 Jednotlivě 6(n l)(m 1) 1 6291456 Pás 2n{m 1) m 1 2099200 Degenerovaný pás (2n + 2)(m-l) 1 2101248 Tabulka 3.1: Počty indexů a částí pro zobrazení terénu při různých reprezentacích trojúhelníků Předáním sítě jako trojúhelníkového pásu se zbavíme nutnosti duplikovat vrcholy. Jeden vrchol je běžně tvořen minimálně 12 byty (souřadnice X, Y a Z typu float) informací, ale ani více než 32 bytů není neobvyklé (souřadnice, normála, texturové koordináty, barva atd.). 11

3. ZOBRAZOVÁNÍ TERÉNU Pro běžný terén budou všechny tyto informace statické a předávat je rozhraní každý snímek je tedy zbytečné. Grafická rozhraní umožňují použití tzv. indexovaných trojúhelníků, kde již není třeba předávat celé vrcholy ale jen indexy do pole vrcholů. Toto pole všech vrcholů je rozhraní předáno jen jednou např. po spuštění programu. Při vykreslování snímku je trojúhelníkový pás definován pouze indexy vrcholů v tomto poli. Velikost indexu je běžně 16 nebo 32 bitů a tedy výrazně menší než odpovídající vrchol. Jak vidíme v tabulce 3.1 nejmenší počet indexů je třeba při použití pásu pro každou řadu výškové mapy. Ovšem potom musíme každou řadu vykreslit zvlášť, pás s degenerovanými trojúhelníky vyžaduje jen nepatrně více indexů, ale je možné ho zobrazit najednou. Kombinací pásů a indexovaných trojúhelníků můžeme často dosáhnout i několikanásobného zrychlení vykreslování terénu. Dalšího výrazného zrychlení můžeme dosáhnout použitím pohledového ořezávání. Jen málokdy vidíme celý terén, většinou je jeho značná část za pozorovatelem a obecně mimo zorné pole kamery. Pro využití ořezávání ovšem již nemůžeme celý terén zobrazit najednou, musíme ho rozdělit na menší celky. Zobrazíme ty z nich, které budou v daném snímku viditelné. Grafická rozhraní také podporují možnost vykreslování jen stran polygonů přivrácených k pozorovateli - pro zobrazování terénu další možnost urychlení. 3.3 Úroveň detailů Triangulace tvořená spojováním sousedních vrcholů do trojúhelníků poskytuje na každém místě terénu stejnou detailnost aproximace povrchu terénu. Pro rozsáhlejší terény běžně dostaneme triangulaci s miliony i desítkami milionů trojúhelníků. I když moderní GPU podle specifikací zvládají zpracovat několik stovek milionů trojúhelníků za sekundu, výkon v reálných aplikacích je nižší. Kdybychom počítali s reálným výkonem 50 milionů za sekundu, terén s deseti miliony trojúhelníky (to je nepříliš rozsáhlý terén tvořený přibližně 2250 x 2250 vzorky) by GPU vykreslovalo pouze v pěti snímcích za vteřinu. S použitím urychlovacích technik popsaných v minulém oddíle bychom vykreslování mohli i několikrát zrychlit, ale co když dostaneme požadavek na zobrazení terénu se sto miliony trojúhelníky? Výkon grafických karet sice rychle roste, ale nároky na kvalitu zobrazení a v případě terénu i na jeho velikost rostou také. Při trojrozměrném zobrazení terénu s použitím perspektivní projekce jsou trojúhelníky vzdálené od kamery promítnuty do výsledného obrazu jen jako jeden nebo několik málo pixelů. V případě velmi rozsáhlých terénů to mohou být jen zlomky pixelu. Dochází zde k typu aliasu známému jako převzorkování (oversampling). Nemá smysl vykreslovat dvacet trojúhelníků na jeden pixel, když výsledná barva bude stejně určena jen jedním z nich. Navíc pokud by se barva blízkých trojúhelníků znatelněji lišila, při pohybu kamery by vznikaly vizuální artefakty způsobené právě aliasem. Pokud bychom triangulaci zvolili tak, aby jeden pixel byl pokryt jedním nebo jen několika málo trojúhelníky, zbavili bychom se aliasu a hlavně by se podstatně snížil počet trojúhelníků triangulace. To by nám zase dovolilo zobrazit rozsáhlejší terény. Nalezení právě takové triangulace, která co nejvěrněji aproximuje 12

3. ZOBRAZOVÁNÍ TERÉNU povrch terénu, ale tvoří ji menší množství trojúhelníků, řeší algoritmy pro úroveň detailu (LOD, level of detail). Algoritmy LOD se obecně dělí na diskrétní a spojité. Diskrétní algoritmy používají pro každý objekt jeho předem připravené varianty s klesající úrovní detailu (méně trojúhelníků). Během vykreslování je vybrána vhodná varianta, a to na základě vzdálenosti objektu od kamery nebo na základě jiné metriky. Výhodou diskrétních algoritmů je jejich rychlost - spočítáme jen nějakou jednoduchou metriku a není nutné provádět jiné výpočty a zvláště ne ty, jejichž délka provádění závisí na složitosti objektu. Nevýhodou jsou potom viditelné chyby v zobrazení při přepínání mezi jednotlivými úrovněmi. Ty lze omezit například interpolací mezi dvěma variantami objektu namísto pouhého přepnutí při překročení meze na základě metriky. Spojité algoritmy naopak vytvářejí zjednodušení původního modelu přímo za běhu programu. Pro každý objekt je zvolena úroveň detailu přesně a lze ji také plynule měnit. Spojité algoritmy jsou výpočetně náročnější, ale nedochází u nich ke skokovým změnám v zobrazení objektů jako u diskrétních metod. Rozšíření spojitých algoritmů označované jako pohledově závislé dovoluje použití různých úrovní detailu na různých místech objektu v závislosti na pozici a případně i orientaci kamery. V blízkosti pozorovatele může být model velice detailní, zatímco vzdáleným nebo málo významným místům bude detail chybět. Právě pohledově závislá varianta spojitých algoritmů je pro zobrazování terénů často používána, protože poskytuje větší detail u pozorovatele a redukci počtu trojúhelníků dále od kamery (nebo i mimo zorné pole), kde to již pro pozorovatele nebude patrné. V posledních letech se používají i metody kombinující diskrétní přístup a pohledově závislé zjednodušování. 3.4 Přehled a vývoj zobrazovacích metod Od počátku devadesátých let bylo vyvinuto mnoho rozdílných metod určených výhradně pro zobrazování terénu s úrovní detailu. Většina je založena na pravidelných trojúhelníkových sítích a používá nějakou hierarchickou strukturu - nejčastěji binární a kvadrantové stromy. Některé starší metody pracují systémem zdola nahoru, kdy začínají s detailní reprezentací terénu a slučují trojúhelníky do větších. Tyto metody jsou ovšem závislé na velikosti terénu a pro rozsáhlé terény nejsou vhodné. Modernější metody pracují opačně - systém shora dolů začíná s hrubou aproximací terénu a postupně ji zjemňuje. Nezáleží tedy tolik na velikosti nejdetailnější aproximace terénu, protože ji prakticky nikdy nedosáhneme pro celý terén. Starší metody z doby před rozšířením levných a výkonných GPU často pracují i s jednotlivými trojúhelníky. Procesor býval rychlejší než grafické karty a z hlediska rychlosti vykreslování se vyplatilo nechat CPU udělat více práce tak, aby karta dostala co nejmenší počet trojúhelníků. Později došlo k obratu a je snaha minimalizovat zatížení CPU a maximalizovat práci vykonanou GPU. 13

3. ZOBRAZOVÁNÍ TERÉNU Jeden z prvních algoritmů pro zobrazování terénu v reálném čase se spojitou úrovní de tailu publikovali v roce 1996 Lindstrom a Koller pod názvem Continuous Level of Detail for Height Fields [ ] (dále CLOD). Pracuje s mřížkou trojúhelníků vytvořenou z výškové mapy, kterou zjednodušuje opakovaným spojováním dvou sousedících stejně velkých troj úhelníků. Algoritmus používá jako kritérium pro zjednodušování geometrickou chybu v souřad ném systému obrazovky (tedy po perspektivní projekci). Tato chyba je definována jako vzdálenost mezi vrcholem v jemnější triangulaci a místem ve zjednodušené triangulaci, kde daný vrchol chybí. Během zjednodušování je porovnána s uživatelsky definovatelnou mezí a pokud je menší, dvojice trojúhelníků v okolí daného vrcholu je spojena. Postup používající při hledání vhodné triangulace geometrickou chybu byl přejat (a případně upraven) mnoha následujícími metodami. CLOD tedy pracuje tedy systémem zdola nahoru. Pro snížení závislosti na velikosti vstupu může být terén rozdělen do samostatných čtvercových bloků. Bloky o různé veli kosti jsou uloženy v kvadrantovém stromu a lze je podle potřeby spojovat a dělit a to opět na základě chybových hodnot. Trojúhelníky v těchto blocích jsou potom zjednodušovány výše popsaným algoritmem. Použití kvadrantového stromu také umožňuje rychlé hierarchické testování viditelnosti - není-li některý z uzlů viditelný, nemohou být viditelní ani jeho po tomci. Reprezentace terénu stromovou strukturou, hierarchické testování viditelnosti i dě lení a spojování větších celků terénu jsou opět aspekty CLOD přejaté v různých formách mnoha pozdějšími metodami. Také s problémem prasklin povrchu na hranicích jednotli vých bloků nebo i jinde, kde se stýkají oblasti s rozdílnou úrovní detailu, se potýká většina algoritmů pro zobrazování terénu. CLOD praskliny řeší systémem závislostí vrcholů, jedná se o relativně komplikované řešení. Ve své době se velice rozšířeným algoritmem stal ROAM, který publikoval Duchaineau a kolektiv v roce 1997 v práci Real-time Optimally Adapting Meshes [ ]. ROAM zjedno dušuje (např. řešení prasklin) a rozšiřuje (např. možnost explicitně určit cílový počet troj úhelníků) některé oblasti metody CLOD. Dle autorů je doba běhu plně optimalizovaného algoritmu závislá pouze na změně počtu výstupních trojúhelníků na snímek, nikoliv na ve likosti vstupního terénu. Terén je v algoritmu ROAM reprezentován jako binární strom, jehož uzly tvoří rovnoramenné pravoúhlé trojúhelníky. Kořenem stromu je trojúhelník na nejhrubší úrovni detailu (pro čtvercový terén tedy potřebujeme dva stromy), jehož dva potomci jsou vytvořeni roz dělením tohoto trojúhelníku úsečkou vedenou z vrcholu u pravého úhlu do středu přepony. Ostatní uzly stromu dostaneme rekurzivním opakováním tohoto dělení. Základem tvorby zjednodušené triangulace jsou operace split a merge. Split rozdělí uzel stromu (tedy pravoúhlý trojúhelník) na dva menší a tím zvýší detailnost terénu. Inverzní operace merge naopak trojúhelníky spojí. Při operacích je nutno dodržovat jistá pravidla, která zamezí vzniku prasklin na výsledném povrchu terénu. Podobně jako CLOD i ROAM využívá geometrické chyby, které zde vychází z obalových těles trojúhelníků. Výsledný model terénu je vytvořen aplikací série funkcí split a merge na trojúhelníky v binárním stromu. Při vykreslování každého snímku probíhá rozdělování a slučování, dokud nejsou 14

3. ZOBRAZOVÁNÍ TERÉNU splněny dané podmínky (čas na zpracování jednoho snímku, počet trojúhelníků aproximace). ROAM pracuje shora dolů a také využitá snímkové koherence - model terénu nemusí být pro každý snímek budován znovu, ale je možné začít s výsledky z minulého snímku, čímž se vykreslování v některých případech značně urychlí. c) d) Obrázek 3.3: Ukázkové triangulace pomocí algoritmů: a) CLOD, b) ROAM, c) Röttger, d) Geometry Clipmaps Jiný algoritmus pracující s kvadrantovými stromy představil Röttger a kolektiv v práci Real-Time Generation of Continuous Levels of Detail for Height Fields [<>] v roce 1998. Pro vykreslování čtvercové oblasti terénu náležící uzlu stromu upřednostňuje trojúhelníkový vějíř se společným vrcholem uprostřed čtverce. Algoritmus pracuje shora dolů, na základě geometrické chyby buď vykreslý trojúhelníkový vějíř pro daný uzel nebo postupuje dále k potomkům uzlu. Zamezení vzniku prasklin mezi čtvercovými bloky je řešeno vynecháním určitých trojúhelníků vějíře na straně sousedící s blokem jiné úrovně detailu. Metoda se vyznačuje nízkými paměťovými nároky na uchovávání dat terénu v porovnání se staršími postupy. Článek také zmiňuje geomorfování, metodu pro postupný přechod mezi úrovněmi detailů pomocí interpolace. Geomorfování potlačuje jev zvaný popping, který nastává při náhlém přechodu mezi úrovněmi. 15

3. ZOBRAZOVÁNÍ TERÉNU Metodu SOAR (Stateless One-pass Adaptive Refinement) publikovali Lindstrom a Pascucci v roce 2001 [ ] a dále rozšířili v roce 2002 [ ]. Dle autorů jde o elegantní a jednoduše implementovatelný systém pro zobrazování a zjemňování rozsáhlých terénů v závislosti na pozici kamery, který je nezávislý na použité chybové metrice. Podporuje rychlé hierarchické pohledové ořezávání, generování trojúhelníkových pásů a možnost rozdělení procesů zjem ňování a zobrazování do oddělených vláken, čímž lze výrazně zvýšit výkon na víceproce sorových platformách. Také začíná nejhrubší aproximací terénu a postupně dělí pravoúhlé trojúhelníky podle přepony na základě chybových hodnot. Elegantně řeší problém vzniku prasklin pomocí vnořené hierarchie ohraničujících koulí pro každý vrchol. Počátkem třetího tisíciletí již byly grafické karty natolik výkonné, že přestalo být vý hodné vykreslovat co nejmenší triangulaci a neúměrně tím zatěžovat CPU. Začaly se obje vovat nové metody, které místo toho pracovaly dle myšlenky: Pošli na GPU tolik trojúhel níků kolik zvládne a to při co nejmenším zatížení CPU." Místo tvorby přesných triangulací s co nejmenším počtem trojúhelníků pro zobrazení terénu s maximální požadovanou chy bou pracují tyto metody často s celými bloky trojúhelníků jako se základními a dále neděli telnými jednotkami. Tyto bloky mají často nějakým způsobem předem připravené diskrétní úrovně detailu. Moderní GPU pracují nejrychleji se statickou geometrií přímo uloženou v je jich paměti, je zde tedy snaha veškerá data terénu přesunout do VRAM. Zde jsou ovšem nedostupná pro CPU (přístup je pomalý) a proto moderní metody nemohou přistupovat k jednotlivým vrcholům a trojúhelníkům, tak jak na to spoléhaly starší metody (chybové hodnoty a další pomocné informace uložené per vertex). Pomocné informace používané pro určení úrovně detailů musí tedy být vyjádřeny pro jednotlivé bloky terénu. Jedna z prvních metod využívající nových GPU je Geomipmapping. Tato metoda je po drobněji popsána v následujícím oddíle, neboť se jedná o základ této práce. V poslední době je populární algoritmus Geometry Clipmaps, který publikovali v roce 2003 Losasso a Hoppe ['. ]. Používá pyramidální hierarchii bloků terénu centrovanou na pozici kamery, kdy čím je blok menší, tím je detailnější. V blízkosti pozorovatele je zobra zen blok na nejvyšší úrovni detailu, který v určité vzdálenosti plynule přechází do hrubšího bloku o větší rozloze. Hierarchie se pohybuje spolu s kamerou a je nutné data v pyramidě často aktualizovat. Algoritmus nepotřebuje k chodu žádné předpočítané hodnoty. Chybová metrika totiž nebere v potaz členitost terénu a je nezávislá na vstupních datech, proto je tato metoda ideální k použití komprese zdrojových dat. Autoři implementovali ztrátovou kompresi a dosáhli velmi dobrých výsledků (až 0,02 bytů na jeden vzorek výškové mapy). Data jsou dekomprimována v reálném čase při aktualizaci pyramidy. Nevýhodou tohoto algoritmu je značný počet trojúhelníků výsledného terénu v porovnání s ostatními meto dami a také poměrně složitá implementace. Je tedy vhodný jen pro výkonné grafické karty, které jsou však dnes již relativně běžné. Metodu je možné na moderních GPU implemento vat téměř zcela pomocí vertex a fragment programů ([11]), čímž dochází k přesunu značné části zátěže z procesoru centrálního na grafický. Popis praktické implementace Geometry Clipmaps najdeme v [15]. Metoda byla později rozšířena i o zpracování planetárních těles v [14]. 16

3. ZOBRAZOVÁNÍ TERÉNU Přehled řady starších i novějších metod pro zobrazování terénu můžeme najít na webové stránce http: //www. vterrain. org. 3.5 Geomipmapping Metodu Geomipmappingu představil v roce 2000 Willem H. de Boer v článku Fast Terrain Rendering Using Geometrical MipMapping [9] a je základem pro rozšířenou metodu prezentovanou v této práci. Podobně jako jiné algoritmy i Geomipmapping využívá kvadrantové stromy. Terén je rozdělen do menších bloků, které jsou uloženy pouze v listech stromu. Strom je použit pro rychlé hierarchické ořezávání geometrie. Každý uzel má definovánu ohraničující obálku - v případě listů jde o nejmenší možný kvádr schopný pojmout všechny vrcholy trojúhelníků v bloku terénu náležejícím tomuto listu. Obálka uzlů vyšších pater reprezentuje kvádr obsahující obálky všech potomků tohoto uzlu. Při ořezávání postupujeme od kořene stromu a testujeme viditelnost všech jeho potomků. Test je rekurzivně aplikován na viditelné uzly a po dosažení listu je blok terénu, který mu náleží, vykreslen. Bloky vzdálené od kamery můžeme zobrazit s menším detailem než ty blízké. Obdobně jako u techniky mipmappingu pro běžné textury, i zde je během předzpracování vytvořeno několik úrovní detailu pro každý blok. Každá nižší úroveň má poloviční rozlišení než předchozí a čtvrtinovou paměťovou náročnost. Blok terénu je čtverec o velikosti strany 2 n + 1 vrcholů. Nižší úroveň detailu vytvoříme tak, že z vyšší úrovně použijeme vzorky jen na lichých pozicích, čímž dostaneme blok o velikosti 2 n ~ l + 1. Obrázek 3.4: Sdílení hraničních vrcholů sousedícími bloky Máme-li zdrojovou výškovou mapu o velikosti 256 x 256 vzorků a jako velikost bloku zvolíme 17 x 17 vrcholů, dostaneme celkem 16 x 16 = 256 bloků. Vrchol trojúhelníku neodpovídá hexelu výškové mapy, jde jen o geometrický bod, kdežto hexel mapy reprezentuje jistou plochu s výškou odpovídající hodnotě hexel. Ovšem vrcholům mřížky musíme přiřadit právě výškové hodnoty mapy. Aby mřížka měla stejnou velikost jako výšková mapa (zde 256), musíme jeden sloupec a jednu řadu vrcholů na konec mřížky přidat (první vr- 17

3. ZOBRAZOVÁNÍ TERÉNU chol bude totiž na pozici [0,0] a 256. vrchol řádku mřížky na [255,0]). Tím dostaneme veli kost bloku 2n + 1. Nové vrcholy na okraji terénu dostaneme jednoduše tak, že zkopírujeme poslední hraniční vrcholy. Jako nové vrcholy bloků musíme použít počáteční vrcholy sou sedního bloku (viz 3.4). Tak zůstane spojitost terénu na hranici bloků zachována. Na rozdíl od tvorby mipmap pro textury nelze u geomipmap použít žádné filtrování, tím bychom o spojitost na hranicích bloků mohli přijít. Při zobrazování vybereme odpovídající úroveň geomipmapy pro každý viditelný list stromu v závislosti na vzdálenosti od kamery a členitosti terénu bloku. Stejně jako řada jiných metod i Geomipmapping používá geometrickou chybu, tentokrát je to však jedna hodnota pro celou geomipmapu. Je definována jako maximum z rozdílů výšek vrcholů ve vyšší geomipmapě a místem v aktuální geomipmapě, kde daný vrchol chybí. Dá se tedy chá pat jako cena přepnutí na méně detailní geomipmapu. Chyba je promítnuta do souřadného systému obrazovky a při výběru mipmapy k zobrazení je nejprve vybrána ta nejdetailnější. Chyba o jednu úroveň nižší mipmapy je porovnána s uživatelskou mezí, a je-li menší, je tato úroveň použita. Takto jsou následně porovnávány i další nižší úrovně, a to dokud chyba jedné z nich nepřekročí uživatelskou chybu, nebo není dosaženo nejnižší úrovně. Obrázek 3.5: Triangluace terénu metodou Geomipmapping Aby mezi bloky v rozdílných úrovních detailu nevznikaly praskliny, musíme z okraje detailnější ze dvou sousedících geomipmap odstranit 1 vrcholy, které v méně detailní nejsou. 1. pouze je v tomto snímku vyřadit z triangulace určené pro vykreslení 18

3. ZOBRAZOVÁNÍ TERÉNU Aby listy mohly rychle zjistit úroveň detailu okolních geomipmap, obsahují ukazatele na svoje sousedy Autor navrhuje použití trojúhelníkových vějířů pro zobrazování okrajů částí bloků, ze kterých lze nadbytečné vrcholy jednoduše vypustit. Autor v článku dále zmiňuje možné rozšíření o trilineární geomipmapping. Opět se jedná analogii k běžnému texturování za použití mipmappingu - z hlediska zobrazování terénu jde o obdobu geomorfování používanou jinými algoritmy. Při použití perspektivní projekce chyb bloků a dostatečně nízké uživatelské tolerance výrazně omezíme popping. Pro některé aplikace by to ovšem stále nemuselo stačit a také je třeba vzít v úvahu významný nárůst počtu trojúhelníků triangulace terénu při snižování chybové tolerance. Trilineární geomipmapping neprepína mezi úrovněmi mipmap skokově, ale přechod je pozvolný. V okolí přechodu je výška vrcholů výsledkem lineární interpolace výšek odpovídajících vrcholů v mipmapách, mezi kterými dochází k přechodu. Koeficient interpolace potom vychází z chybových hodnot obou mipmap. Původní algoritmus byl v následujících letech rozšířen i jinými autory. Geomorfování prováděné grafickou kartou pomocí vertex programů a výhodnější uspořádání trojúhelníků v blocích popisují Larsen a Christensen v [12]. Zobrazování terénů, které se nevejdou do paměti a jejich texturování se věnuje Brodersen v [13] 3.6 Možnosti využití GPU Jak již bylo zmíněno, vykreslování geometrie terénu po větších celcích ze statických dat umístěných v paměti GPU je základním předpokladem pro využití výkonového potenciálu moderních grafických karet. Jde však pouze o způsob uložení dat. Kromě toho můžeme pro zobrazování terénu využít i některé z nově dostupných schopností GPU přímo přesunujících práci z CPU na GPU. Programovatelná GPU nám poskytují nové přístupy k řešení různých aspektů zobrazování terénů. Při vykreslování trojúhelníků musím každý vrchol mít kompletní prostorové souřadnice [x,y,z\. Jak již víme, jsou v případě terénu xay rozmístěny v pravidelné mřížce. Tato mřížka je pro celý terén stejná, a pokud je terén rozdělen na menší části, bylo by výhodné mít možnost tuto mřížku vždy znovu použít. S použitím jedné mřížky pro všechny bloky terénu bychom mohli ušetřit značné množství paměti nutné k uchovávání dat terénu - kromě zanedbatelné velikosti mřížky (vzhledem k celkové velikosti terénu) bychom pro každý vrchol terénu potřebovali již jen souřadnici z. Pro správné vykreslení bloku terénu za použití sdílené mřížky potřebujeme mřížku přesunout na odpovídající místo v prostoru a pro každý vrchol získat odpovídající výškovou hodnotu z. Souřadnice mřížky dále můžeme mít v intervalu [0,1] a použít je zároveň i jako texturové koordináty nebo jakékoliv jiné hodnoty, které se postupně na povrchu terénu mění. Hodnoty nutné pro škálování mřížky daného bloku jednoduše předáme vertex programu jako parametry a pole výšek jako atributy vrcholů. Výškové hodnoty můžeme dokonce generovat přímo na GPU např. pomocí některé šumové funkce. Moderní grafické karty umožňují přístup k texturám i během zpracovávání vrcholů ve vertex programu (označováno jako Vertex Texture Fetch, dále jen VTF). VTF je ideálním ře- 19

3. ZOBRAZOVÁNÍ TERÉNU šením pro zobrazování terénu - výškovou mapu máme jako texturu a každý vrchol terénu může během svého zpracování zjistit výšku terénu v jakémkoliv jiném místě terénu (popř. bloku terénu). Tato technika je výhodná např. pro geomorfování terénu nebo i pro záplatování prasklin mezi bloky terénu, a to vše bez přičinění CPU. VTF můžeme také využít pro generování a deformace terénu přímo na GPU. Ve fragment programu můžeme na základě stávající výškové textury spočítat upravenou nebo vygenerovat úplně novou. Pokud jako vykreslovací cíl (render target) zvolíme texturu, můžeme ji pak použít jako novou výškovou texturu pro VTF. Takto můžeme vytvořit doslova nekonečný procedurální terén. Různé deformace i generování výšek můžeme sice provádět přímo ve vertex programu, ale zde by bylo nutné tyto výpočty provádět pro každý snímek. To je vhodné například pro vlnění vodní hladiny, ale ne pro méně časté jednorázové změny terénu. Nejmodernější GPU kromě klasických vertex a fragment programů podporují i nové tzv. geometry shaders. Tyto programy umožňují tvorbu nových vrcholů a trojúhelníků přímo na GPU. S jejich použitím bychom teoreticky mohli mít jako vstup pro zobrazování terénu pouze texturu s výškovými daty a i trojúhelníkové mřížky by generovalo GPU. Zatím je však provádění těchto programů velice pomalé a výstupní geometrie má různá omezení. Na GPU budoucnosti však již jejich použití může být reálnou možností. Použití fragment programů na prvních programovatelných GPU bylo také velice omezené oproti dnešnímu stavu. S pomocí fragment programů můžeme vykreslit povrchy terénů za použití mnoha různých a dříve nedostupných nebo příliš drahých technik. Nejjednodušším způsobem vizualizace terénu je jeho obarvení dle výšky, kde např. nížiny jsou zelené, vrchoviny hnědé a vrcholky hor bílé. Tímto způsobem můžeme terén obarvit kompletně ve fragment programu i s lineárně interpolovanými přechody mezi jednotlivými barvami. Stačí nám jen znát výšku terénu v daném místě a také její možný rozsah. OpenGL umožňuje použít osvětlení už od svého vzniku, ovšem výpočty jsou prováděny na jednotlivých vrcholech a výsledné barvy na povrchu trojúhelníků jsou interpolovaný na základě barev vrcholů, které je tvoří. Pro zobrazování osvětlených terénů se také běžně využívalo tzv. světelné mapy (light map), což je běžná textura do níž jsou zaneseny předem spočítané hodnoty osvětlení terénu. Tato textura je při vykreslování modulována s difúzni texturou terénu (případně mohou být obě mapy smíchány dopředu). Tímto způsobem dostaneme kvalitní osvětlení (počítáme předem a můžeme si dovolit náročnější výpočty) i s možnými stíny vrhanými terénem nebo jinými objekty. Ovšem výsledkem je naprosto statické osvětlení. Také rozlišení světelné mapy je omezené a na terénu blízko kamery může být jeden texel mapy roztažený přes značnou část terénu. Programovatelná GPU nám dovolují počítat dynamické osvětlení přímo jednotlivých pixelů výsledného obrazu a to za použití libovolného osvětlovacího modelu. Abychom mohli spočítat dynamické osvětlení, musíme mít k dispozici normálové vektory povrchu terénu. V současnosti se běžně uchovávají ve formě normálových map - každá složka normalizovaného vektoru je zde uložena jako barevná komponenta textury. Ve fragment programu z této textury vezmeme odpovídající vzorek a použijeme ho k výpočtu osvětlení. Rozlišení normálových map je ovšem také omezeno, pro větší detailnost osvětlení blízko kamery můžeme 20

3. ZOBRAZOVÁNÍ TERÉNU normály získané z mapy modulovat nějakou šumovou funkcí nebo navíc použít speciální normálovou mapu s vysokofrekvenčními detaily povrchu (může se např. lišit podle materiálů terénu v daném místě). Další technikou zlepšující vizuální dojem z povrchu terénu je paralaxní mapování (parallax mapping, také označováno jako offset mapping nebo virtual displacement mapping), které je jednoduše implementovatelné pomocí fragment programu. Za pomocí informací z výškové mapy a směru pohledu kamery modifikuje texturové koordináty pro přístup k difúzni i normálové mapě, tak aby výsledné zobrazení povrchu budilo dojem opravdové hloubky a plastičnosti. Jak plyne z jednoho z uvedených názvů metody, jedná se o napodobení techniky displacement mapování, která na základě výškové mapy přímo modifikuje pozice vrcholů (zobrazování terénu jako takové je vlastně formou displacement mapování). Paralaxní mapování ovšem pracuje pouze s texturami a je výrazně rychlejší. Pro pravý displacement totiž musíme mít k dispozici dostatečný počet vrcholů, které můžeme přesunout, kdežto pro paralaxní mapování nám stačí dostatečné rozlišení textur. Paralaxní mapování pro zobrazení terénu můžeme použít např. pro zlepšení prostorového dojmu z různých materiálů na povrchu terénu (tedy pro vysokofrekvenční detaily). Podrobnosti o implementací paralaxního i normálového mapování najdeme v oddíle 5.2.3 Použitý vzorek Původní vzorek textury Obrázek 3.6: Princip paralaxního mapování Paralaxní mapování bylo několikrát rozšířeno, objevily se také mnohé další techniky pro dosažení realističtějšího vzhledu povrchů. Při použití programovatelných GPU tedy můžeme povrchy zobrazit téměř podle našich představ, musíme ovšem přijít s dostatečně efektivní implementací naší myšlenky. Programovatelná GPU dobře využijeme i při vizualizaci dalších aspektů terénu. Vzdálený terén se v reálném světě pozorovateli jeví jakoby zamlžený vlivem rozptylu světla v atmosféře. K simulaci tohoto efektu můžeme použít běžnou mlhu, kterou OpenGL podporuje od svého vzniku. Výsledek ovšem není příliš věrohodný. Připomíná spíše starší počítačové hry, kde bylo mlhy hojně využíváno k zamaskování blízké hranice vykreslování herního světa. Ve fragment programu můžeme spočítat rozptyl světla podle platných fyzikálních zákonů (jejich efektivních aproximací). Dalším místem, kde lze dobře využít GPU programů 21

3. ZOBRAZOVÁNÍ TERÉNU je zobrazování vodních ploch na terénu. Můžeme počítat reflexi i refrakci vodního povrchu i simulovat jeho vlnění. 22

Kapitola 4 Víceúrovňový geomipmapping Původní metoda geomipmappingu popsaná v předchozí kapitole není příliš vhodná pro větší terény a pro zobrazování velice rozsáhlých terénu je již nepoužitelná. Modifikoval jsem metodu geomipmappingu, aby byla schopná tyto terény zobrazit v reálném čase. V této kapitole najdeme rámcový popis principů této modifikace nazvané víceúrovňový geomipmapping, následující kapitola se věnuje detailům její implementace. 4.1 Motivace Základní geomipmapping obsahuje výšková data terénu pouze v listech stromu. To představuje hlavní problém této metody při zobrazování velice rozsáhlých terénů, které mají značný počet listů. Při běžné velikosti části terénu reprezentované jedním uzlem 33 x 33 vzorků bude mít terén velikosti 16384 x 16384 vzorků celkem 262144 listů. Mnoho z těchto listů bude oříznuto při kontrole viditelnosti, ale stále jich ke zpracování zbude velké množství a to pro každý snímek. Kontrola viditelnosti (a další operace s uzly prováděné CPU) ve stromu s takovým množstvím uzlů už může být poměrně drahou operací. Při zobrazování listů ve velké vzdálenosti dochází díky perspektivní projekci ke stejnému jevu jako při zobrazování vzdálených trojúhelníků v popisu principu úrovně detailů v oddíle 3.3. Jen v tomto případě místo trojúhelníků jde o celé bloky trojúhelníků. I když v těchto vzdálenostech by pravděpodobně všechny listy byly zobrazeny s nejnižší úrovní detailu, ta by stále mohla být příliš detailní. Vzniká zde tedy potřeba pro princip kontroly úrovně detailu pracující nad stávajícím výběrem mipmapy a pracující na celých listech a obecně uzlech stromu. Článek představující původní metodu geomipmappingu velice krátce zmiňuje i možnost nahrávání dat terénu během jeho zobrazování, což je základní předpoklad pro zpracování velice rozsáhlých terénů, které se celé nevejdou do operační paměti. Struktura stromu, obálky uzlů a chybové hodnoty úrovní jednotlivých mipmap jsou spočítány předem. V průběhu zobrazování jsou detailnější mipmapy listů načteny ze souboru až když by měly být zobrazeny. Kromě základního principu další podrobnosti již v článku nenajdeme. 4.2 Princip modifikace Základním kamenem modifikované metody je možnost ukládat výšková a jiná data terénu i v jiných patrech stromu než v listech. Uzel ve vyšším patře pokrývá oblast terénu všech 23