České vysoké učení technické v Praze Fakulta elektrotechnická
Diplomová práce
Globální osvětlení v real-time 3D grafice Bc. Jaroslav Meloun
Vedoucí práce: Ing. Daniel Sýkora, Ph.D.
Studijní program: Elektrotechnika a informatika strukturovaný magisterský Obor: Informatika a výpočetní technika květen 2008
iv
Poděkování Děkuji Štěpánu Hrbkovi za pomoc při seznamování s Lightsprintem, Jaroslavu Křivánkovi za konzultace, Danielu Sýkorovi za připomínky k textu práce a kolegům Ondřeji Bendovi a Jiřímu Brožkovi za testování aplikace. v
vi
Prohlášení Prohlašuji, že jsem svou diplomovou práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Praze dne 27.4. 2008
.............................................................
vii
viii
Abstract The thesis deals with analysis of a global illumination usage in interactive applications. Global illumination computations are based on physically correct light transfer principles, two major computation methods are raytracing and radiosity. Due to heavy computations, global illumination methods are usually approximated in interactive applications using specific techniques. Properties of human perception are usually taken in account during the process. Radiosity-based methods seem to have better perspective for interactive application use, mainly due to real-time performance on a state-of-the-art hardware. The result of this thesis is a simple computer game featuring global illumination that is computed using the radiosity method.
Abstrakt Cílem této diplomové práce je analyzovat možnosti globálního osvětlení v rámci interaktivních aplikací. Výpočet globálního osvětlení je založen na principech fyzikálně korektního šíření světla, dva hlavní způsoby jeho výpočtu jsou raytracing a radiozitní metoda. Globální osvětlovací metody jsou výpočetně náročné, v interaktivních aplikacích je proto globální osvětlení různými technikami aproximováno. Při aproximaci jsou často brány v potaz vlastnosti lidského perceptuálního systému. Pro využití v interaktivních aplikacích se aktuálně jako perspektivnější ukazuje radiozitní metoda, vzhledem k možnosti provádět její výpočet v reálném čase i na běžně dostupném hardware. Výstupem této práce je jednoduchá počítačová hra, která pro výpočet globálního osvětlení využívá právě radiozitní metodu.
ix
x
Obsah Seznam obrázků
xiii
1 Úvod 1.1 Aplikace počítačové grafiky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Význam osvětlení . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Struktura textu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 1 2 2
2 Osvětlovací metody 2.1 Zobrazovací rovnice . . . . . 2.2 Notace světelných cest . . . 2.3 Lokální osvětlení . . . . . . 2.4 Globální osvětlení . . . . . . 2.4.1 Přímé osvětlení . . . 2.4.2 Nepřímé osvětlení . . 2.5 Efekty globálního osvětlení .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
3 3 5 5 7 7 8 9
3 Výpočet globálního osvětlení 3.1 Popis výpočtu . . . . . . . . 3.2 Charakteristiky metod . . . 3.3 Raytracing . . . . . . . . . 3.4 Radiozita . . . . . . . . . . 3.5 Teoretické aproximace . . . 3.6 Raytracing In Egoshooters .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
11 11 11 12 15 18 18
4 Globální osvětlení v praxi 4.1 Percepce . . . . . . . . . . . . 4.2 Praktické aproximace . . . . . 4.2.1 Ambientní osvětlení . 4.2.2 Světelné mapy . . . . 4.2.3 Ambient Occlusion . . 4.2.4 Další způsoby . . . . . 4.3 Srovnání osvětlovacích metod
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
20 20 20 21 23 25 26 27
5 Návrh hry 5.1 Cíle a forma . . . . . . . . . 5.2 Provedení . . . . . . . . . . 5.3 Scénář . . . . . . . . . . . . 5.4 Aspekty globálního osvětlení 5.5 Volba RTGI metody . . . . 5.6 Nové herní koncepty . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
28 28 28 28 29 30 31
6 Implementace hry 6.1 Použité knihovny . . . . 6.2 Struktura . . . . . . . . 6.2.1 GameApplication 6.2.2 GameScript . . . 6.2.3 GameEvent . . . 6.2.4 GameObject . . 6.2.5 GameControls . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
32 32 33 34 34 35 35 35
. . . . . . .
. . . . . . .
xi
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
36 36 36 36 37 38
7 Globální osvětlení v OGRE 7.1 Osvětlovací proces . . . . . . . . . . 7.2 Zobrazení přímého osvětlení . . . . . 7.3 Detekce přímého osvětlení . . . . . . 7.4 Zobrazení globálního osvětlení . . . . 7.4.1 Zobrazovací řetězec v OGRE 7.4.2 Návrh techniky . . . . . . . . 7.4.3 Privátní nepřímé osvětlení . . 7.5 Optimalizace výkonu . . . . . . . . . 7.6 Přenositelnost . . . . . . . . . . . . . 7.7 Testování . . . . . . . . . . . . . . . 7.8 Srovnání . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
39 39 39 40 41 41 42 43 44 44 44 45
6.3
6.2.6 GameGUI . . . 6.2.7 GameAudio . . 6.2.8 OgreLightsprint Skriptovací jazyk . . . 6.3.1 Syntaxe . . . . 6.3.2 Interpretace . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
8 Závěr
47
9 Literatura
49
A Barevná příloha
51
B Seznam použitých zkratek
55
C Specifikace jazyka GameScript
57
D Příručka
59
E Obsah přiloženého CD
61
xii
Seznam obrázků 1.1
Srovnání počítačové grafiky ve filmu a v počítačových hrách . . . . . . . . . . . .
1
2.1 2.2 2.3 2.4 2.5
Členy zobrazovací rovnice . Typy odrazů . . . . . . . . Lokální osvětlení . . . . . . Složky globálního osvětlení . Efekty globálního osvětlení .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
4 6 7 8 9
3.1 3.2 3.3 3.4
Princip sledování paprsku . Radiozitní metoda . . . . . Raytracing in Egoshooters. Oasen. . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
13 16 19 19
4.1 4.2 4.3 4.4 4.5
Srovnání ambientního a globálního osvětlení Radiosity Normal Mapping . . . . . . . . . Ambient Occlusion . . . . . . . . . . . . . . Ambient Occlusion . . . . . . . . . . . . . . Srovnání osvětlovacích metod . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
21 24 25 26 27
5.1
Obrázky ze hry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.1 6.2 6.3
Schéma propojení hry s externími knihovnami. . . . . . . . . . . . . . . . . . . . 32 Objektový model herní aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Ukázka několika herních objektů . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.1 7.2 7.3 7.4
Srovnání stínovacích metod . . . . . . . . . . . . . Schéma detekce přímého osvětlení . . . . . . . . . . Schéma kompozitoru pro globální osvětlení . . . . . Schéma zobrazovací techniky pro globální osvětlení.
xiii
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
40 40 42 43
xiv
KAPITOLA 1. ÚVOD
1
1 Úvod Jedním z cílů počítačové grafiky je realistické modelování a zobrazování scén. Významnou roli při tom hraje způsob, jakým je řešeno osvětlení a stínování objektů. Tato diplomová práce se zaměřuje na metody výpočtu realistického osvětlení a možnosti jeho použití v real-time 3D aplikacích (především počítačových hrách). Cílem práce bylo vytvoření jednoduché hry, která uživateli praktickou formou prezentuje běžně používané osvětlovací metody a především poukáže na výhody globálního osvětlení.
Obrázek 1.1: Srovnání počítačové grafiky ve filmu a v počítačových hrách – film Final Fantasy: Advent Children (2006, Sony Pictures Home Entertainment), hra Half-Life 2: Episode Two (2007, Valve Corporation), hra Crysis (2007, Crytek)
1.1
Aplikace počítačové grafiky
Počítačová grafika je poměrně široký pojem zahrnující velké množství specializací. Přesto je nejčastěji spojován pouze s jednou z nich, a tou je realistické zobrazování 3D scén, resp. syntéza obrazu. Počítačová grafika nachází uplatnění v široké škále oborů – od zábavního průmyslu až po praktické aplikace. Každá z aplikačních oblastí klade jiné požadavky, a tomu odpovídá i specifický vývoj metod používaných v dané oblasti. V zábavním průmyslu se poměrně výrazně vyčleňují dvě větve, které počítačovou grafiku využívají. Jedná se o filmový průmysl a počítačové hry. V některých případech mohou obě oblasti splývat, přesto je mezi nimi stále jasně patrná odlišnost v jejich přístupu k využití grafiky. Film Ve filmové tvorbě je počítačová grafika využívána nejen pro dotváření trikových záběrů, ale čím dál častěji jako nástroj pro kompletní vytváření scén i celých filmů. Stejně jako filmové triky samotné, tak i počítačová grafika prošla a stále prochází vývojem. Díky výkonnějšímu hardwaru a nově nalézaným zobrazovacím a výpočetní metodám je neustále zlepšována vizuální kvalita i realističnost. Počítačové hry Herní průmysl klade na využití počítačové grafiky poměrně specifické požadavky. Počítačová hra je výrazně interaktivní médium. Průběh hry je plně ovládán hráčem a hra musí okamžitě reagovat na veškeré jeho příkazy. Zobrazovaný obsah proto nelze předem připravit, ale je nutné jej vytvářet a zobrazovat v reálném čase. Protože výkon grafické karty má jen omezenou kapacitu, je třeba upřednostňovat vysokou rychlost zobrazení na úkor kvality. Důsledkem je celkem patrný vizuální rozdíl mezi grafikou počítačových her a filmů (viz obr. 1.1).
2
KAPITOLA 1. ÚVOD
Díky neustálému zvyšování výkonu grafických karet se ke slovu dostávají i náročnější výpočetní metody, které umožňují realističtější zobrazení. Právě možnosti jejich použití jsou jedním z témat této práce. Praktické aplikace Pěkným příkladem praktického využití počítačové grafiky jsou architektonické vizualizační nástroje. Díky nim je možné s velkou dávkou realističnosti zobrazovat návrhy staveb a následně jimi virtuálně procházet. Velkou výhodou je možnost simulace vnitřního osvětlení budov, které jasně prokáže výhody i nevýhody navrhovaného osvětlovacího řešení.
1.2
Význam osvětlení
Stejně jako při orientaci v reálném světě, tak i v procesu počítačového zobrazování modelu scény hraje osvětlení velmi významnou roli. Osvětlení napomáhá lidskému vnímání snadněji pochopit hloubku scény, a tím odhadnout její prostorové rozložení. Existuje velké množství metod, které výpočet a zobrazení osvětlení umožňují. Vzájemně se ovšem v mnoha ohledech odlišují, a právě charakteristikami těchto zobrazovacích metod se zabývá následující kapitola.
1.3
Struktura textu
První část práce (kapitoly 1 až 4) je věnována rešerši metod používaných pro výpočet realistického osvětlení a jejich real-time modifikacím. Je zde podán teoretický úvod do problematiky, shrnutí aktuálně používaných metod, srovnání jejich charakteristik a návrh nejperspektivnějšího řešení pro danou úlohu. U metod je uváděn jejich základní princip i modifikace používané v praxi, z nichž některé jsou použity ve výsledné hře. Další část (kapitoly 5 až 8) je věnována implementaci samotné 3D hry. Kromě popisu jejího návrhu jsou zde rozvedeny vizuální i konceptuální možnosti, které interaktivní realistické osvětlení nabízí. V závěru je výsledná aplikace srovnána s podobnými implementacemi.
KAPITOLA 2. OSVĚTLOVACÍ METODY
3
2 Osvětlovací metody Pro výpočet osvětlení existuje celá škála metod, každá z nich se snaží realistické osvětlení aproximovat jiným způsobem. Metody při tom dosahují různé přesnosti a od toho se následně odvíjejí i jejich časové nároky. Účelem této kapitoly je základní seznámení s nejpoužívanějšími technikami, které řeší problém výpočtu osvětlení, a především vysvětlení přístupu označovaného jako globální osvětlení. Osvětlovací metody se obecně liší v mnoha parametrech, mezi ty nejvýznamnější patří kvalita zobrazení, rychlost výpočtu nebo jejich škálovatelnost. V závislosti na použité metodě se může přesnost a tím i výsledné zobrazení scény vizuálně velmi lišit (viz. obr 4.5). Osvětlovací metody lze charakterizovat i pomocí jejich omezujících faktorů. Mezi ty obvykle patří velikost zobrazované scény, počet světelných zdrojů, pohyblivost objektů ve scéně nebo charakter zobrazovaného osvětlení (charakteristiky zmíněny v [9]). Osvětlovací metodu je proto nutné volit s přihlédnutím k těmto faktorům.
2.1
Zobrazovací rovnice
Jako nástroj pro zjednodušený popis osvětlovacích metod použijeme zobrazovací rovnici podle Kajiya [5]. Toto sjednocení nám následně usnadní i vzájemné srovnání jejich přístupu. Díky němu budeme moci snadno nahlédnout, které metody jsou fyzikálně věrnější a které jsou naopak založeny spíše na aproximaci. Zobrazovací rovnice popisuje přenos světelné energie mezi plochami, resp. hodnotu osvětlení v konkrétním bodě v závislosti na okolních podmínkách. Podle Kajiya [5] je tato hodnota definována vztahem
I(x, x0 ) = g(x, x0 )v(x, x0 ) e(x, x0 ) +
Z
ρ(x, x0 , x00 )I(x0 , x00 )dx00 ,
(2.1)
S
kde I(x, x0 ) je intenzita osvětlení v bodě x přicházející z x0 g(x, x0 ) je geometrický člen v(x, x0 ) je člen vyjadřující viditelnost e(x, x0 ) vyjadřuje vlastní záření emitované z x0 do x ρ(x, x0 , x00 ) je člen určující míru odrazu Rovnice 2.1 vyjadřuje intenzitu osvětlení, které do bodu x přichází z bodu x0 (viz obr. 2.1). Integrace je prováděna přes součet povrchů všech ploch ve scéně. Rovnice je tedy vzájemně řešena pro všechny body scény (míněno body na povrchu objektů), resp. k osvětlení každého jednotlivého bodu přispívají všechny ostatní. Kajiya [5] vysvětluje, že rovnice vzhledem ke své obecnosti zjednodušuje osvětlovací model a tím zanedbává některé optické jevy. Výsledná intenzita je totiž pouze průměrem za jednotku času a nezohledňuje tudíž časově proměnlivou fázi. Tím pádem jsou zanedbány veškeré difrakční jevy (lom světla). Rovnice zároveň předpokládá, že mezi body x a x0 existuje homogenní prostředí, které žádným způsobem neovlivňuje intenzitu šířeného světla. Tím pádem nelze simulovat tzv. opticky aktivní prostředí s proměnlivou hustotou. Geometrický člen g(x, x0 ) vyjadřuje vztah geometrie scény a dráhy mezi body x a x0 . Pro jeho hodnotu platí cosθcosθ0 , (2.2) g(x, x0 ) = r(x, x0 )2
4
KAPITOLA 2. OSVĚTLOVACÍ METODY
Obrázek 2.1: Členy zobrazovací rovnice.
kde θ, resp. θ0 je úhel k normále v bodě x, resp. x0 (viz obr. 2.1) a r(x, x0 ) je vzdálenost bodů x a x0 . Přenos světla mezi body x a x0 je tedy ovlivněn vzdáleností bodů, ale i vzájemnou orientací ploch, na kterých jsou body umístěny. Člen v(x, x0 ) určuje viditelnost mezi body x a x0 . Neexistuje-li mezi body x a x0 přímá viditelnost, nabývá v(x, x0 ) hodnoty 0, v opačném případě je jeho hodnotou 1. Řešení viditelnosti mezi objekty ve scéně je výpočetně náročnou operací, některé metody jej proto aproximují, popř. zcela vypouštějí. Emisivní člen e(x, x0 ) určuje intenzitu vlastního záření, které je z bodu x0 emitováno směrem k bodu x. Jde o člen vyjadřující vlastní záření vydávané některými plochami. Odrazivý člen ρ(x, x0 , x00 ) určuje intenzitu světla, které bylo vysláno z bodu x00 do bodu x odrazem přes plochu v bodě x0 . Míra přenosu při tom závisí především na úhlech, pod kterými světlo přichází a odráží se. Obdobnou úlohu řeší často používaná funkce definující materiálové vlastnosti, označovaná jako dvousměrová odrazová distribuční funkce BRDF [13, 3] (angl. Bidirectional reflectance distribution function). Zobrazovací rovnice 2.1 má rekurentní podobu. Ta se ovšem v praxi zjednodušuje pomocí aproximativních řešení. Abychom mohli lépe vyjadřovat vztahy složené z několikanásobných odrazů, převedeme nyní zobrazovací rovnici na jedno z aproximativních řešení. Kajiya [5] popisuje postup, při kterém je základní zobrazovací rovnice 2.1 převedena do tvaru I = gve + gvM I,
(2.3)
kde M je lineární operátor daný původním integrálem v základní rovnici 2.1. Po provedení úprav (1 − gvM )I = gve I = (1 − gvM )−1 gve, kde 1 je jednotková matice, je využit vztah (1 − T )−1 =
∞ X
Tn
n=0
a výsledek převeden na Neumannovu řadu I = gve + gvM gve + (gvM )2 gve + (gvM )3 gve · · ·
(2.4)
Pro zajištění konvergence přitom musí být dodržena podmínka |M | < 1. Pomocí vztahu 2.4 lze vyjádřit zobrazovací rovnici některých aproximativních metod.
KAPITOLA 2. OSVĚTLOVACÍ METODY
5
Výše uvedenou zobrazovací rovnici v integrálním 2.1 a operátorovém 2.4 tvaru budeme používat jako základní model, na který budeme převádět osvětlovací řešení popisovaných metod. Nebudeme přitom řešit konkrétní jednotky fyzikálních veličin, ale zaměříme se spíše na složení rovnic a způsob implementace jednotlivých členů.
2.2
Notace světelných cest
Některé zobrazovací metody berou v potaz pouze určité typy světelných odrazů. Pro popis dráhy, po které je světlo v takovém případě přenášeno, je používána tzv. notace světelných cest [4, 17]. Jedná se o zjednodušenou formu regulárních výrazů, která podle [17] definuje následující symboly: L světelný zdroj D difuzně odrazivá plocha S zrcadlově odrazivá plocha G lesklá plocha E oko pozorovatele, kamera Zároveň jsou definovány následující modifikátory: (k)? žádný nebo jeden odraz typu k (k)+ jeden nebo více odrazů typu k (k)* žádný nebo více odrazů typu k (k|l) odraz typu k nebo l Např. cestu paprsku vyslaného ze světelného zdroje, který se od difuzně odrazivé plochy odrazil do kamery, pak popíšeme výrazem LDE. Podle jejich charakteru rozlišujeme několik druhů odrazu světla (viz obr. 2.2): difuzní odraz – příchozí paprsek je rozptýlen rovnoměrně do všech směrů, stínování je tedy nezávislé na úhlu pohledu. Výsledkem je měkce stínovaný objekt. lesklý odraz – příchozí paprsek je odražen do určitého rozmezí, stínování je závislé na úhlu pohledu. Výsledkem jsou lesklé oblasti v místech odrazu. zrcadlový odraz – příchozí paprsek je odražen do jediného směru (platí zákon odrazu). Výsledkem je objekt, v jehož povrchu se přesně odráží okolní scéna. Jak potvrzují Stokes et al. [15], jednotlivé typy odrazů světla mají pro lidské vnímání různou důležitost (viz kapitola 4.1), některé metody se proto zaměřují pouze na vybrané typy odrazů. Pro jejich vzájemné srovnání proto budeme používat notaci světelných cest.
2.3
Lokální osvětlení
Skupina osvětlovacích metod označovaná jako lokální osvětlení pojímá osvětlovací model zjednodušeným způsobem. Lokální osvětlení [17] bere při osvětlování každého objektu v úvahu pouze jeho lokální vlastnosti – pozici v prostoru a seznam světel ve scéně. Každý objekt je v tomto případě osvětlován zvlášť, jako by byl ve scéně osamocen. Vliv všech ostatních objektů na jeho
6
KAPITOLA 2. OSVĚTLOVACÍ METODY
Obrázek 2.2: Typy odrazů. Zleva: difuzní odraz, lesklý odraz, zrcadlový odraz
osvětlení je potlačen. Nemůže tedy dojít k vzájemnému zastínění objektů ani odrazům světla mezi jejich povrchy. V důsledku zjednodušení odpadá nutnost provádět test viditelnosti mezi osvětlovaným objektem (resp. bodem na jeho povrchu) a světelným zdrojem. Základní zobrazovací rovnice 2.1 je tedy upravena do tvaru 0
0
0
0
Z
0
00
00
ρ(x, x , x )e dx
I(x, x ) = g(x, x )v(x, x ) e(x, x ) + L
x00
,
(2.5)
kde L je sjednocení ploch všech světelných zdrojů e00x je intenzita vlastního vyzařování daného zdroje Vzhledem k absenci potenciálních zdrojů odraženého světla je původní integrál přes všechny plochy scény nahrazen integrací přes plochy světelných zdrojů. Integrální člen je přitom kromě odrazivého členu tvořen pouze intenzitou světelného zdroje, jejíž hodnota je ovšem přesně definována. Jsou-li místo plošných zdrojů světla použity pouze bodové zdroje, stává se z rekurentní rovnice (neznámá I(x, x0 ) na obou stranách) jednoduchá rovnice s konečným řešením. Rovněž v operátorovém tvaru bychom zobrazovací rovnici 2.4 pro lokální osvětlení mohli upravit do tvaru I = gve + gvM ge.
(2.6)
Z části, na kterou je aplikován operátor M , byl přitom vypuštěn člen viditelnosti v. Výraz můžeme dále upravit na běžně používanou aproximaci I = gve + gvM ge0 ,
(2.7)
kde e0 je intenzita vyzařování bodových zdrojů. Stejně jako v integrálním tvaru, i zde je rovnice zjednodušena – z původně nekonečného počtu členů jsou použity pouze první dva. Ty určují vnitřní vyzařování plochy a příspěvky z bodových zdrojů. Kajiya [5] upozorňuje, že operátor M je aplikován pouze na ge0 namísto původního gve. Příčinou je vypuštění testu viditelnosti v
KAPITOLA 2. OSVĚTLOVACÍ METODY
7
mezi plochou a zdroji světla, jak bylo zmíněno výše. Rovněž geometrický člen g je v některých případech zanedbán, viditelným důsledkem je pak nulový útlum světel se vzdáleností. Příjemným důsledkem zjednodušení je rychlý výpočet v lineárním čase. Rychlost je bohužel jedním z mála pozitiv této metody. Vzhledem k oddělenému stínování všech objektů (resp. ploch) nedochází k jejich vzájemnému zastiňování, a tím pádem k zobrazení vržených stínů [1]. Jako vržené označujeme stíny, které vznikají umístěním plochy mezi světelný zdroj a jinou plochu. Lokální osvětlení vytváří pouze tzv. vlastní stíny. Vlastní stíny vznikají na plochách, které jsou v důsledku své orientace odvráceny od světelného zdroje a intenzita dopadajícího světla je tím snížena. Na obr. 2.3 vpravo je ukázka lokálního osvětlení a vzniklé chyby – krychle sice obsahují vlastní stíny (viz jejich stěny odvrácené od světla), ale ani jedna z nich nevrhá stín.
Obrázek 2.3: Lokální osvětlení – schéma zleva: osvětlení objektu A, osvětlení objektu B, výsledné osvětlení scény. Osvětlené hrany jsou vyznačeny tenkou čarou, zastíněné hrany silnou čarou. Scéna s lokálním osvětlením (vpravo).
Pomocí notace světelných cest (viz kapitola 2.2) můžeme lokální osvětlovací model zapsat výrazem L(D|G|S)?E.
(2.8)
Lokální osvětlení tedy uvažuje nejvýše jeden odraz světla mezi světelným zdrojem a pozorovatelem. I přes uvedené nevýhody lokální osvětlení postačuje pro základní zobrazení objektů a je proto použito jako základní stínovací technika na většině GPU.
2.4
Globální osvětlení
Globální osvětlení [13] je osvětlovací přístup, který odstraňuje nedostatky lokálního osvětlení. Při zobrazování jednotlivých objektů je zde brána v potaz geometrie celé scény. Díky tomu lze simulovat odražené světlo a další fyzikální jevy, získané výsledky se proto velmi blíží realistickému osvětlení. Globální osvětlení je tvořeno součtem dvou základních složek – přímého a nepřímého osvětlení [13] (viz obr. 2.4). Uvedené složky se liší počtem světelných odrazů. Pro názornost budeme dále šíření světla popisovat ve formě světelných paprsků. Zjednodušeně řečeno tedy počet odrazů určuje, kolikrát se světelný paprsek odrazil, než dopadl ze světelného zdroje do konkrétního bodu. 2.4.1
Přímé osvětlení
Přímé osvětlení je tvořeno paprsky světla, které na povrch objektů dopadly přímo ze světelného zdroje. Mezi zdrojem světla a místem dopadu paprsku tedy existuje přímá viditelnost – nedošlo k odrazu, lomu ani pohlcení paprsku (viz obr. 2.4).
8
KAPITOLA 2. OSVĚTLOVACÍ METODY
Obrázek 2.4: Složky globálního osvětlení – vlevo: pouze přímé osvětlení, vpravo: přímé i nepřímé osvětlení.
Základem přímé složky globálního osvětlení je lokální osvětlení. V důsledku globálního přístupu ke geometrii scény je ovšem řešena viditelnost světelných zdrojů. Operátorový tvar zobrazovací rovnice 2.4 tedy lze vyjádřit ve tvaru I = gve + gM gve0 .
(2.9)
Oproti vztahu 2.6 přibyl člen viditelnosti v. Při sčítání příspěvků světelných zdrojů je tedy brána v potaz jejich viditelnost a tím dochází ke vzniku vržených stínů. Přidáním dalšího testu viditelnosti do zobrazovací rovnice přirozeně roste výpočetní náročnost celé operace. Existují ovšem metody, které umožňují zobrazení vržených stínů v lineárním čase. Ty nejčastěji používané jsou založeny na tzv. stínových tělesech nebo stínových mapách, oba uvedené přístupy jsou podrobně popsány v [1]. Oblasti stíněné před všemi zdroji světla mají při použití přímého osvětlení nulovou intenzitu ozáření a ve výsledku se jeví jako absolutně černé. V reálném světě se však absolutně černé stíny prakticky nevyskytují. Dochází totiž k odrazům světla mezi objekty a alespoň malá část odraženého světla vždy dopadne i do úplně zastíněných oblastí. Pomocí notace světelných cest můžeme přímé osvětlení zapsat stejným výrazem jako pro lokální osvětlení 2.8. Notace totiž při popisu nezohledňuje testy viditelnosti, které tvoří v tomto případě jediný rozdíl. 2.4.2
Nepřímé osvětlení
Nepřímé osvětlení [13] je tvořeno veškerými světelnými příspěvky, které nepovažujeme za přímé osvětlení (viz obr. 2.4). Jedná se tedy o odražené a lomené světelné paprsky, které tvoří doplněk k přímému osvětlení. Operátorový tvar zobrazovací rovnice přímého osvětlení 2.9 je tvořen prvními dvěma členy původního tvaru zobrazovací rovnice 2.4 . Nepřímé osvětlení tvoří doplněk k přímému osvětlení, což platí i pro jeho operátorové vyjádření: I = (gvM )2 gve + (gvM )3 gve · · ·
(2.10)
Narozdíl od vztahu 2.9 již není použit zjednodušený člen e0 . Nepřímé osvětlení je totiž distribuováno mezi všemi plochami scény, a ne pouze ze světelných zdrojů. Integrační krok je tedy nutno provádět přes všechny plochy ve scéně. Právě to je hlavní příčina výpočetní náročnosti nepřímého osvětlení. Pomocí notace světelných cest můžeme nepřímé osvětlení zapsat výrazem L(D|G|S) + (D|G|S) + E.
(2.11)
KAPITOLA 2. OSVĚTLOVACÍ METODY
9
Světelná cesta nepřímého osvětlení je tvořena alespoň dvěma odrazy, proto i člen (D|G|S) musí být ve výsledném výrazu zahrnut alespoň dvakrát. Některé metody využívají iterativního charakteru postupné konvergence, která umožňuje ukončení v případě dosažení postačující kvality výsledku. Důsledkem je částečné urychlení.
2.5
Efekty globálního osvětlení
Hlavním přínosem globálního osvětlení (oproti lokálnímu osvětlení) je realističtější zobrazení. Díky přítomnosti nepřímého osvětlení lze zobrazovat některé optické jevy, kterých by při použití pouze přímého osvětlením nebylo možno dosáhnout. Podle [7] jsou efekty globálního osvětlení důsledkem dvou jevů: změna barvy světla v závislosti na spektrální odrazivosti materiálů změna intenzity světla v závislosti na geometrii a materiálových vlastnostech Mezi nejlépe pozorovatelné efekty globálního osvětlení přitom patří tzv. color-bleeding (vytvářený prvním uvedeným jevem) a kaustiky (vznikají na základě druhého jevu). Další podstatnou charakteristikou globálního přístupu je jemné gradientní osvětlení způsobené rozptylem odraženého světla.
Obrázek 2.5: Efekty globálního osvětlení: color-bleeding (vlevo), kaustika (vpravo)
Color-bleeding Color-bleeding (neboli vypůjčení barev) patří mezi nejlépe pozorovatelné efekty globálního osvětlení. Při odrazu světelného paprsku od povrchu barevného objektu dochází ke změně barvy odraženého světla. Blízké plochy díky tomu získávají vzájemně podobné zabarvení (viz červeně zbarvená levá část draka na obr. 2.5, resp. v barevné příloze A). Barva povrchu je v podstatě určena rozsahem vlnových délek světla, které povrch odráží a které naopak absorbuje. Např. po dopadu bílého světla na červený povrch dojde k odražení pouze červené složky, ostatní jsou absorbovány. Kaustiky Jako kaustiky jsou označovány světelné obrazce vzniklé soustředěním světelných paprsků. V místě soustředění paprsků pak dochází k intenzivnějšímu ozáření povrchu než v okolních oblastech. Nejznámějším příkladem je soustředění světelných paprsků pomocí zvětšovacího skla. Kaustiky lze pozorovat i na dně pod rozvlněnou vodní hladinou, na kterou dopadá sluneční světlo, či při průchodu světla skleněnými objekty (viz obr. 2.5).
10
KAPITOLA 2. OSVĚTLOVACÍ METODY
Příčinou vzniku kaustik je odraz nebo lom paprsku. K tomu dochází nejčastěji při přechodu světelných paprsků mezi dvěma prostředími s různou hustotou. Při přechodu přes rozhraní je směr paprsků změněn a může tak dojít k jejich soustředění nebo rozptylu, což ovlivní výslednou intenzitu v místě dopadu a důsledkem je vznik nejrůznějších obrazců. Zobrazení kaustik nelze jednoduchým způsobem napodobit a je proto nutné simulovat dráhu paprsků, kterými jsou kaustiky tvořeny. Jak bude ukázáno v následujících kapitolách, jedná se o výpočetně velmi náročnou operaci.
KAPITOLA 3. VÝPOČET GLOBÁLNÍHO OSVĚTLENÍ
11
3 Výpočet globálního osvětlení Jak bylo naznačeno v předchozích částech, výpočet globálního osvětlení je poměrně netriviální operace. V následující kapitole budou nejprve ukázány rozdíly mezi výpočetními metodami a následně budou představeny dvě nejvýznamnější skupiny, které jsou pro výpočet globálního osvětlení používány – raytracing a radiozita.
3.1
Popis výpočtu
Vstupními hodnotami jakékoliv metody pro výpočet globálního osvětlení jsou geometrický model scény, informace o světelných zdrojích a popis materiálových vlastností objektů. Požadovaným výstupem je pak intenzita nepřímého osvětlení v každém bodě povrchu scény. Přímé osvětlení může být získáno některou jednodušší metodou a globální osvětlení pak vznikne jejich kombinací.
3.2
Charakteristiky metod
Výpočetní metody můžeme rozdělit podle mnoha charakteristik, stejné rozdělení lze použít i pro speciální případ výpočtu, kterým je globální osvětlení. Seznámíme se především s těmi nejvýznamnějšími charakteristikami a přihlédneme přitom k parametrům, které jsou pro osvětlovací metody specifické. Míra interaktivity Jedním z nejdůležitějších kritérií při volbě výpočetní metody je předpokládaný účel jejího použití, resp. požadavky na interaktivitu. Metody, které jsou schopné dodávat výsledky v reálném čase, tzn. poskytují uživateli dostatečně rychlou zpětnou vazbu, označujeme jako real-time (též on-line) metody. Tyto metody jsou využívány všude, kde dochází k nějaké interakci s uživatelem. Může se jednat o počítačové hry, ale i lékařská diagnostická zařízení nebo navigační přístroje. Naopak metody, jejichž výpočetní náročnost neumožňuje dostatečně rychlou zpětnou vazbu, jsou označovány jako non-real-time (též off-line) metody. Zde se jedná především o fotorealistické zobrazovací aplikace, tedy aplikace, u kterých není nutná přímá interakce uživatele. Pohledová závislost Většina grafických aplikací rozlišuje dvě fáze – výpočetní a zobrazovací. Během výpočetní fáze dochází ke zpracování vstupních dat a vypočtení nových hodnot. Ty jsou zobrazeny během zobrazovací fáze. Je důležité si uvědomit, že výpočetní fáze je obvykle prováděna pouze při změně vstupních hodnot nebo parametrů výpočtu – v takovém případě je výsledky nutné přepočítat a opět zobrazit. Oproti tomu zobrazovací fáze probíhá u interaktivních aplikací prakticky neustále. Vypočtené výsledky jsou během ní vykreslovány na výstupní zařízení, i pokud nedošlo k jejich změně. Metody, jejichž vstupním parametrem je i pozice kamery, označujeme jako pohledově závislé. Při jakémkoliv pohybu kamery nebo změně úhlu pohledu je totiž nutné znovu přepočítat celou zobrazovanou scénu. Naopak metody, u nichž pozice kamery výpočet nijak neovlivňuje, označujeme jako pohledově nezávislé. Kamera se může volně pohybovat a k přepočtu scény dochází pouze při změně její geometrie nebo dalších parametrů.
12
KAPITOLA 3. VÝPOČET GLOBÁLNÍHO OSVĚTLENÍ
Dynamika scény Nejen pozice kamery, ale i změna geometrie scény může mít vliv na výpočetní fázi, resp. potřebu přepočítat a aktualizovat vypočtené hodnoty. Umožňuje-li metoda pohyb objektů bez nutnosti nákladného přepočtu osvětlení, označujeme ji jako dynamickou. Naopak je-li nutné při pohybu objektu provést výpočetní fázi, jedná se o statickou metodu. Výše uvedená podmínka dynamičnosti metod je ovšem jen velmi obtížně splnitelná. Při pohybu každého objektu totiž dochází ke změně osvětlení, např. zastíněním jiného objektu. Některé metody proto objekty ve scéně rozdělují do dvou skupin – na statické a dynamické. Statické objekty nemění svou pozici (jsou nepohyblivé), ale jsou brány v potaz při výpočtu globálního, resp. nepřímého osvětlení. Světlo se tedy od jejich povrchu odráží a dále se šíří ve scéně. Dynamické objekty mohou měnit svou pozici ve scéně (jsou pohyblivé), ale při výpočtu nepřímého osvětlení jsou ignorovány. Zachycují sice přímé osvětlení a vytvářejí vržené stíny, ale při šíření odraženého světla jsou brány jako neviditelné. Jejich nepřímé osvětlení je proto řešeno výpočtem nepřímého osvětlení, které k dynamickému objektu přichází ze všech směrů a to je pak na objekt promítnuto pomocí tzv. environment mapy (mapa okolního prostředí). Environment mapy jsou velmi často využívány ve skupině technik označovaných jako IBR [13] (Image Based Rendering). Škálovatelnost Důležitým parametrem všech výpočetních metod obecně je jejich škálovatelnost. Označuje se tak závislost jejich časové náročnosti na objemu zpracovávaných dat, resp. charakter této závislosti. V případě zobrazovacích a osvětlovacích metod je objem vstupních dat určen především velikostí, resp. složitostí zobrazované scény. Některé metody jsou velmi rychlé při výpočtu v malých scénách, ale jejich výpočetní náročnost u komplexnějších scén rapidně narůstá. Říkáme o nich, že jsou špatně škálovatelné. Naopak některé metody nejsou rychlé na malých scénách, ale i u náročnějších scén roste jejich výpočetní doba zhruba lineárně. Ty jsou označovány jako dobře škálovatelné.
3.3
Raytracing
Raytracing (sledování paprsku) je označení velmi obsáhlé skupiny zobrazovacích metod (viz [13]). Tyto metody vycházejí z fyzikálního principu šíření světla a výpočet globálního osvětlení s jejich pomocí je proto logickým důsledkem. Stejně jako většina metod založených na simulaci fyzikálních principů, i raytracing podává velmi kvalitní výsledky zobrazení, cenou je ovšem vysoká časová náročnost. Princip výpočtu Základní princip je popsán na obr. 3.1. Předpokládáme, že světlo se šíří ze všech světelných zdrojů formou paprsků. Ty procházejí scénou, odrážejí se a některé z nich dopadnou na stínítko (resp. sítnici v oku pozorovatele), kde se vytváří obraz. Metoda sledování paprsku tedy postupuje zpět od stínítka, kam paprsek dopadl, a zpětně sleduje dráhu, kterou paprsek urazil. Během ní je upravována jeho výsledná intenzita. Směřuje-li např. paprsek ze stínítka přímo do zdroje světla, bude intenzita osvětlení výchozího bodu na stínítku rovná intenzitě zdroje. Naopak dopadne-li paprsek do zastíněné oblasti, bude jeho intenzita velmi nízká. Zobrazovací rovnice 2.4 v operátorovém tvaru upravená pro základní formu raytracingu pak bude mít následující podobu:
KAPITOLA 3. VÝPOČET GLOBÁLNÍHO OSVĚTLENÍ
13
Obrázek 3.1: Princip sledování paprsku – schéma vlevo: skrze pixely tvořící obraz na stínítku jsou vysílány paprsky směrem do scény. Jejich výsledná intenzita je pak dána vlastnostmi materiálů a pozicí objektů, od kterých se paprsek odrazil. Obrázek vpravo: scéna zobrazená pomocí klasického raytracingu - nepřímé osvětlení je získáno malým počtem čistě zrcadlových odrazů.
I = gve + gvM0 gve0 + (gvM0 )2 gve0 + (gvM0 )3 gve0 · · ·
(3.1)
Podle Kajiya [5] je zde původní operátor M nahrazen operátorem M0 , který je tvořen třemi složkami – dvěma funkcemi a cosinovým členem. Funkce ovlivňují odraz a lom paprsků, cosinový člen představuje difuzní složku. Ze složení výše uvedeného vztahu 3.1 je vidět, že obsahuje členy rovnice pro přímé 2.9 i nepřímé 2.10 osvětlení. Základní zobrazovací rovnice raytracingu má tedy charakter globálního osvětlení (viz kapitola 2.4). Vztah 3.1 představuje nekonečnou řadu, počet odrazů sledovaných paprsků tedy není nijak omezen. V praxi je však rovnice aproximována a z původní řady je použito pouze několik prvních členů. Praktické aplikace ukazují, že postačujících výsledků lze dosáhnout i v případě jednotek odrazů [17]. Aproximace rovnice 3.1 určená pro praktické použití pak bude mít zhruba následující podobu: I = gve + gvM0 gve0 + (gvM0 )2 gve0
(3.2)
Výše uvedená rovnice je tvořena třemi členy. První člen gve představuje emisivní složku, tedy světlo vyzařované samotnou plochou. Druhý člen gvM0 gve0 představuje přímé osvětlení, tedy ty paprsky světla, který byly po vyslání ze světelného zdroje odraženy přímo na stínítko – jedná se tedy o odraz prvního řádu. Třetí člen (gvM0 )2 gve0 představuje nepřímé osvětlení – tedy odraz druhého řádu. Pro zlepšení kvality jsou obvykle přidány i odrazy vyšších řádů, nám však pro ukázku postačí uvedené znění. Rovnice 3.2 rovněž obsahuje člen e0 představující intenzitu bodových zdrojů. Světelné zdroje jsou v rámci aproximace redukovány pouze na bodové, jejichž příspěvek lze zjistit v konstantním čase. V obecném případě, resp. při použití plošných zdrojů světla by bylo nutné integrovat příspěvek přes celou jejich plochu. Jedná se tedy o další zjednodušení, které však přináší značné urychlení. Každý člen rovnice 3.2 obsahuje člen v určující viditelnost. Právě testování viditelnosti, resp. nalezení nejbližšího objektu kolidujícího s paprskem, je výpočetně nejnáročnější částí celého procesu. Častým řešením je proto organizace objektů do hierarchické struktury [17], popř. úprava metody, kterou jsou paprsky distribuovány [13]. Podle [17] můžeme světelné cesty použité při sledování paprsku zapsat ve tvaru L(D|G)?S ∗ E,
(3.3)
kde figuruje libovolný počet zrcadlových odrazů S a lokální osvětlovací model reprezentovaný členem (D|G).
14
KAPITOLA 3. VÝPOČET GLOBÁLNÍHO OSVĚTLENÍ
Obraz je vytvářen na stínítku ze skupiny bodů (tzv. pixelů). Z každého bodu je přitom vysílán nejméně jeden paprsek. V praxi se však ukazuje, že pro realistické zobrazování scén to rozhodně nestačí a pro věrné zobrazení je vhodnější vysílat z každého pixelu desítky až stovky paprsků. Při jejich vysílání je rovněž výhodné nezaměřit se pouze na náhodné směry, ale přihlédnout k vhodné distribuční funkci [13]. Výše uvedený postup popisuje pouze základní princip sledování paprsků a jejich šíření skrze scénu. Existuje však množství variant, které raytracing aplikují v odlišné podobě [13]. Odlišnost může spočívat např. v počtu vysílaných paprsků, jejich směru, výpočtu odrazů, součtu jejich příspěvků apod. Charakteristiky V předešlé části 3.2 bylo definováno několik charakteristik, podle kterých lze výpočetní metody rozlišovat a porovnávat. Zkusíme se nyní zaměřit na využití raytracingu pro výpočet globálního osvětlení. Přihlédneme při tom k možnosti výpočtu v reálném čase. První charakteristikou byla míra interaktivity. Raytracing je ze své podstaty výpočetně náročnou metodou a na první pohled by se tedy jeho použití v interaktivních aplikacích mohlo zdát nemožné. Přesto však existují metody, pomocí kterých lze dosáhnout výrazného urychlení, které dosahuje až k mezím umožňujícím interaktivitu. Cenou je ovšem ve většině případů omezení ve formě speciálního typu scén, specializovaného hardware nebo nižší kvality. Několik interaktivních aplikací je popsáno v následující části. Další charakteristikou je pohledová nezávislost. Klasický raytracing je především zobrazovací metoda, syntéza obrazu tedy tvoří jádro celého výpočtu. Při každém pohybu kamery, resp. změně úhlu pohledu je nutno vyslat do scény novou skupinu paprsků a tím pádem zopakovat celý výpočetní cyklus. Je-li tedy raytracing využit pro zobrazování, jedná se o pohledově závislou metodu. Raytracing obecně nerozlišuje statické a dynamické objekty. Osvětlení je korektně počítáno pro všechny objekty, můžeme tedy všechny považovat za statické. Z toho ovšem vyplývá, že se nejedná a dynamickou metodu – při pohybu některého objektu je nutné provést opětovný výpočet osvětlení v celé scéně. Existují sice metody, které řeší výpočty změn na lokální úrovni, ty jsou však určeny pouze pro speciální případy. Varianty Metoda popsaná rovnicí 3.1 je označována jako tzv. klasický raytracing. Její přístup je však v mnoha směrech zjednodušený a nedosahuje vždy zcela fyzikálně korektních výsledků. Kajiya [5] uvádí, že operátor M0 v rovnici 3.1 sice obsahuje i členy definující lom a difuzní odraz, praktická implementace těchto složek je však poměrně obtížná. Klasický raytracing je proto obvykle vypouští a definuje pouze čistě zrcadlový odraz. Možné příchozí osvětlení vzniklé difuzním odrazem světla od jiné plochy je v tomto případě zcela ignorováno. Proto byly vyvinuty dokonalejší metody, které klasický princip sledování paprsku vylepšují [13]. Velmi obecně si představíme několik z nich. Path Tracing [13] – z každého pixelu je vysláno velké množství sledovaných paprsků, jejichž intenzita je ve výsledku zkombinována. Paprsky se neodráží pouze zrcadlově, ale náhodně – díky tomu jsou zajištěny i difuzní a další světelné příspěvky. Velké množství paprsků vyžaduje velký výpočetní výkon. Light Tracing [13] – obdoba Path Tracingu, paprsky ovšem nejsou sledovány směrem ze stínítka, ale opačně, tedy od světelných zdrojů. Bi-directional Path Tracing [13] – kombinace obou předchozích metod – paprsky jsou sledovány ze stínítka i od světelných zdrojů, hledá se jejich propojení.
KAPITOLA 3. VÝPOČET GLOBÁLNÍHO OSVĚTLENÍ
15
Photon Mapping [9] – ze světelných zdrojů jsou do scény nastříleny reprezentace fotonů (řádově miliony). Pomocí některé z variant raytracingu je pak scéna zobrazena, intenzita sledovaných paprsků je přitom ovlivněna nejbližšími fotony. Využití Pomocí pokročilých metod využívajících raytracing lze dosáhnout fotorealistického zobrazení scén. Většina případů vyžadujících vysokou vizuální kvalitu a nulovou míru interakce (např. filmová grafika, vizualizace) je proto řešena metodami založenými na raytracingu. Raytracing je výpočetně náročný především kvůli velkému množství paprsků, jejichž kolizi s objekty scény je třeba řešit. Jedná se ovšem o klasickou výpočetní úlohu, kterou lze částečně převést z CPU na GPU a využít tak urychlení díky paralelní funkci jednotek GPU. Na tomto principu jsou založeny některé z metod, které interaktivní raytracing řeší. Těm je věnována část 3.5.
3.4
Radiozita
Radiozita [7, 17] je označení radiometrické veličiny, která určuje množství světla vyzářené určitou plochou za jednotku času vztažené na jednotku plochy. Proto bývá také označována jako intenzita vyzařování. Metody, které pro výpočet osvětlení využívají radiozitu, jsou označovány jako radiozitní. Tato skupina metod [13] je založena na principu konečných prvků. Scéna je v tomto případě rozdělena na plošné elementy, jejichž radiozita je považována za konstantní. Metody poté řeší distribuci světelné energie mezi těmito elementy. Narozdíl od raytracingu, který pracuje s elementárními paprsky (resp. na úrovni bodů), klasická radiozitní metoda řeší přenos světelné energie na úrovni ploch. Výsledné osvětlení tedy nedosahuje přesnosti raytracingu, ale pro nepříliš komplexní scény nabízí výrazně rychlejší výpočet. Radiozitní metody obecně pracují pouze s difuzními (všesměrovými) odrazy světla. Zápis pomocí světelných cest bude mít tedy podobu LD ∗ E
(3.4)
Radiozitní metody tedy obvykle neřeší zrcadlové odrazy ani lom světla způsobující kaustiky. Náhradou těchto nedostatků může být kombinace s jinou zobrazovací metodou, která tyto typy odrazů podporuje. Princip výpočtu Narozdíl od raytracingu nejsou radiozitní metody zobrazovací, ale pouze výpočetní. Pro samotné zobrazení scény je tedy nutné využít některou ze zobrazovacích technik – ať už klasické polygonové zobrazování [17] na GPU nebo některou z variant raytracingu. Radiozitní metody jsou založeny na následujících předpokladech: scéna je složena z ploch s difuzní odrazivostí, některé z nich plní funkci zdroje světla a vyzařují tedy energii. Vstupem je tedy informace o velikosti a rozmístění ploch a počáteční energie každé z nich (nenulová pouze u zdrojů). Výpočet pak spočívá v postupné konvergenci k rovnovážnému stavu a nalezení energie vyzařované každou plochou. Až na triviální případy není přímo rovnovážného stavu dosaženo, ve většině případů se tedy jedná o aproximativní řešení. Radiozitní metody pracují pouze s difuzními typy odrazů, základní zobrazovací rovnice 2.1 je tedy upravena do následující podoby:
I(x, x0 ) = g(x, x0 )v(x, x0 ) e(x, x0 ) +
Z S
ρ0 I(x0 , x00 )dx00 .
(3.5)
16
KAPITOLA 3. VÝPOČET GLOBÁLNÍHO OSVĚTLENÍ
Obrázek 3.2: Radiozitní metoda – podle metody progressive radiosity je počáteční energie distribuována ze světelných zdrojů (vlevo) a v dalších krocích pak předávána mezi všemi plochami (uprostřed). Obrázek vpravo: scéna zobrazená pomocí radiozitní metody.
Původní odrazivý člen ρ(x, x0 , x00 ) je zde podle Kajiya [5] nahrazen konstantou ρ0 , protože v případě čistě difuzního odrazu není jeho míra nijak ovlivněna úhlem odrazu ani dopadu. Radiozitní rovnice [13] je obvykle uváděna v podobě: Bi = Bei + ρi
N X
Fij Bj ,
(3.6)
j
kde Bi je výsledná radiozita plochy i, Bei je radiozita emitovaná plochou i, ρi definuje odrazivé vlastnosti plochy i a Fij je tzv. form faktor. Platí: Fij =
1 Ai
Z
Z
v(x, y)g(x, y)dAx dAy , Si
(3.7)
Sj
kde Ai je obsah plochy i, v(x, y) je člen určující viditelnost ploch a g(x, y) je geometrický člen [13] definující vzájemnou orientaci a vzdálenost ploch x a y. Form faktor Fij dvou ploch určuje, jak velká část energie vyzářené první plochou je přijata druhou plochou a naopak. Velikost tohoto poměru přitom závisí na velikosti ploch, jejich viditelnosti, vzdálenosti a vzájemném úhlu natočení. Operátorový tvar základní zobrazovací rovnice 2.4 platí i pro vyjádření radiozitní metody. Operátor M je zde však diskretizovaný, resp. tvořený maticí form faktorů. Radiozitní rovnice 3.6 je rekurentní, teoreticky ji lze řešit jako soustavu lineárních rovnic pro všechny plochy scény. Časová náročnost řešení této soustavy by však byla enormní, v praxi je proto výpočet většinou nějakým způsobem aproximován. Jedním z praktických řešení radiozitních úloh je tzv. progressive radiosity [13] (označovaná též jako radiosity shooting). Distribuce světelné energie je zde simulována v krocích (viz obr. 3.2). Na počátku každého kroku má každá plocha definovanou energii. Každá plocha pak veškerou svou energii vyzáří do prostoru mezi ostatní plochy. Tímto způsobem zároveň od ostatních ploch určitou dávku energie přijme. Velikost této dávky je dána jak viditelností, tak velikosti ploch a jejich vzájemnou orientací. Podle přijaté energie je upravena energie všech ploch a krok se opakuje. Po určitém počtu kroků dojde k dosažení rovnovážného stavu, který odpovídá výslednému osvětlení scény. Charakteristiky Pomocí dříve definovaných charakteristik se nyní pokusíme popsat radiozitní výpočetní metody. Jak vyplývá z principu šíření světelné energie, každá plocha ovlivňuje všechny ostatní a naopak. Důsledkem je vysoká časová složitost, resp. výpočetní náročnost. Na menších scénách sice může výpočet klasické radiozity probíhat dostatečně rychle, u komplexnějších scén však doba potřebná pro výpočet roste. Klasická radiozitní metoda tedy není příliš vhodná pro interaktivní aplikace,
KAPITOLA 3. VÝPOČET GLOBÁLNÍHO OSVĚTLENÍ
17
přesto ale dosahuje lepších výsledků než globální osvětlení získané pomocí raytracingu. Existují ovšem metody, které výpočet radiozity výrazně urychlují a s jejichž pomocí lze dosáhnout velmi rychlého výpočtu. Na jedné z těchto metod je založen i výsledek této práce, jejich bližšímu popisu se věnuje následující část. Radiozitní metody nejsou zobrazovací, ale pouze výpočetní metody. Při pohybu kamery, resp. změně úhlu pohledu nedochází ke změně světelných podmínek a dříve spočtené osvětlení proto není nutné žádným způsobem upravovat. Zobrazení scény je od samotného výpočtu osvětlení zcela odděleno. O radiozitních metodách tedy platí, že jsou pohledově nezávislé. Při pohybu některého z objektu scény dochází ke změně vztahů mezi plochami. Např. plochy, mezi kterými byla původně přímá viditelnost, se mohou vzájemně odvrátit a naopak. Tím pádem dochází ke změně distribuce světelné energie a je třeba spočítat nové osvětlovací řešení. Klasická radiozitní metoda tedy není dynamická. Existuje ovšem řešení formou zjednodušení. Objekty jsou rozděleny na statické a dynamické (viz kapitola 3.2) a distribuce energie je řešena pouze mezi plochami statických objektů. Za ústupek snížení věrnosti vypočteného osvětlení lze tedy umožnit pohyb dynamických objektů a zajistit jejich stínování pomocí odhadu osvětlení v jejich umístění. Jak již bylo naznačeno, klasická radiozitní metoda silně závisí na složitosti scény a není tedy příliš dobře škálovatelná. Existují však metody, které nárůst výpočetní doby se složitostí scény zmírňují. Přesto však platí, že pro dosažení interaktivity u velmi komplexních scén radiozitní metody stále nestačí. Varianty Radiozitní metoda má několik variant, resp. aproximativních metod. Ty se obvykle liší zjišťováním relací mezi plochami, způsobem iterativního výpočtu řešení a podmínkou pro ukončení výpočtu. Dvě základní varianty si zde uvedeme. Klasická radiozita – popsána výše, vztahy ploch jsou vyjádřeny pomocí form faktorů (rovnice 3.7), řešením je soustava lineárních rovnic. Progressive radiosity – výpočet probíhá v krocích (viz obr. 3.2), během každého kroku je vypočtena další úroveň odrazu. Iterativní přístup umožňuje ukončení výpočtu po dosažení dostatečné úrovně vizuální kvality. Využití Radiozitní metody pracují s osvětlením na úrovni ploch. Detailnost osvětlení je tedy závislá na podrobnosti scény. Ve většině případů proto nedosahuje kvality získané pomocí jiných osvětlovacích metod, např. raytracingu. Výhodou je však rychlost a nezávislost na zobrazovací metodě. Díky iterativnímu způsobu výpočtu lze navíc snadno ovlivnit rychlost výpočtu a tím i jeho kvalitu. V praxi se ukazuje, že použitelných výsledků radiozitního osvětlení lze dosáhnout už po 4 až 6 iteracích. Klasické radiozitní metody slouží k výpočtu difuzní složky nepřímého osvětlení. Další efekty globálního osvětlení je tedy nutno simulovat jinými metodami, nicméně difuzní složka se ukazuje jako nejpodstatnější (blíže viz [15] a kapitola 4.1). Díky tzv. rozšířeným form faktorům (angl. extended form factors) lze však klasické difuzní odrazy rozšířit i o lesklé odrazy a lom světla. Detailnost takto vzniklých zrcadlových odrazů a lomů je však stále závislá na podrobnosti scény a je orientována ne na pixely, ale pouze na celé plochy. Osvětlení spočtené pomocí radiozitních metod lze zobrazit několika způsoby. Jedním z nich je využití některé z raytracingových metod. Při sledování paprsků je pak u každé plochy, na kterou paprsek dopadne, brána v potaz míra jejího nepřímého osvětlení spočtená pomocí radiozity. Tyto příspěvky pak tvoří výslednou intenzitu paprsku. Pro interaktivní aplikace je ovšem mnohem
18
KAPITOLA 3. VÝPOČET GLOBÁLNÍHO OSVĚTLENÍ
vhodnější zobrazení pomocí klasického vykreslování polygonů. V takovém případě je radiozitní osvětlení definováno pro každý vrchol polygonu a při jeho vykreslování je jeho hodnota aplikována.
3.5
Teoretické aproximace
Metody pro výpočet globálního osvětlení jsou obecně velmi časově náročné. Zavedením různých zjednodušení, ať už po stránce kvality nebo parametrů zobrazované scény, lze ovšem dosáhnout významného urychlení výpočtu. Následuje přehled několika metod, které globální osvětlení určitým způsobem aproximují a umožňují tak jeho výpočet v reálném čase. Instant Radiosity – ze zdroje přímého osvětlení jsou do scény vyslány paprsky a v místě jejich dopadu je umístěn bodový zdroj světla. Ten představuje zdroj nepřímého osvětlení. Zavedením těchto virtuálních zdrojů světla jsou simulovány difuzní odrazy. Umístěním nového virtuálního zdroje při každém odrazu paprsku lze simulovat odrazy vyšších řádů. Původní metoda [6] byla vylepšena v [8] zavedením pohybu zdroje světla a aktualizací příslušných virtuálních bodových zdrojů. Real-time implementace popsaná v [8] obsahuje komplexní statickou scénu s dynamickými objekty, jedním pohyblivým zdrojem světla a dosahuje interaktivní rychlosti zobrazení. Radiosity shooting – form faktory jsou nahrazeny vzorkováním hemisféry. Z plochy je vysláno několik paprsků a míra přenosu světelné energie je pak dána podílem paprsků, které byly zachyceny jinými plochami. Rovněž distribuce energie je zde řešena pomocí tzv. střílení radiozity [13] – z přímo osvětlených ploch je energie postupně distribuována mezi další a další plochy. Real-time řešení střílení radiozity je implementováno v systému Lightsprint1 . Přímé osvětlení je počítáno na GPU pomocí stínových map, nepřímé osvětlení je počítáno na CPU, pro středně komplexní scény dosahuje interaktivních rychlostí. Detaily nepřímého osvětlení závisí na podrobnosti scény. Photon Mapping – metoda založená na raytracingu, probíhá ve dvou krocích. Prvním je photon scatter – do scény jsou ze světelných zdrojů vystříleny fotony a uloženy do tzv. fotonové mapy. Druhým krokem je final gather – nepřímé osvětlení každého bodu je zjištěno vzorkováním hemisféry v daném bodě. Intenzita každého vzorkovacího paprsku je přitom určena příspěvky nejbližších fotonů ve fotonové mapě v místě, kam paprsek dopadl. [9] popisuje real-time implementaci na GPU. Distribuce fotonů a vytvoření fotonových map je nejprve provedeno na CPU, final gather pak probíhá na GPU. Využitím několika optimalizací dosahuje implementace [9] rychlosti zobrazení vyšší než 35 FPS, ve scéně je přitom rozmístěno 10k fotonů. Nevýhodou je omezený pohyb dynamických objektů – fotonové mapy jsou průběžně aktualizovány a při rychlém pohybu objektů hrozí zanechávání světelných stop.
3.6
Raytracing In Egoshooters
Jak bylo uvedeno výše, dva nejčastější způsoby výpočtu globálního osvětlení jsou radiozita a raytracing. Tato diplomová práce je zaměřena spíše na první uvedený způsob, který se zdá být pro aktuální stav hardwaru perspektivnější. Existují ovšem i interaktivní aplikace využívající druhý způsob – globální osvětlení pomocí raytracingu. Jednou ze zajímavých implementací je projekt Raytracing in Egoshooters [14]. Jedná se o soubor několika grafických aplikací a her založených na knihovně OpenRT2 . Tato knihovna tvoří 1 2
http://www.lightsprint.com http://www.openrt.de
KAPITOLA 3. VÝPOČET GLOBÁLNÍHO OSVĚTLENÍ
19
Obrázek 3.3: Raytracing in Egoshooters.
Obrázek 3.4: Oasen.
abstraktní vrstvu pro aplikace využívající raytracing, díky které lze výpočet zobrazované scény provádět na jednom či více paralelních CPU, popř. specializovaném hardwaru. Právě grafická jednotka specializovaná na raytracing je prvkem, který by mohl významným způsobem ovlivnit směr vývoje grafických karet. Jednou ze součástí projektu Raytracing in Egoshooters je zobrazovací systém hry Quake 3: Arena Demo společnosti id Software3 upravený pro rozhraní OpenRT. Výsledkem je zobrazení hry v reálném čase, včetně všech efektů, které raytracing nabízí – fyzikálně korektní odrazy a lomy světla, kaustiky, color-bleeding (viz obr. 3.3). Další součástí projektu je originální hra Oasen (viz obr. 3.4). Narozdíl od předchozí implementace se snaží plně využít potenciál raytracingu. Současný grafický hardware je omezen počtem a mírou detailů, které lze zobrazit. Pro zobrazení vzdálených objektů jsou proto používány zjednodušovací techniky (např. LOD – Level Of Detail). V případě raytracingu ovšem obdobná omezení kladena nejsou. Díky jeho pohledové závislosti je zpracovávána pouze ta část scény, která je skutečně viditelná. Všechny zobrazené objekty proto mohou byt zobrazeny bez jakéhokoliv zjednodušování. Hra je tvořena rozlehlou scénou, která obsahuje detailní model několika ostrovů a jejich okolí. Uvedené implementace dosahují výborné vizuální kvality, která je pro raytracing typická. Nevýhodou je však výpočetní výkon potřebný pro zajištění plynulého chodu aplikace. Dle [14] byly aplikace testovány na clusteru několika PC, tvořících virtuální CPU o výkonu 30 GHz. Výsledkem byl obraz o rozměrech 640x480 pixelů s rychlostí 5-20 FPS.
3
http://www.idsoftware.com
20
KAPITOLA 4. GLOBÁLNÍ OSVĚTLENÍ V PRAXI
4 Globální osvětlení v praxi V předchozí kapitole byly představeny nejpoužívanější metody pro výpočet globálního osvětlení. Uvedené metody sice podávají velmi kvalitní výsledky, časová náročnost jejich výpočtu ovšem zamezuje širšímu použití v praxi. V závěru předchozí kapitoly bylo představeno několik řešení, která výpočet globálního osvětlení v reálném čase umožňují. Většina těchto řešení však klade specifické požadavky na hardware nebo parametry zobrazované scény. Přesto existují způsoby, jak docílit realistického osvětlení i na běžném hardwaru. Řešením je odhad a zjednodušení osvětlení s ohledem na lidské vnímání, tzv. falšování (angl. fake). První část této kapitoly je věnována významu osvětlení pro lidské vnímání, druhá část pak osvětlovacím metodám, které těchto poznatků využívají.
4.1
Percepce
Osvětlení má obecně důležitou roli pro orientaci ve světě kolem nás. Důsledkem osvětlení je totiž vznik stínů a právě stíny lidskému vnímání usnadňují prostorové pochopení scény, které je pro orientaci v prostoru klíčové. Při zobrazování počítačově generovaných scén, které mají působit realistickým dojmem, je proto nezbytné klást důraz na způsob, jakým jsou předměty ve scéně osvětleny, resp. stínovány. Metody uvedené v předchozí kapitole se zaměřují na fyzikálně přesné výpočty osvětlení. Lidské vnímání však některé faktory zcela opomíjí a naopak se zaměřuje na jiné. Toho lze velmi dobře využít v mnoha oblastech. Pěkným příkladem je obecný princip MP3 komprese. Ta je založena na faktu, že adaptace lidského sluchu je zpožděná v doméně času i intenzity zvuku. Kvůli tomu člověk nevnímá slabý zvuk, je-li zároveň přítomen hlasitější zdroj zvuku. Obdobně po odeznění hlasitého zvuku člověk po určitou dobu nevnímá slabší zvuky, než se jeho sluch přizpůsobí nové úrovni. Toho lze využít pro kompresi zvuku způsobem, při kterém jsou neslyšitelné složky zvuku zcela vypuštěny. Obdobná specifika platí i pro lidský zrakový systém. Obecně známým jevem je postupná adaptace lidského zraku při přechodu ze silně osvětleného prostředí do tmy a naopak. Jednou z vlastností zrakového vnímání je ovšem i odlišný důraz kladený na jednotlivé složky osvětlení. V [15] je popsán experiment, jehož účelem bylo zjistit význam jednotlivých složek nepřímého osvětlení – difuzní, matné, lesklé a jejich kombinace. Autoři vytvořili sérii zobrazení několika scén s různou kombinací těchto složek. Kvalita těchto zobrazení pak byla subjektivně hodnocena několika dobrovolníky. Z výsledků vyplynulo, že největší podíl na zlepšení hodnocení měla přítomnost difuzní složky, méně složky lesklé a matné a jejich kombinace pak prakticky neměla vliv. Zároveň byla vypracována metrika, díky níž lze ze zastoupení jednotlivých složek v obraze určit odhad výsledné vizuální kvality. Cílem této metriky je určení významu jednotlivých složek pro danou scénu a tím pádem možnost optimálního rozložení výkonu věnovaného jejich výpočtu. Je-li pro zobrazení scény použit raytracing, lze míru zastoupení jednotlivých složek získat po jednom průchodu, který určuje přímé osvětlení a zároveň zjišťuje materiálové vlastnosti všech zobrazených objektů. Z výše uvedeného experimentu tedy můžeme vyvodit, že ve většině scén hraje významnou roli především difuzní nepřímé osvětlení. Toho je využito ve většině interaktivních aplikací a ostatní složky jsou buď nahrazeny odhadem nebo zcela vynechány. Některé z těchto metod jsou popsány v následující části.
4.2
Praktické aproximace
Jak bylo uvedeno v předchozích kapitolách, výpočet globálního osvětlení je časově náročnou záležitostí. V praxi (a v interaktivních aplikacích především) je proto globální osvětlení často
KAPITOLA 4. GLOBÁLNÍ OSVĚTLENÍ V PRAXI
21
aproximováno, popř. pouze napodobeno za účelem dosažení aspoň zhruba srovnatelného vizuálního výsledku. Některé z praktických aproximativních metod mají za sebou již dlouhou historii, některé jsou poměrně novou záležitostí – ať už díky výzkumu nových metod nebo vývoji výkonnějšího hardware. Pravděpodobně největším odbytištěm interaktivních aplikací, které požadují alespoň náznak realistické grafiky, je pole počítačových her. Zásadním požadavkem přitom je nutnost kompatibility s co nejširší škálou grafických karet – použité metody tedy musí být dostatečně obecné a flexibilní. Metody používané herními vývojáři se proto zajímavě odlišují. V následujících odstavcích si představíme několik základních metod pro aproximaci a napodobování globálního osvětlení. Kromě obecných postupů se zaměříme i na jejich implementace v několika konkrétních případech. Jako praktický příklad jsem vybral dva zobrazovací systémy použité v několika hrách z poslední doby, které významně přispěly ke zvednutí pomyslné laťky vizuální kvality počítačových her. Prvním z nich je SourceTM společnosti Valve Corporation1 , použitý např. v sérii Half-Life 2 (2004, 2006, 2007) a hrách Portal (2007) a Team Fortress 2 (2007). Druhým příkladem je r společnosti Crytek2 , použitý ve hře Crysis(2007). CryEngine 2 4.2.1
Ambientní osvětlení
Obrázek 4.1: Srovnání ambientního a globálního osvětlení. U ambientního osvětlení (horní řada) lze pozorovat určitou mělkost stínů, naopak stíny globálního osvětlení (dolní řada) jsou prokreslenější a dávají vyniknout prostorové organizaci scény.
Ambientní osvětlení je jednoduchá, ale ve velké části případů postačující metoda, kterou lze globální osvětlení aproximovat. Zatímco v reálném světě je intenzita stínů různá (podle míry 1 2
http://www.valvesoftware.com http://www.crytek.de
22
KAPITOLA 4. GLOBÁLNÍ OSVĚTLENÍ V PRAXI
dopadajícího nepřímého osvětlení), ambientní osvětlení přiděluje všem stínům stejnou intenzitu. V určitých typech scén a při určitém typu osvětlení totiž dochází ke zhruba rovnoměrné distribuci světla mezi plochami, důsledkem čehož jsou velmi malé rozdíly v intenzitě stínů. Ambientní osvětlení tyto rozdíly aproximuje a nastavuje všem zastíněným plochám stejnou intenzitu. Kromě této základní metody existuje několik jejích modifikací, které si dále popíšeme. Konstantní ambientní osvětlení Základní metoda ambientního osvětlení neřeší odrazy světla, ale nahrazuje je aproximativní konstantou. Metodu tedy označíme jako konstantní ambientní osvětlení. Základní zobrazovací rovnici 2.4 tedy můžeme s použitím konstantního ambientního osvětlení vyjádřit ve tvaru I = gve + gvM gve0 + gvea ,
(4.1)
kde ea je hodnota určující ambientní osvětlení dané scény. Oproti původnímu znění rovnice 2.4 byly zcela vypuštěny členy určující odrazy vyšších řádů. Ambientní osvětlení totiž slouží jako aproximace nepřímého osvětlení, proto ambientní člen nahrazuje členy nepřímého osvětlení. Z příspěvků daných světelnými zdroji zůstává pouze člen gvM gve0 , který představuje přímé osvětlení (viz rovnice 2.9). Díky své jednoduchosti nevyžaduje použití konstantního ambientního osvětlení prakticky žádný výpočet ani speciální zobrazovací postup. Konstanta určující hodnotu ambientního osvětlení je obvykle empiricky nastavena pro konkrétní scénu, zobrazení pak probíhá jednoduchým přičtením této konstanty k intenzitě přímého osvětlení. Konstantní ambientní osvětlení nebere v potaz pozici světelných zdrojů a působí proto dojmem světla, které je rozptýlené, všudypřítomné (odtud název ambientní). Ze své podstaty nezachovává detaily a není proto vhodné pro oblasti se skokovou změnou osvětlení. Ambientní osvětlení lze s úspěchem použít u scén, které jsou z velké části osvětleny silným zdrojem přímého osvětlení. Intenzita přímého osvětlení je ve většině případů výrazně vyšší než intenzita nepřímého osvětlení. Je-li tedy ve scéně přítomen velmi silný zdroj přímého osvětlení, snadno dojde k překrytí odraženého světla a zahlazení jeho účinku. Dobrým příkladem je např. exteriér ozářený sluncem, ve kterém je lidský zrak přizpůsoben silnému přímému osvětlení a není tak schopen rozlišit jemné rozdíly v intenzitě stínů. Exteriéry obvykle splňují i další podmínku, která vyhovuje použití ambientního osvětlení. V otevřených scénách se většinou nevyskytují dostatečně členité prostory, ve kterých by mohlo docházet k pozorovatelným odrazům světla a tím i viditelně nerovnoměrnému nepřímému osvětlení. Díky tomu lze ambientní osvětlení s úspěchem použít pro většinu otevřených exteriérů, aniž by zde nepřímé osvětlení viditelně chybělo. U interiérů je však situace téměř opačná. Díky jejich obvyklé členitosti dochází k mnohanásobným odrazům světla a při osvětlení členitých prostor je rozdíl mezi ambientním a globálním osvětlením vidět na první pohled (viz obr. 4.1). Pro interiéry nebo členitější prostory je proto vhodná některá z pokročilejších modifikací ambientního osvětlení, popř. zcela jiná metoda falšování. Ambient Cube Pro nepřímé osvětlování dynamických objektů používá Source metodu označovanou jako Ambient Cube [11] (dále jen AC). Ambientní osvětlení zde není definováno pouze jednou hodnotou, ale šesti hodnotami. Každá z hodnot představuje intenzitu nepřímého osvětlení přicházející k objektu z jednoho ze šesti směrů. Ty jsou určeny kladným i záporným směrem souřadnicových os x, y a z. Můžeme
KAPITOLA 4. GLOBÁLNÍ OSVĚTLENÍ V PRAXI
23
si tedy představit, že je objekt osvětlen pomocí kubické mapy okolního prostředí (viz kapitola 3.2) nebo pro zjednodušení, že je osvětlen šesti bodovými zdroji. Po úpravě základní zobrazovací rovnice 2.1 získáme vztah 0
0
0
0
Z
0
I(x, x ) = g(x, x )v(x, x ) e(x, x ) +
00
0
00
00
0
ρ(x, x , x )I(x , x )dx + eac (x, x ) ,
(4.2)
S
kde eac (x, x0 ) určuje aproximaci hodnoty ve směru x → x0 získané z AC. Šest hodnot určujících AC je přitom předpočítáno a během vyčíslování eac dochází pouze k jejich interpolaci. Výpočet hodnot AC pro každý dynamický objekt zvlášť by byl časově náročný, Source proto používá zjednodušení. Tvůrce scény definuje několik bodů, pro které jsou hodnoty AC předpočítány. Během zobrazení scény jsou pak dynamické objekty osvětleny pomocí toho AC bodu, který je k nim právě nejblíže. eac tedy interpoluje hodnoty AC bodu s minimální vzdálenosti k x0 . Výpočet ea má v tom případě konstantní složitost, interpolace hodnot nezahrnuje žádné integrální členy. Při přechodu mezi sférami vlivu dvou AC bodů by docházelo ke skokové změně osvětlení. V Source je proto hodnota získaná z eac interpolována v čase a k její změně díky tomu dochází plynuleji. Praktická aproximace rovnice 4.2 má pak v operátorovém tvaru podobu I = gve + gvM gve0 + gveac , kde člen gve určuje vlastní vyzařování plochy, gvM gve0 tvoří přímé osvětlení a gveac definuje AC příspěvek. Člen ea z rovnice 4.1 je zde nahrazen členem eac , který je narozdíl od konstantního ambientu závislý na pozici. Díky této závislosti lze alespoň částečně simulovat vliv nepřímého osvětlení na pohyblivé dynamické objekty. 4.2.2
Světelné mapy
Technika světelných map (angl. light maps, LM) je založena na podobném principu jako běžný texturovací proces. Během něj je v texturovací paměti uložen obraz vzorku materiálu (např. zeď, tráva, oblečení), který je mapován na objekt. V případě světelných map je ale namísto vzorku materiálu v textuře uloženo osvětlení objektu. To je pak mapováno na objekt obdobně jako textura a použije se pro zesvětlení nebo ztmavení povrchu objektu. Světelné mapy jsou obvykle kombinovány s texturami a dalšími stínovacími technikami. Základní zobrazovací rovnice 2.1 s využitím světlených map bude mít tvar
I(x, x0 ) = g(x, x0 )v(x, x0 ) e(x, x0 ) +
Z S
ρ(x, x0 , x00 )I(x0 , x00 )dx00 + elm (x0 ) ,
(4.3)
kde elm (x0 ) je funkce vyjadřující intenzitu světelné mapy v bodě x0 . Vzhledem ke svému difuznímu charakteru není elm závislá na směru a jediným parametrem je tedy pozice bodu ve světelné mapě. Pro urychlení jsou světelné mapy předpočítány a uloženy ve formě textur pomocí některého z grafických či modelovacích editorů. K jejich výpočtu je obvykle použita některá z metod založených na radiozitě nebo raytracingu. Díky tomu probíhá vyhodnocení elm (x0 ) rovněž v konstantním čase a praktickou aproximaci rovnice 4.3 pak můžeme zapsat ve tvaru I = gve + gvelm + gvM gve0 . Znatelnou nevýhodou světelných map je jejich statický charakter. Hodnoty osvětlení jsou předpočítány pro konkrétní rozmístění a nastavení světel ve scéně. Pokud by tedy došlo ke změně jejich pozice či barvy, bylo by nutné celou světelnou mapu předpočítat. Světelné mapy obsahující
24
KAPITOLA 4. GLOBÁLNÍ OSVĚTLENÍ V PRAXI
nepřímé osvětlení jsou proto předpočítány pouze pro statické světelné zdroje. V průběhu zobrazení je k nim poté přičteno přímé osvětlení statických a dynamických (pohyblivých) zdrojů. Výsledné osvětlení pak lze popsat vztahem I = gve + gvM gves + gvelm + gvM gved , kde gve je světlo emitované plochou, gvM gves je přímé osvětlení statických zdrojů, gvelm je nepřímé osvětlení statických zdrojů a gvM gved je přímé osvětlení dynamických zdrojů světla. Jak je evidentní, nepřímé osvětlení dynamických zdrojů je v takovém případě vypuštěno. Pomocí světelných map jsou obvykle osvětlovány pouze statické objekty. Předpočtené osvětlení totiž závisí jak na parametrech světelných zdrojů, tak na geometrii a pozici objektů ve scéně. Pokud by během hry došlo k pohybu některého z objektů, bylo by opět nutné světelné mapy přepočítat. Dynamické objekty jsou tedy z výpočtu světelných map vypuštěny a pro jejich nepřímé osvětlení jsou většinou použity jiné techniky. Ambient Term Jedním z mála případů, kdy lze světelné mapy využít i pro osvětlení dynamických objektů, je tzv. Ambient Term [10] (ambientní člen). Tato technika byla použita např. ve hře Quake III (id Software, 1999) pro osvětlení postav hráčů. Během pohybu ve scéně je celé postavě přiřazováno konstantní ambientní osvětlení podle toho, jakou intenzitu má světelná mapa v místě, kde právě postava stojí. Zobrazovací rovnice pak využívá vztah pro světelné mapy 4.3 ve tvaru 0
0
0
0
Z
I(x, x ) = g(x, x )v(x, x ) e(x, x ) + S
0
00
0
00
00
0
ρ(x, x , x )I(x , x )dx + elm (fp (x )) ,
(4.4)
kde fp (x0 ) provádí projekci bodu x0 do příslušné světelné mapy. Metoda je tedy v podstatě jednodušší verzí Ambient Cube – zohledňuje pozici objektu ve scéně a příslušné nepřímé osvětlení, výsledná hodnota má ale pouze formu konstantního ambientu. Radiosity Normal Mapping Do světelných map je obvykle uložena hodnota osvětlení, která na každou plochu dopadá kolmo (tzn. ve směru normály povrchu). V důsledku toho nejsou zachyceny slabší odstíny nepřímého osvětlení, které mohou dopadat pod nižším úhlem. Source proto používá vylepšenou verzi světelných map.
Obrázek 4.2: Radiosity Normal Mapping – pro každý ze tří bázových vektorů je vytvořena jedna světelná mapa. Výsledné osvětlení je pak dáno kombinací těchto map s normálou povrchu.
Namísto jedné stínové mapy jsou vytvořeny tři, každá z nich určuje osvětlení přijaté plochou v jednom ze tří směrů daných bázovými vektory (viz 4.2). Výsledné osvětlení vzniká jejich
KAPITOLA 4. GLOBÁLNÍ OSVĚTLENÍ V PRAXI
25
Obrázek 4.3: Ambient Occlusion
kombinací (viz [10]). Pro stínování jednotlivých bodů povrchu navíc není použita normála plochy, na které bod leží, ale hodnota uložená ve speciální textuře (tzv. normal mapping). Tímto způsobem je obvykle simulována nerovnost povrchů. CryEngine2 měl podle původního návrhu používat podobnou techniku se dvěma rozdíly – světelné mapy nebyly počítány radiozitou, ale pomocí fotonových map (viz 3.3), a místo tří bázových vektorů byly použity čtyři. Z důvodů paměťové náročnosti vytvořených map však CryTek od světelných map upustil a CryEngine 2 využívá Ambient Occlusion mapy, kterým je věnována následující část. 4.2.3
Ambient Occlusion
Technika označovaná jako Ambient Occlusion (dále jen AO) je v podstatě speciálním případem ambientního osvětlení, jehož cílem je simulovat nepřímé osvětlení. Jeho hodnota však není konstantní, ani určena světelnou mapou spočtenou pomocí radiozity. Základní princip spočívá v myšlence, že snadno přístupné (exponované) plochy jsou osvětleny více než plochy zastíněné. Pro každý bod nebo vrchol scény je spočteno, jak velká část okolního prostředí je z jeho pozice viditelná (viz obr. 4.3). Podle [16] můžeme výpočet charakterizovat vztahem 1 Ap = π
Z
V (p, ω)(N · ω)dω,
Ω
kde Ap je hodnota AO v bodě p (viz obr. 4.3), N je normála v bodě p a V (p, ω) je viditelnost bodu p ve směru ω. Integrace přitom probíhá přes všechny směry ω hemisféry Ω. Jedním ze způsobů praktického výpočtu je vyslání několika paprsků a určení, jaká část jich nebyla ničím zastíněna. Tato míra pak přímo určuje hodnotu AO. Zcela viditelné části modelu budou v tomto případě plně osvětlené, zatímco části s nižší viditelností budou ve stínu (viz obr. 4.4). Uvedený postup je samozřejmě vzhledem k nutnosti vysílání velkého množství paprsků časově náročný. Protože je však geometrie objektů zpravidla statická (objekty nejsou deformovatelné), nedochází ke změnám viditelnosti a AO stačí spočítat pro každý objekt pouze jednou. Narozdíl od přístupů, jejichž řešení je založeno na metodě konečných prvků, má AO spíše gradientní charakter. Zobrazené nepřímé osvětlení díky tomu působí plynulejším dojmem a nedochází u něj k viditelným skokovým změnám, jako např. u radiozitních metod (viz kapitola 3.4). Ač není tato technika fyzikálně korektní, její zobrazení je rychlé a podává překvapivě dobré výsledky. Navíc je poměrně flexibilní – AO viditelnost lze předpočítat jak ve formě hodnot jednotlivých vrcholů polygonu, tak pro každý bod povrchu ve formě textury. Díky tomu lze AO snadno použít jak pro statické, tak pro dynamické objekty.
26
KAPITOLA 4. GLOBÁLNÍ OSVĚTLENÍ V PRAXI
Obrázek 4.4: Ambient Occlusion – AO mapa (vlevo), scéna s klasickým AO (uprostřed), ScreenSpace AO (vpravo)
Real-Time Ambient Map CryEngine 2 používá metodu nazvanou Real-Time Ambient Map (viz [12]). Ta je založena na AO mapách uložených ve formě textur. Tyto textury jsou mapovány na objekt a pro každý bod povrchu určují, jak velká část příchozího světla na objekt skutečně dopadne.
Screen-Space Ambient Occlusion Během zobrazování přímého osvětlení je do tzv. Z-bufferu ukládána výsledná hloubka jednotlivých pixelů. Toho využívá metoda nazvaná Screen-Space Ambient Occlusion (viz [12]) vyvinutá společnosti CryTek. Princip spočívá v testování hloubky okolních pixelů vůči aktuálně zpracovávanému pixelu v paměti Z-bufferu. Z rozdílu těchto hloubek je následně určena míra viditelnosti jednotlivých pixelů. Pixely s vyšší hloubkou obklopené pixely s nižší hloubkou v tomto případě představují prohlubně a mají proto nižší viditelnost. Podobným způsobem je zjišťována viditelnost i u klasické AO, zde však nedochází k testování paprsků v trojrozměrném prostoru, ale pouze k porovnávání hodnot pixelů v textuře. To je samozřejmě výrazně rychlejší, protože k podobným operacím je přizpůsobena většina GPU a celý proces tak lze výrazně urychlit. Metoda v podstatě funguje jako postprodukční filtr. Ze Z-bufferu je vytvořena AO mapa (viz obr. 4.4) a ta je následně aplikována na původní obraz. I přes svou jednoduchost podává metoda ve výrazně kratším čase výsledky kvalitativně srovnatelné s klasickým AO. Je ovšem nutno podotknout, že je pohledově závislá a nelze ji tedy použít pro obecný výpočet AO.
4.2.4
Další způsoby
Kromě výše uvedených postupů, které určitým způsobem aproximují a napodobují původní osvětlení, existují i metody určené k jeho subjektivním úpravám. Jednou z nich je tzv. Half Lambert používaný systémem Source. Míra difuzního osvětlení povrchu zdrojem přímého osvětlení je obvykle dána orientací plochy ke světlu, resp. jako skalární součin normály plochy a směru ke zdroji. Výsledkem je hodnota v intervalu -1 až 1, označovaná jako Lambertovský člen. Uvedený postup sice zajišťuje fyzikálně korektní stínování, důsledkem ale může být přílišný kontrast a tím pádem ztráta detailů ve stínech. Source proto Lambertovský člen upravuje tak, aby jeho výsledek ležel v intervalu 0 až 1. Výsledkem jsou vizuálně atraktivnější prokreslené stíny. Dalším obvyklou metodou pro změnu světelnosti scény je finální úprava jejího barevného prostoru. V Source je tato funkce nazývána Color Correction, resp. Grading (podle obdobné techniky používané ve filmové postprodukci). Díky ní lze provádět např. saturaci barev nebo simulovat denní dobu změnou barvy a intenzity obrazu.
KAPITOLA 4. GLOBÁLNÍ OSVĚTLENÍ V PRAXI
4.3
27
Srovnání osvětlovacích metod
V předchozích kapitolách 2 a 3 byly popsány základní i pokročilé osvětlovací metody. Obr. 4.5 uvádí jejich souhrn a nabízí tak snadné srovnání jejich kvality s některými aproximativními metodami uvedenými v této kapitole. Je ovšem nutno podotknout, že uvedený souhrn žádným způsobem nezohledňuje časovou náročnost ukázaných metod, která je pro interaktivní aplikace klíčová.
Obrázek 4.5: Srovnání osvětlovacích metod – horní řada: lokální stínování, přímé osvětlení (s vrženými stíny), klasický raytracing. Dolní řada: ambient occlusion, radiozita, photon mapping (s final gather).
28
KAPITOLA 5. NÁVRH HRY
5 Návrh hry V předchozích kapitolách byly popsány metody pro výpočet globálního osvětlení a jejich modifikace používané v praxi. Výsledky jejich praktického využití ukazuje hra, jejíž vytvoření bylo cílem této práce. V následující části jsou tedy popsány její cíle a navržena forma a provedení hry. Následuje nástin jejího scénáře, shrnutí popisovaných osvětlovacích metod a volba vhodné metody pro zobrazení globálního osvětlení. V závěru je pak diskutována možnost nových konceptů herní mechaniky, které dynamické globální osvětlení přináší.
5.1
Cíle a forma
Cílem navrhované hry je jednoduchou formou seznámit laického uživatele s výhodami globálního osvětlení. Díky interaktivním prvkům má mít uživatel možnost měnit parametry zobrazovaného osvětlení a pozorovat důsledky těchto změn. Triviálním řešením by bylo naprogramovat jednoduchou scénu s globálním osvětlením a tu dát uživateli k dispozici. Částečně je takto definováno i zadání. Dle mého názoru ale tento přístup vzhledem k výukové povaze hry nestačí. Uživatel, resp. hráč by v takovém případě neměl žádnou motivaci ani informace o tom, co vlastně vidí. Proto jsem se rozhodl přidat do hry určitou vodící linku ve formě scénáře, resp. příběhu hry, kterým hráč prochází a během kterého plní zadané úkoly.
5.2
Provedení
Hra má lineární průběh. Nejprve jsou ukázány základní osvětlovací metody, postupně se hráč dostává k těm pokročilejším. Scéna je přitom uzpůsobena tak, aby dala co nejlépe vyniknout předváděným aspektům globálního osvětlení, resp. jeho výhodám oproti přímému osvětlení. Hráč ovládá hlavní postavu, která prochází scénou a plní zadané úkoly. Zadání úkolů a význam osvětlovacích metod se přitom dozvídá formou dialogu s jednou z dalších postav. Herní svět obsahuje statickou scénu a v ní dynamické objekty, se kterými může hráč manipulovat. Ovládání je řešeno pomocí klávesnice a myši, pro doplnění atmosféry je použita i hudba a zvuky.
5.3
Scénář
Hráčem ovládaná postava prochází jednoduchým lineárním dějem, během kterého se hráč dozvídá nové informace o osvětlení. Vzhled scény je přitom navržen tak, aby co nejlépe ilustroval nedostatky klasického přímého či ambientního osvětlení a nabídl možnost srovnání s globálním osvětlením. Scénář je sestaven tak, aby byla mezi vysvětlovanými metodami logická návaznost a složitost úkolů měla rostoucí tendenci. Nejprve jsou tedy ukázány základní efekty jako skládání barevného spektra, ambientní osvětlení, dále pak nepřímé osvětlení, color-bleeding a osvětlení dynamických objektů. Na začátku hry se hlavní postava objevuje v ponuře osvětlené scéně, která připomíná katedrálu (viz obr. 5.1). Jediným zdrojem světla je paprsek světla pronikající otvorem ve stropě. Hlavní hrdina (světluška) se zde setkává s neznámým hlasem, který mu dává rady a napovídá, jak postoupit dále. První úkol spočívá v nastavení konkrétní barvy světla a jeho nasměrování na konkrétní objekt. Na podlaze katedrály totiž leží šest kostek, každá z nich je položena na barevném poli s jinou barvou. Cílem hráče je osvítit každou kostku světlem, které má barvu jejího pole. Barvu světla hráč mění pomocí barevných filtrů, které jsou umístěny před zdrojem světla. Jejich vysouvání,
KAPITOLA 5. NÁVRH HRY
29
Obrázek 5.1: Obrázky ze hry
resp. zasouvání přitom ovládá pomocí trojice pák. Dvojicí dalších pák zároveň ovládá směr světelného paprsku. Během plnění tohoto úkolu je však hráč přerušen ve svém snažení – skrze stropní okno totiž prolétne meteorit a rozbije barevné filtry. Hráč proto nemůže úkol dokončit. Dopad meteoritu ovšem rozbije jedny z dveří, které byly dosud zamčené. Hráč se proto vydává prozkoumat novou místnost a nachází zde páku, kterou může ovládat osvětlení v celé katedrále. Vypravěč ho poučí, že se jedná o ovládání ambientního osvětlení (viz kapitola 4.2.1). Kromě toho zde hráč nalézá GI1 stroj, který ve scéně aktivuje globální osvětlení. Po aktivaci GI stroje začne ve scéně fungovat globální osvětlení a tím pádem i color-bleeding (viz kapitola 2.5). Hráč zjišťuje, že pomocí tohoto efektu může měnit barvu světla jeho odrazem od barevného povrchu. Proto využije barevných panelů na stěnách, na které směruje světelný paprsek, a dokončí zadaný úkol.
5.4
Aspekty globálního osvětlení
Hlavním cílem hry je poskytnutí prostředku pro vizuální srovnání klasických osvětlovacích metod a globálního osvětlení. Důraz je přitom kladen na představení a vysvětlení nejvýznam- nějších aspektů dynamického globálního osvětlení. Mezi ně patří nepřímé osvětlení a color-bleeding, pohyblivé zdroje světla, dynamické objekty a volitelná rychlost a kvalita. Nepřímé osvětlení a color-bleeding Nepřímé osvětlení je hlavní výhodou globálního osvětlení (viz kapitolu 2.4). V praxi je většinou nahrazováno stíny s konstantní intenzitou – tzv. ambientním osvětlením (viz kapitolu 4.2.1). To je ovšem vhodné pouze pro určité typy scén a jeho hodnota je určována empiricky. Efekt označovaný jako color-bleeding byl popsán v kapitole 2.5. Lze jej pozorovat při odrazech světla od barevných materiálů, kdy dochází ke změně barevnosti nepřímého osvětlení. V interaktivních aplikacích dosud není tento efekt ve větší míře podporován, tím spíše na běžně dostupném hardware. Pohyblivé zdroje světla Nepřímé osvětlení a color-bleeding jsou nejlépe pozorovatelné při dynamické změně osvětlení způsobené pohybem světelného zdroje. Většina interaktivních aplikací sice pohyb světelných zdrojů umožňuje, jejich pohyb má ale ve většině případů vliv pouze na přímé osvětlení (viz kapitolu 2.4.1). Nepřímé osvětlení tak zůstává neměnné, popř. je v blízkosti přímého zdroje 1
Global Illumination - globální osvětlení
30
KAPITOLA 5. NÁVRH HRY
vyrušeno. Interaktivní globální osvětlení naopak plně reflektuje pohyby světelných zdrojů a nepřímé osvětlení podle nich průběžně aktualizuje. Dynamické objekty Jednoduchého osvětlení dynamických (pohyblivých) objektů lze dosáhnout pomocí lokálních osvětlovacích metod (viz kapitola 2.3). Ty však berou v potaz pouze přímé osvětlení. Naopak s využitím globálního osvětlení lze i na pohyblivých objektech zobrazit dopadající nepřímé osvětlení určené pozicí objektu ve scéně. Volitelná rychlost a kvalita Metody pro výpočet globálního osvětlení jsou zpravidla výpočetně náročné. Většina jich však funguje na iterativním principu postupného zlepšování, a díky tomu lze výpočet ukončit, jakmile je vypočtené osvětlení vizuálně dostatečně věrohodné. Tímto způsobem lze výpočet výrazně urychlit a přiblížit se tak rychlosti běžných zobrazovacích metod.
5.5
Volba RTGI metody
V předchozích kapitolách byly popsány některé metody pro zobrazování globálního osvětlení. Dvě hlavní skupiny metod jsou raytracing a radiozita. Pokusíme se nyní určit, která z nich je v našem případě vhodnější pro real-time výpočet globálního osvětlení (dále jen RTGI2 ). Tato metoda pak bude použita ve výsledné počítačové hře s globálním osvětlením. Raytracing Metody využívající raytracing (sledování paprsku, viz kapitola 3.3) podávají obecně kvalitnější výsledky, jejich výpočet je však časově mnohem náročnější. Přesto existují implementace, které využívají princip sledování paprsku a jsou schopné fungovat v reálném čase (viz kapitolu 3.5). Většina z nich využívá principu zjednodušení a přenesení výpočtu na GPU, díky čemuž lze dosáhnout rychlosti umožňující interakci. Raytracing není u interaktivních aplikací dosud běžně využíván, jednou z příčin je zatím neexistující podpora raytracingu na grafickém hardwaru. Radiozita Výpočet radiozity (viz kapitola 3.4) je pro malé scény obecně mnohem rychlejší než raytracing, problémem je ovšem horší škálovatelnost. Proto existují radiozitní metody, které s využitím několika optimalizací výpočet zjednodušují a tím i urychlují (viz kapitolu 3.5). Jednou z nejperspektivnějších se jeví stochastická radiozitní metoda, pomocí které lze získat dostatečně věrohodné globální osvětlení v reálném čase. Globální osvětlení vypočtené pomocí radiozitních metod lze poměrně snadno začlenit do existujících zobrazovacích řešení. Díky tomu je možné pro zobrazení použít jak kvalitnější raytracingové metody, tak běžně používané polygonové vykreslování. Diskuze Jak je vidět z několika ukázek v části 3.5, v případě raytracingu i radiozity již existují metody, pomocí kterých lze interaktivního globálního osvětlení dosáhnout. V případě počítačových her jsou ovšem klíčovým prvkem parametry požadovaného hardware. Zatímco interaktivní metody využívající raytracing vyžadují specializované grafické zařízení, popř. dostatečný výkon, radiozitním metodám postačují běžně dostupné grafické karty za cenu nižší kvality. 2
Real-time Global Illumination
KAPITOLA 5. NÁVRH HRY
31
Pro výslednou hru se tedy perspektivnějším ukazuje využití radiozity, konkrétně její stochastické varianty. Ta je ve hře kombinována s několika metodami, které globální osvětlení falšují.
5.6
Nové herní koncepty
Globální osvětlení přináší do interaktivních aplikací (zde konkrétně počítačových her) nejen zlepšení vizuální kvality, ale i nové možnosti týkající se jejich konceptuální náplně. Osvětlení hraje ve většině her čistě pasivní úlohu, resp. je využito pouze jako prvek dokreslující atmosféru zobrazované scény. Může docházet k jeho změnám pro zvýraznění dynamického efektu, ale jeho přítomnost nemá na hráčovy akce žádný vliv a naopak. Některé hry však osvětlení částečně využívají jako nástroj pro interakci hráče s prostředím. Hráčem ovládaná postava se může skrýt do stínu (Thief3 ), popř. provádět některé akce pouze na přímém slunečním světle (Shadow of the Colossus4 ). Koncept světla jako nástroje pro interakci s prostředím jsem se rozhodl využít při návrhu hry s globálním osvětlením a dále jej rozvést. Dynamické globální osvětlení přináší několik technik, které mohou zajímavě přispět k obohacení herní mechaniky. Jedná se o dynamické světelné zdroje a vlastnosti materiálů. Pohyb světelných zdrojů Současný pohyb více světelných zdrojů je v dnešních podmínkách technicky realizovatelný, zřídka je však kromě přímého osvětlení řešeno i dynamické nepřímé osvětlení. Radiozitní metoda není omezena počtem světelných zdrojů, výpočet je totiž orientován na plochy, nikoliv konkrétní zdroje světla. Při pohybu většího počtu světel dochází ke změně intenzity osvětlení v různých částech scény. Změny se týkají jak přímého, tak nepřímého osvětlení. Oblasti osvětlené přímým osvětlení jsou přímo viditelné ze světelných zdrojů a naopak. Z nepřímo osvětlených oblastí neexistuje přímý dohled na světelný zdroj. Příkladem využitím nepřímého osvětlení tedy může být následující scénář: hráč musí projít určitou trasu ve scéně, ale nesmí být při tom "spatřen" žádným ze světelných zdrojů (tedy nesmí být v přímo osvětlené oblasti). Zdroje světla se volně pohybují scénou a osvětlují ji. Hráč se musí zároveň vyhýbat tmavým koutům. Jeho úkolem tedy je držet se v polostínu, který je způsoben právě nepřímým osvětlením. Intenzita osvětlení se ovšem mění podle pohybu světelných zdrojů, hráč tedy musí svůj průchod scénou s rozmyslem plánovat. Změna osvětlení a materiálů Jednou z výhod radiozitní metody je i dynamická změna vlastností materiálů a světelných zdrojů. Světelné zdroje mohou měnit kromě polohy i svou intenzitu, materiály objektů mohou dynamicky měnit barvu a odrazivé vlastnosti. I tento prvek lze dobře zapojit do herní mechaniky. Hráč např. může interagovat s herními objekty podle jejich aktuální barvy, popř. podle barvy světla, které na ně dopadá. Obdobnou herní mechaniku je možné napodobit pomocí předem naprogramovaných událostí, které reagují na akce uživatele. S využitím globálního osvětlení lze ovšem funkčnost zajistit dynamickým výpočtem bez nutnosti předchozího statického programování.
3 4
Thief: The Dark Project. Looking Glass Studios, 1998. Shadow of the Colossus. Sony Computer Entertainment, 2005.
32
KAPITOLA 6. IMPLEMENTACE HRY
6 Implementace hry Hra je implementována v jazyce C++ a využívá několika hotových knihoven (tzv. frameworků). Jejich bližší popis je uveden v první části této kapitoly. Dále následuje popis struktury herní aplikace, resp. jejího objektového modelu, a jednotlivých funkčních bloků. V závěru kapitoly je popsán vnitřní skriptovací jazyk, kterým je řízen průběh celé hry.
6.1
Použité knihovny
Kromě vlastního kódu využívá hra několika externích knihoven (viz obr. 6.1). Ze zadání vyplývá volba dvou hlavních knihoven – těmi jsou OGRE3D pro zobrazení grafiky a Lightsprint pro výpočet nepřímého osvětlení. Jejich vzájemná integrace je zajištěna knihovnou OgreLightsprint, kterou jsem vytvořil v rámci předmětu X36PMI (Individuální projekt). Další knihovny zajišťují přehrávání zvuku, ovládání pomocí vstupních zařízení a zobrazování uživatelského rozhraní. Pro tvorbu veškerých modelů jsem použil modelovací program Blender.
Obrázek 6.1: Schéma propojení hry s externími knihovnami.
OGRE3D OGRE1 (Object-Oriented Graphics Rendering Engine) je objektově orientovaný 3D zobrazovací systém. Jeho hlavním účelem je poskytnout vývojářům intuitivní a flexibilní nástroj pro tvorbu aplikací využívajících hardwarově urychlovanou grafiku. Jednou z výhod je nezávislost na konkrétním zobrazovacím systému. Veškeré operace jsou prováděny na abstraktním zobrazovacím systému, ten pak může být implementován pomocí rozhraní DirectX nebo OpenGL. Důsledkem je zajištění snadné přenositelnosti aplikace mezi systémy. Kromě propracovaného grafu scény je nejvýznamnější schopností systému OGRE patrně jeho definice materiálů. Pomocí jednoduchého skriptovacího jazyka lze skládat víceprůchodové řetězce s použitím shader programů. Takto získané průchody pak lze libovolně kombinovat. Toho lze velmi dobře využít při skládání několika typů osvětlení. OGRE je vyvíjen jako open-source knihovna a ve své třídě patří k jednomu z nejpoužívanějších řešení. Narozdíl od dalších grafických systémů ovšem přímo nezajišťuje další aplikační prvky, jakými jsou např. fyzikální simulace, práce se zvukem nebo komunikace se vstupními zařízeními. Tyto funkce jsou proto zajišťovány pomocí tzv. plug-inů (zásuvných modulů) nebo integrací externích knihoven. 1
http://www.ogre3d.org
KAPITOLA 6. IMPLEMENTACE HRY
33
Lightsprint Lightsprint2 (dříve Lightsprint Vision) je knihovna pro výpočet globálního osvětlení. Mezi její hlavní výhody patří výpočet fyzikálně korektního globálního osvětlení. Další podporované funkce jsou např. zobrazení měkkých stínů, výpočet Ambient Occlusion a import široké škály modelů. Jeho součástí je i zobrazovací systém implementovaný v OpenGL, který zajišťuje vykreslování veškerých výše uvedených funkcí. Při integraci s OGRE ovšem není tento zobrazovací systém využit, protože OGRE obsahuje vlastní definici abstraktního zobrazovacího řetězce. Lightsprint je varianta knihovny, která provádí výpočet nepřímého osvětlení v reálném čase. Díky tomu je vhodná pro použití v interaktivních aplikacích, např. počítačových hrách. FMOD Ex FMOD Ex3 je knihovna pro práci se zvukovým systémem. Podporována jsou všechna běžně používaná zařízení i zvukové formáty (MP3, WAV, OGG). Díky jednoduchému programovému rozhraní lze knihovnu snadno zakomponovat do hotových projektů. Zajímavostí je podpora nejen PC systémů, ale i platforem typu Playstation2, Microsoft Xbox nebo Nintendo Wii. OIS OIS4 (Object-Oriented Input System) je knihovna pro správu vstupních zařízení. Podporuje vstup z klávesnice, myši nebo joysticku, ale i forcefeedback zařízení. Výhodou knihovny je jednoduché rozhraní a snadná integrace. Pro systém OGRE existuje OIS plug-in, pomocí kterého lze snadno nahradit funkce celé OIS knihovny. CEGUI CEGUI5 (Crazy Eddie’s GUI System) je systém pro zobrazování uživatelských rozhraní (Graphical User Interface – GUI). Rozhraní je tvořeno samostatnými grafickými prvky, které lze hierarchicky vnořovat. Systém přitom automaticky řeší jejich rozmístění a zarovnávání. CEGUI je rovněž k dispozici jako jeden z plug-inů pro OGRE. Díky tomu lze pro grafické prvky využít definice materiálů z OGRE. Blender Blender6 je grafický modelovací 3D systém. Jedná se o open-source projekt se širokou členskou základnou. Zajímavostí je, že pomocí něj bylo vytvořeno několik nezávislých animovaných filmů. Kromě modelování umožňuje Blender i zobrazování scén pomocí raytracingu a radiozitních metod. Jednou z funkcí je i tvorba světelných map. Pomocí exportního plug-inu dodávaného s OGRE lze Blender modely snadno převést na .mesh formát podporovaný knihovnou OGRE. Veškeré modely vyskytující se ve hře jsem vytvořil právě tímto způsobem.
6.2
Struktura
Herní aplikace je rozdělena do několika funkčních bloků (viz obr. 6.2) tvořících hierarchickou strukturu. Každý blok plní specifickou funkci, jejich popis je uveden v následující části. 2
http://www.lightsprint.com http://www.fmod.org 4 http://sourceforge.net/projects/wgois 5 http://www.cegui.org.uk 6 http://www.blender.org 3
34
KAPITOLA 6. IMPLEMENTACE HRY
Obrázek 6.2: Objektový model herní aplikace. Světle vyznačené objekty představují vnitřní funkční bloky, čárkovaně orámované jsou předávané zprávy a tmavě označené jsou externí knihovny.
6.2.1
GameApplication
Jedná se o jádro celé aplikace. Provádí inicializaci knihovny OGRE, vytvoření aplikačního okna. Zároveň vytváří a spravuje všechny ostatní funkční bloky a zajišťuje komunikaci mezi nimi. Důležitou roli hraje komunikace s blokem GameScript, která je řešena zasíláním událostí GameEvent. Takto přijaté události blok GameApplication zpracovává a předává příslušným podřízeným blokům. 6.2.2
GameScript
Úkolem tohoto bloku je čtení a interpretace herního scénáře. Scénář je tvořen jednoduchým skriptovacím jazykem (viz popis v části 6.3). Jednotlivé herní události nejsou „natvrdo“ naprogramovány, ale jejich definice jsou čteny ze scénáře a následně interpretovány. Blok GameScript tedy zajišťuje čtení scénáře z externího souboru a interpretaci jednotlivých příkazů. Může jít např. o přidání nového objektu (GameObject) do herního světa, zobrazení dialogu nebo spuštění zvuku. Herní objekty, narozdíl od samotné scény, mohou během hry měnit svou pozici a další vlastnosti. Některé z nich slouží zároveň jako interaktivní ovládací prvky, např. páky. GameScript obsahuje seznam všech herních objektů. Většinu operací, které jsou na nich prováděny, lze tedy řešitel interně. Některé operace ale vyžadují spolupráci dalších bloků, jedná se např. o interakci s ovládacími prvky nebo požadavky na přehrání zvuku či změnu GUI. V takovém případě je požadavek odeslán jinému funkčnímu bloku ve formě události GameEvent nebo herního objektu GameEvent. Jednou z operací zajišťovaných blokem GameScript je i animace objektů. Většina herních operací je spouštěna pravidelně při zobrazení každého snímku. Rychlost zobrazování, resp. FPS7 se ovšem může lišit podle výkonu grafické karty nebo nastavení aplikace. Je proto nutné zajistit, aby časová délka animací nebyla závislá na počtu zobrazených snímků, ale na uplynulém čase. Veškeré animace v bloku GameScript jsou proto interpolovány podle času uplynulého mezi snímky. Výsledkem je plynulost animací a zachování jejich časové délky i při různém FPS. 7
Frames Per Second - počet snímků zobrazených za 1 sekundu
KAPITOLA 6. IMPLEMENTACE HRY 6.2.3
35
GameEvent
Spíše než o funkční blok se jedná o formu zprávy, resp. události předávané mezi bloky. Většinu částí scénáře řeší blok GameScript samostatně, některé příkazy ale posílá bloku GameApplication, který je pak rozděluje dál. Příjemce události je přitom určen jejím typem. Např. typ PLAY_SOUND je odeslán bloku GameAudio, typ WAIT je ponechán v GameApplication a způsobí vyčkání po daný časový interval. Speciálním typem je ADD_INTERACTIVE_OBJECT, kterým GameScript ohlašuje přítomnost nového interaktivního objektu. Tato událost je odeslána bloku GameControls, který si udržuje samostatný seznam všech interaktivních objektů. 6.2.4
GameObject
Tento blok je reprezentací herního objektu. Herní objekty jsou umístěny ve statické scéně a pomocí herního scénáře lze dynamicky měnit jejich vlastnosti. Ty se mohou lišit podle typu objektu (ukázky herních objektů viz na obr. 6.3).
Obrázek 6.3: Ukázka několika herních objektů (zleva): GoCannon, GoLever, GoCube
Základní typ objektu je tvořen modelem umístěným ve scéně, jehož pozici a rotaci lze měnit pomocí scénáře. Jedná se o dynamický objekt – nepřímé osvětlení tedy pouze přijímá, ale světlo se od něj neodráží (narozdíl od statické scény). Rozšířeným typem je GoLever (Game object Lever – páka). Jedná se o interaktivní objekt v podobě páky, se kterou může hráč manipulovat. Páka má definován minimální a maximální rozsah a typ přepínání. Rozlišeny jsou zde dva typy přepínání – vypínač a páka. První z nich umožňuje jednorázovou změnu z minima na maximum a naopak. Druhý typ umožňuje plynulé nastavení libovolné hodnoty v daném rozmezí. Dalším typem je GoCube – detekční kostka. Představuje indikátor osvětlení v daném místě scény. Uživatel má velmi často za úkol docílit v některém místě scény určitého typu osvětlení. K jeho detekci slouží právě GoCube. Speciálním typem je GoLight – dynamické světlo. Jedná se o dynamický zdroj světla s proměnlivou barvou a intenzitou vydávaného osvětlení. Stejně jako u ostatních herních objektů však lze měnit i jeho pozici a rotaci. 6.2.5
GameControls
Funkcí tohoto bloku je zachytávání vstupů z myši a klávesnice a jejich zpracování. Pomocí klávesnice je ovládán pohyb postavy ve scéně, pomocí myši je řešen pohled kamery. Kamera je přitom fixována za zády ovládané postavy. GameControls zároveň řeší manipulaci s interaktivními objekty. Od bloku GameScript proto přijímá události typu ADD_INTERACTIVE_OBJECT obsahující odkaz na příslušný GameObject. Při pohybu postavy je pravidelně kontrolována vzdálenost všech interaktivních objektů. Po-
36
KAPITOLA 6. IMPLEMENTACE HRY
kud se postava dostatečně přiblíží k některému z nich, je zobrazena ikona indikující možnost manipulace s objektem. Stisknutím tlačítka myši pak může uživatel manipulaci provést. Zároveň jsou přijímány i události typu SHOW_TEXT, které vyžadují uživatelské potvrzení stiskem tlačítka. GameControls proto požádá GameGUI o zobrazení textu ve formě dialogového okna a po stisku tlačítka opět o jeho skrytí. 6.2.6
GameGUI
Jak je patrné z názvu, tento blok zajišťuje zobrazování prvků uživatelského rozhraní. Ty jsou vytvářeny pomocí CEGUI knihovny, která je v OGRE zastoupena formou externího plug-inu. Uživatelské rozhraní hry obsahuje prvky několika typů. Jedním z nich je dialogové okno, které zobrazuje text vyřčený postavami ve hře, popř. pokyny udělované hráči. Vyžaduje-li hra potvrzení dialogu, je v rohu okna zobrazena ikona počítačové myši se zvýrazněným levým tlačítkem. Obdobná ikona je použita i pro indikaci interaktivních objektů. Některé interaktivní objekty nabízejí více typů manipulace – např. za páku je možno zatáhnout jedním nebo druhým směrem. V takovém případě je zobrazena ikona levého nebo pravého tlačítka myši podle toho, která akce je právě k dispozici. 6.2.7
GameAudio
Tento blok slouží k přehrávání hudby a zvuků. Používá k tomu externí knihovnu FMOD Ex. Všechny zvuky jsou nejprve načteny do vnitřní databáze a poté spouštěny nebo vypínány podle událostí GameEvent přijatých z bloku GameApplication. 6.2.8
OgreLightsprint
OgreLightsprint je knihovna sloužící jako mezičlánek knihoven OGRE a Lightsprint, kterou jsem vytvořil v rámci přípravy na tuto práci. Nepřímé osvětlení spočtené knihovnou Lightsprint lze díky knihovně převést do prostředí OGRE a využít je k zobrazení globálně osvětlených scén. Účelem OgreLightsprint je tedy usnadnění integrace globálního osvětlení do prostředí OGRE. Ke své činnosti využívá velkou část možností, které OGRE nabízí. Jedná se především o extrakci geometrie, detekci přímého osvětlení pomocí funkce render-to-texture a skládání přímého a nepřímého osvětlení pomocí tzv. kompozitorů. Veškeré nastavení osvětlovacích technik je provedeno automaticky. Uživatel tedy pouze specifikuje objekty, které tvoří statickou scénu, a ohlásí spuštění výpočtu nepřímého osvětlení. Materiálové definice těchto objektů jsou pak přizpůsobeny k zobrazení globálního osvětlení přidáním speciálního shaderu pro zobrazení nepřímého osvětlení (viz kapitola 7.4.2). Dynamické objekty je možno libovolně přidávat a rušit, jejich materiály jsou rovněž automaticky přizpůsobeny globálnímu osvětlení. Globální osvětlení je zobrazeno pomocí tzv. kompozitoru, který je vložen na začátek zobrazovacího řetězce. Způsob zobrazení tak není fixní a uživatel knihovny má díky tomu možnost přidat libovolné další efekty za tento kompozitor a obraz scény dále upravovat. Konkrétní popis této metody je uveden v kapitole 7.1.
6.3
Skriptovací jazyk
Průběh hry je řízen vnitřním funkčním blokem GameScript. Ten čte scénář z externího souboru a interpretuje jej. Scénář je zapsán jednoduchým příkazovým jazykem, který jsem navrhl pro potřeby této hry.
KAPITOLA 6. IMPLEMENTACE HRY 6.3.1
37
Syntaxe
Jazyk je složen z posloupnosti příkazů, které mají podobu volání metod. Základní syntaxe je vidět z následující ukázky: text("aaaa" ,1,"") addLever( "lever1" , 0, ( 1.5, 2 , 0.3),(0,0,0),0,30,20) addLever( "lever2" , 0, ( 11.5, 2 , 0.3),(0,45,0),0,1,0.1) addLever( "lever3" , 1, ( -10.5, 2 , 0.3),(0,0,0),-40,0,-20) addLight("mylight1",(0,0,-30),(0,0,0),(1,1,0)) map("lever1","value","mylight1","rotY") map("lever2","value","mylight1","r") sound("miracle.mp3",0) Příkazy lze podle jejich funkce rozdělit do následujících skupin: obsluha rozhraní, proměnné a jejich mapování, manipulace s objekty, podmínky a cykly. Jejich úplný seznam včetně přesné specifikace je k dispozici v příloze C. Obsluha rozhraní Obsluha uživatelského rozhraní je řešena samostatným funkčním blokem GameGUI. Rovněž obsluha zvukového zařízení je řešena odděleně v bloku GameAudio. Uživatelský vstup je zpracováván v bloku GameControls. Veškeré žádosti o tyto akce tedy GameScript zasílá formou událostí GameEvent. Jedná se např. o zobrazení dialogového okna s textem, přehrání nebo vypnutí zvuku, zakázání nebo povolení uživatelského vstupu nebo nastavení objektu, který představuje hráče. Speciální skupinou jsou příkazy pro pohyb kamery a nastavení sledovaného objektu. Manipulace s objekty Hra definuje několik typů herních objektů (viz část 6.2.4). Každý z nich má specifické vlastnosti, které je při jeho tvorbě třeba definovat. Všechny objekty ve hře lze animovat, resp. měnit v průběhu času jejich pozici a rotaci. Změna přitom probíhá formou lineární interpolace. Proměnné a jejich mapování GameScript udržuje vnitřní stav, který je definován i pomocí vnitřních proměnných. Ty lze pomocí příkazů vytvářet a nastavovat. Vzhledem k jednoduchosti skriptovacího modelu je jako univerzální datový typ použit číselný typ float. Obdobně jako vnitřní proměnné lze měnit i hodnoty vlastností jednotlivých herních objektů – např. jejich pozici, barvu světla, ale i speciální vlastnosti jako intenzita ambientního osvětlení scény nebo zapnutí či vypnutí globálního osvětlení. Kromě jednorázové změny hodnot existuje i možnost mapování vlastností mezi objekty. Blok GameScript totiž spravuje veškeré herní objekty a má tak přímý přístup k jejich vlastnostem. Propojením dvou hodnot, které zde označuji jako mapování, bude docházet k pravidelné aktualizaci cílové proměnné vstupní proměnnou. Tímto způsobem lze např. mapovat pozici páky na barevnou složku světelného zdroje. Při manipulaci s pákou pak dochází k plynulé změně barvy světla vydávaného zdrojem. Obdobně lze měnit pozici a rotaci všech herních objektů. Podobná metoda mapování je použita i v jazyce VRML, kde lze (samozřejmě v mnohem flexibilnější formě) vzájemně vázat vlastnosti objektů.
38
KAPITOLA 6. IMPLEMENTACE HRY
Podmínky a cykly Hra obsahuje i několik částí, které vyžadují interakci uživatele. Ta spočívá ve splnění úkolu, resp. změně herního světa tak, aby odpovídal požadovanému stavu. Ověření stavu je prováděno pomocí podmínkového příkazu if. Pomocí podmínek lze testovat vlastnosti herních objektů, vnitřní proměnné, ale i např. vzdálenost hlavní postavy od jiných objektů. Časový úsek, který bude hráč pro splnění úkolu potřebovat, nelze předem definovat. Proto jsem do lineárního scénáře zavedl i možnost jeho cyklení formou příkazu while. Cyklus tak probíhá, dokud není určitá podmínka splněna. Aby nedošlo k zacyklení bloku GameScript, je při každém jeho zavolání provedena pouze jedna iterace cyklu. Zavedl jsem i možnost přímého skoku na konkrétní řádek scénáře příkazem jump. Vzhledem k míře, kterou skokové příkazy snižují přehlednost kódu, je však určen pouze pro testovací účely. 6.3.2
Interpretace
Proces čtení a interpretace je spuštěn žádostí bloku GameApplication o další událost. GameScript tedy čte scénář a interpretuje příkazy. Většinu příkazů je GameScript schopen splnit sám, protože se jedná o manipulaci s herními objekty, ke kterým má přímý přístup. GameScript funguje jako jednoduchý procesor. Udržuje svůj vnitřní stav (definovaný pomocí proměnných, herních objektů a jejich mapování), který je postupně upravován na základě vstupních příkazů. Čtení příkazů je zastaveno až tehdy, došel-li blok GameScript až na konec scénáře nebo potřebuje-li ke splnění příkazu spolupráci některého z dalších bloků. O spolupráci tedy požádá odesláním události GameEvent a do další činnosti se pouští až poté, co je opět zavolán blokem GameApplication.
KAPITOLA 7. GLOBÁLNÍ OSVĚTLENÍ V OGRE
39
7 Globální osvětlení v OGRE OGRE je komplexní zobrazovací systém, ale v oblasti osvětlení nabízí pouze základní metody. Navrhl jsem postup, pomocí kterého lze v OGRE využít některé metody globálního osvětlení. Pro výpočet globálního osvětlení je použita knihovna Lightsprint.
7.1
Osvětlovací proces
Lightsprint je do OGRE integrován pomocí knihovny OgreLightsprint (viz kapitola 6.2.8). Ta zajišťuje konverzi předávaných dat a implementaci potřebných fází v OGRE. Celý proces vychází z principu radiozitní metody má zhruba následující průběh: 1. Načti scénu do OGRE 2. Pošli geometrii scény Lightsprintu 3. Zjisti ozáření geometrie přímým osvětlením 4. Pošli hodnoty ozáření Lightsprintu 5. Lightsprint spočítá nepřímé osvětlení 6. Převezmi vypočtené nepřímé osvětlení a zobraz globální osvětlení 7. Došlo-li ke změně osvětlení, jdi na 3. 8. Jdi na 5. Je třeba si uvědomit, že zatímco zobrazovaná scéna je pomocí OGRE vytvářena přímo na GPU, nepřímé osvětlení je Lightsprintem počítáno na CPU. Přenos dat mezi CPU a GPU, stejně jako frekventovanost této operace, může výrazně ovlivnit výkon celé aplikace. Proto je třeba hledat způsoby, jak tuto komunikaci omezit na potřebné minimum. Osvětlovací proces je složen z několika částí, z nichž důležitou roli hrají: zobrazení přímého osvětlení, jeho detekce a zobrazení globálního osvětlení.
7.2
Zobrazení přímého osvětlení
Pro zobrazení přímého osvětlení (viz kapitola 2.4.1) existuje více metod různé kvality a rychlosti. Lokální osvětlovací metody stínují jednotlivé objekty samostatně a ignorují tak vržené stíny. Pro zobrazení aspoň částečně realistického osvětlení jsou ovšem vržené stíny nezbytností. V zásadě existují dva přístupy pro zobrazení vržených stínů – stínová tělesa a stínové mapy (viz [1]). První uvedená metoda pracuje s objemovou reprezentací stínů v trojrozměrném prostoru, silně však závisí na komplexnosti zobrazované scény. Zvolil jsem proto druhou metodu, která pracuje pouze v rovinném prostoru a navíc umožňuje snadné zobrazení měkkých stínů. Dalším důvodem byl podpora ze strany OGRE, který stínové mapy automaticky vytváří. Depth shadow mapping Metoda stínových map má několik variant, zvolil jsem variantu označovanou jako stínová paměť hloubky (depth shadow mapping, viz [17]). Důvodem byla dostupnost její implementace ve formě shaderů pro OGRE, které byly k instalaci OGRE připojeny jako jeden z ukázkových příkladů. Metodu jsem proto přejal a upravil pro své účely, resp. doplnil zobrazení nepřímého osvětlení. Nepříjemným důsledkem však byl vznik chyb ve stínech, tzv. artefaktů (viz obr. 7.1 vlevo). Metoda totiž silně závisí na charakteru konkrétní scény a její nutno ji ladit pomocí několika parametrů. Obecně je tak obtížné dosáhnout přesných výsledků.
40
KAPITOLA 7. GLOBÁLNÍ OSVĚTLENÍ V OGRE
Obrázek 7.1: Srovnání stínovacích metod – Depth shadow mapping (vlevo) a Variance shadow mapping [2]. Při použití první metody může dojít ke vzniku artefaktů (viz stín u paty sloupu), druhá metoda tyto nedostatky odstraňuje.
Variance shadow mapping Kvůli nedostatkům předchozí stínovací metody jsem proto zvolil variantu označovanou jako Variance shadow mapping [2]. Využil jsem existující implementaci pro OGRE označenou jako „Ogre Soft Shadows Demo“, která je volně dostupná na komunitním serveru OGRE. Implementaci jsem opět doplnil o zobrazení nepřímého osvětlení a další funkce. Díky odlišnému přístupu této implementace již nedochází ke vzniku stínových artefaktů (viz obr. 7.1 vpravo).
7.3
Detekce přímého osvětlení
Intenzita přímého osvětlení je jeden ze vstupních parametrů pro výpočet odrazů světla. Před zahájením výpočtu je tedy nutné zjistit intenzitu přímého osvětlení, které dopadá na každou plochu (resp. trojúhelník, ze kterých jsou objekty složeny). Implementoval jsem postup, který je doporučen v Lightsprint SDK: použít klasický mechanismus pro zobrazení scény s dvěma rozdíly. Trojúhelníky jsou místo své původní pozice (dané geometrií objektu) zobrazeny na nové pozici tvořící pravidelnou mřížku (viz obr. 7.2a). Ta zobrazuje všechny plochy ve scéně ozářené přímým osvětlením. Takto získaná mřížka není přímo zobrazena, ale uložena do paměti jako textura.
Obrázek 7.2: Schéma detekce přímého osvětlení: a) mřížka tvořená ozářenými plochami, b) vzorkování jednoho trojúhelníku, c) výsledná podvzorkovaná mapa osvětlení
KAPITOLA 7. GLOBÁLNÍ OSVĚTLENÍ V OGRE
41
Ozáření každé plochy ale potřebujeme reprezentovat pouze jedinou hodnotou. U každého trojúhelníku proto musíme zjistit průměrnou barvu jeho povrchu. Řešením je zvolit některé pixely (viz obr. 7.2b) a spočítat průměr jejich barev. Vzorkování by bylo možné provést na CPU. Mřížka trojúhelníků je ale zobrazena do textury uložené přímo na GPU, je proto rychlejší využít shaderů na GPU (tento postup je rovněž doporučen v Lightsprint SDK). Vytvořil jsem proto shader, který provádí vzorkování trojúhelníků a výpočet průměrné hodnoty jejich barvy. Tím dojde k podvzorkování celé trojúhelníkové mapy do textury, ve které je každý trojúhelník reprezentován pouze jedním pixelem (viz obr. 7.2c). Barva každého pixelu pak určuje průměrnou hodnotu ozáření příslušného trojúhelníku. Takto získané hodnoty jsou přeneseny na CPU a předány Lightsprintu.
7.4
Zobrazení globálního osvětlení
Vypočtené globální osvětlení je nutné nějakým způsobem zapojit do zobrazovacího procesu. Výhodou řešení je v takovém případě jeho rychlost a zároveň obecnost. 7.4.1
Zobrazovací řetězec v OGRE
Pro zobrazení globálního osvětlení využívá OgreLightsprint části zobrazovacího řetězce OGRE označované jako Technique, Pass a Compositor. Technique Každý materiál v OGRE obsahuje několik zobrazovacích technik (Technique). Při zobrazování objektu pokrytého tímto materiálem je vždy zvolena a použita pouze jedna z nich. Technika je zvolena buď automaticky (podle toho, zda grafická karta podporuje všechny požadované funkce), nebo manuálně. Manuální volba techniky probíhá určením zobrazovacího schématu (Material scheme). Např. při nastavení zobrazovacího schématu HDR budou použity pouze techniky, které spadají do této skupiny (resp. jsou označeny touto nálepkou). Toho jsem využil při začleňování technik pro globální osvětlení. Pomocí OgreLightsprint je do materiálů všech zobrazovaných objektů automaticky přidána jedna technika označená jako GI, která zobrazuje globální osvětlení. Pro zobrazení je pak nastaveno zobrazovací schéma GI. Díky tomu je globální osvětlení zobrazeno pouze u objektů, které je mají k dispozici, ostatní zůstávají beze změny. Pass Pass neboli průchod představuje stavební prvek zobrazovací techniky – každá technika je tvořena nejméně jedním průchodem. Průchody představují kroky, ve kterých jsou objekty vykreslovány. Pro ilustraci si můžeme představit malíře tvořícího obraz, který nejprve načrtne tužkou obrysy, pak silným štětcem namaluje pozadí a na závěr tenčím štětcem dokreslí popředí a detaily. Každý průchod může k zobrazení objektu použít jinou texturu nebo shader. Ve výsledku pak mohou být všechny průchody sečteny, vynásobeny, popř. jinak zkombinovány. Compositor Kompozitor (Compositor) je nejvyšší prvek v zobrazovacím řetězci OGRE. V podstatě zde plní funkci postprodukčního filtru, kterým je obraz scény upravován. Příkladem může být kompozitor pro převod do černobílých odstínů, rozostření nebo přidání rozptýleného světla (tzv. glow). Kompozitory lze řadit do tzv. Compositor Chain – řetězce kompozitorů. Vstupem je zde počáteční zobrazení scény. Jednotlivé kompozitory si jej vzájemně předávají a každý jej nějakým způsobem upraví, výsledek vzniklý průchodem celého řetězce je pak zobrazen. Kompozitor ale
42
KAPITOLA 7. GLOBÁLNÍ OSVĚTLENÍ V OGRE
neprovádí pouze úpravy přijatého obrazu. Jednou z možností je i opětovné vykreslení scény s vlastním nastavením a přičtení tohoto výsledku k původnímu obrazu. 7.4.2
Návrh techniky
Díky flexibilitě zobrazovacího řetězce OGRE lze většinu problémů řešit více způsoby. Mým cílem bylo nalézt dostatečně rychlé a zároveň obecné řešení pro zobrazení globálního osvětlení. Vyzkoušel jsem při tom dva přístupy – oddělené a sloučené texturování. Jako výhodnější se nakonec ukázal druhý přístup, bližší popis obou variant je uveden v následujících odstavcích.
Obrázek 7.3: Schéma kompozitoru pro globální osvětlení: Vlevo oddělené texturování, vpravo sloučené texturování.
Globálně osvětlená scéna je zobrazena pomocí speciálního kompozitoru. Ten je přidán do řetězce kompozitorů a má nastaveno zobrazovací schéma GI. Při vykreslování objektů tedy budou použity techniky, které do materiálů doplnil OgreLightsprint a jsou určeny pro zobrazení globálního osvětlení. Výsledek je předán dalšímu kompozitoru v řetězci, který má možnost provést další úpravy obrazu. Oddělené techniky Samotná GI technika může být řešena více způsoby. Jedním z nich je zobrazit pouze stínování vzniklé součtem přímého a nepřímého osvětlení. Tímto způsobem získané globální stínování je pak zkombinováno s texturami, resp. původním zobrazením scény tak, jak by vypadala bez globálního osvětlení při plném světle (viz obr. 7.3 vlevo). Výhodou je, že pro zobrazení textur lze použít původní materiály prakticky beze změny. Nevýhodou je ovšem další zobrazovací průchod celé scény, který je pro získání původního obrazu nutno provést. Proto jsem navrhl méně obecné, ale rychlejší zobrazovací řešení. Sloučené techniky Druhou možností provedení GI techniky je sečtení přímého i nepřímého osvětlení a textur v jednom průchodu (viz obr. 7.3 vpravo). Rovněž vnitřní složení samotné GI techniky lze zjednodušit sloučením přímého i nepřímého osvětlení. V původním návrhu techniky byla každá složka osvětlení řešena v samostatném průchodu (viz obr. 7.4 vlevo). Přímé osvětlení je totiž skládáno jako součet příspěvků jednotlivých zdrojů světla. Všechny složky však lze řešit v jednom společném průchodu (viz obr. 7.4 vpravo), což přináší další urychlení.
KAPITOLA 7. GLOBÁLNÍ OSVĚTLENÍ V OGRE
43
Obrázek 7.4: Schéma zobrazovací techniky pro globální osvětlení.
7.4.3
Privátní nepřímé osvětlení
Jako ve většině radiozitních metod pro real-time použití, i v našem případě jsou objekty rozlišeny na statické a dynamické. Statické objekty nemohou nemohou měnit svou pozici, ale jsou přesněji osvětlené. Pro dynamické objekty platí v obou případech opačné tvrzení. Lightsprint nabízí nepřímé osvětlení v několika datových formátech. V našem případě budeme požadovat osvětlení u statických objektů pro každý vrchol, u dynamických objektů ve formě kubické environment mapy. Statické objekty jsou složeny z trojúhelníkových ploch, získáme tedy hodnotu nepřímého osvětlení pro všechny vrcholy trojúhelníků ve scéně. Kubická environment mapa nahrazuje světlo přicházející k objektu ze všech směrů. Dynamický objekt je tedy stínován, jako by byl uzavřen v krychli, jejíž stěny jsou pokryty osvětlovacími texturami kubické environment mapy. Statické objekty Technika (viz část 7.4.1) pro zobrazení globálního osvětlení skládá přímé a nepřímé osvětlení. Nepřímé osvětlení statické scény je uloženo v tzv. vertex bufferu, který obsahuje hodnotu nepřímého osvětlení pro každý vrchol objektu. Tento vertex buffer je uložen vedle geometrie scény na GPU. V tomto bodě je jedna z výhod OGRE spíše na závadu. OGRE totiž provádí instancování geometrie. To znamená, že existuje-li více instancí vzniklých ze stejného modelu, OGRE u každé uloží pouze odkaz na společnou geometrii. Např. dva různé modely židlí se odkazují na stejnou geometrii uloženou v paměti. V našem případě ale ke geometrii ukládáme i informace o osvětlení. Výsledkem by proto byly dvě instance stejného modelu s různou pozicí ve scéně, ale s identickým osvětlením, což je chyba. Úpravou třídy, která v OGRE definuje geometrické objekty, jsem tedy zajistil vytvoření privátního vertex bufferu pro osvětlení každé instance. Do něj je uloženo osvětlení, které je určeno pouze pro jednu konkrétní instanci. Zároveň jsem vytvořil metodu, která přiřazuje osvětlovací buffer ke geometrii podle toho, která instance je právě zobrazována. Díky tomu může být zobrazeno více instancí stejného modelu, ale každá bude mít své unikátní nepřímé osvětlení. Dynamické objekty Nepřímé osvětlení u dynamických objektů není uloženo pro každý vrchol objektu, ale ve formě kubické environment mapy. Ta je pak pomocí normálového mapování zobrazena na objekt. Nastává ovšem stejný problém s instancováním jako u statických objektů. I materiály jsou totiž instancovány. OgreLightsprint pro každý dynamický objekt vytvoří privátní kubickou mapu
44
KAPITOLA 7. GLOBÁLNÍ OSVĚTLENÍ V OGRE
s nepřímým osvětlením a ta je přiřazena danému materiálu. Pokud by ale měly dva různé dynamické objekty nastaven stejný materiál, došlo by k použití stejné kubické mapy pro oba objekty, a tím k jejich identickému osvětlení. I zde jsem proto vytvořil metodu, která sleduje zobrazování dynamických objektů a přepíná kubickou texturu podle toho, který objekt je právě zobrazován.
7.5
Optimalizace výkonu
Některé části osvětlovacího procesu jsou časově náročné a je proto nutné regulovat jejich výkon pro zajištění plynulého chodu. Jednou z časově náročných operací je detekce přímého osvětlení. Během ní dochází k opětovnému vykreslení celé scény do podoby trojúhelníkové mřížky (viz 7.3). Míra osvětlení objektů je přitom zjišťována pomocí metody stínových map [1] (viz 7.2). Pro každý ze světelných zdrojů je v takovém případě nutné aktualizovat jeho stínovou mapu. K tomu ovšem dochází průběžně při vytváření každého nového snímku. Pro detekci přímého osvětlení jsem proto aktualizaci stínových map pozastavil a použil stínové mapy vytvořené pro zobrazení předchozího snímku scény. Tyto mapy jsou totožné s těmi, které by byly vytvořeny při aktualizaci. Díky tomu je ušetřeno několik zobrazovacích průchodů. K detekci přímého osvětlení dochází při jeho změně, která je ohlašována samotnou aplikací (např. dojde-li ke změně intenzity nebo pozice světelného zdroje). Další časově náročnou operací je samotný výpočet nepřímého osvětlení prováděný knihovnou Lightsprint. Knihovna dynamicky upravuje časový úsek věnovaný každé výpočetní iteraci. Délku tohoto úseku lze ovlivnit vnějším ohlašováním interakce ve scéně. Při každé změně ve scéně (pohyb objektu, pohyb kamery) je proto nutné tuto změnu ohlašovat a zajistit tím rovnoměrné rozložení výkonu.
7.6
Přenositelnost
Oproti původnímu předpokladu snadné přenositelnosti aplikací napsaných v OGRE se bohužel ukázalo, že opak je pravdou. OGRE definuje vlastní abstraktní zobrazovací systém, který může být reprezentován systémy OpenGL i DirectX na libovolném GPU. Uvedené tvrzení však dle mých zkušeností platí pouze pro jednoduché aplikace, které nevyužívají některé z pokročilých funkcí GPU (render-to-texture, floating point textury, shadery vyšších verzí). Bohužel právě tyto funkce tvoří jádro celé aplikace využívající globální osvětlení. Přestože se tvůrci OGRE snaží o zajištění kompatibility zobrazovacího systému s co nejširší škálou GPU, specifické vlastnosti některých grafických karet bohužel zatím nebyly plně postihnuty. Především v důsledku nepřesné implementace rozhraní OpenGL na některých GPU nebylo možné aplikaci na některých kartách úspěšně otestovat. Naopak rozhraní DirectX vykazovalo ve většině případů bezproblémovou kompatibilitu i lepší výkon. Proto jsem do herní aplikace implementoval několik detekčních metod, které se snaží zjistit možnosti GPU a podle nich upravit funkci celé aplikace, popř. podat hlášení o možné nápravě.
7.7
Testování
Hra byla testována na několika PC s různými GPU (viz tab. 7.1). Měření obsahuje rychlost zobrazení při dynamickém osvětlení (plynulý pohyb některého ze světelných zdrojů). Během pohybu světelného zdroje dochází k průběžné aktualizaci nepřímého osvětlení, rychlost zobrazení tím může být ovlivněna. Rychlost zobrazování je kromě GPU závislá i na výkonu CPU. Nepřímé osvětlení je totiž počítáno právě na CPU. K měření byla použita scéna složená ze 17 000 trojúhelníků. Ve scéně byly umístěny dva dynamické světelné zdroje, pro každý z nich byla generována stínová mapa o velikosti 512x512
KAPITOLA 7. GLOBÁLNÍ OSVĚTLENÍ V OGRE
CPU
GPU
Intel Core2 2.2GHz AMD Sempron 3200+ Intel 1.66GHz Intel Core2 2.5GHz Intel Core2 2.5GHz Intel Core2 2.5GHz
NV GF8600M GT NV GF7600 GS ATI Radeon X1300 ATI Radeon X1600 NV GF 8800 GTS ATI Radeon HD 3800
CPU
GPU
Intel Core2 2.2GHz AMD Sempron 3200+ Intel 1.66GHz Intel Core2 2.5GHz Intel Core2 2.5GHz Intel Core2 2.5GHz
NV GF8600M GT NV GF7600 GS ATI Radeon X1300 ATI Radeon X1600 NV GF 8800 GTS ATI Radeon HD 3800
45
640 x 480 55 57 – 105 140 235
OpenGL [FPS] 1280 x 1024 1920 x 1440 43 – 23 – – – 43 28 128 87 171 117
640 x 480 124 54 28 118 385 407
DirectX [FPS] 1280 x 1024 1920 x 1440 57 – 22 – 12 – 47 29 159 104 171 122
Tabulka 7.1: Měření rychlosti zobrazení hry v OpenGL a DirectX. pixelů. Přestože je nepřímé osvětlení počítáno na CPU, nemá tento výpočet na rychlost zobrazení scény prakticky vliv. Nízké hodnoty FPS na pomalejších GPU (viz tabulka 7.1) jsou způsobeny zobrazováním přímého osvětlení. Součástí pixel shaderu je totiž jednoduchý filtr pro zobrazení měkkých stínů, který provádí vícenásobné vzorkování stínové textury. U méně výkonných GPU je tedy rychlost zobrazení závislá na rozlišení. I ve vyšších rozlišeních však na většině standardních GPU dosahuje rychlost zobrazení nejméně 25 FPS.
7.8
Srovnání
V předchozích kapitolách byly popsány metody pro výpočet globálního osvětlení a některé implementace, které to umožňují v reálném čase. Instant Radiosity nahrazuje odražené světlo virtuálními bodovými zdroji světla. Její vylepšená verze [8] dosahuje při rozlišení 1024x768 hodnot vyšších než 50 FPS. Metoda je dobře škálovatelná a podává kvalitní vizuální výsledky, byla ovšem implementována pouze pro jeden zdroj světla a počítá pouze s jednou úrovní odrazu. Photon Mapping simuluje odrazy světla střílením fotonů ze světelného zdroje a následovným sběrem jejich světelných příspěvků. Jeho implementace na GPU [9] v rozlišení 512x512 dosahuje více než 35 FPS. Metoda umožňuje zobrazení kaustik, které jsou jinak velmi obtížné dosažitelné. Osvětlení je aktualizováno postupně a selektivně, při rychlém pohybu objektů proto může docházet k zobrazení nekorektního osvětlení. Vizuálně nejzdařilejší a zároveň dostatečně obecnou implementací je Raytracing in Egoshooters [14]. Jedním z navržených uplatnění je i oblast počítačových her. S využitím clusteru několika PC bylo při rozlišení 512x512 dosaženo 5-20 FPS. Aplikace sice umožňuje zobrazení všech efektů, které globální osvětlení nabízí, výkonové požadavky ovšem v současné době zabraňují širšímu rozšíření pro běžné použití. Žádná z výše uvedených technik dosud není v případě počítačových her ani interaktivních aplikací obecně ve větší míře rozšířena. Příčinou jsou zpravidla hardwarové nároky kladené na použití některých metod. V oblasti počítačových her jsou proto používány metody, které
46
KAPITOLA 7. GLOBÁLNÍ OSVĚTLENÍ V OGRE
globální osvětlení nějakým způsobem napodobují (viz kapitola 4.2). Ve většině případů se jedná o jeho statické předpočítání a následnou dynamickou aproximaci. To umožňuje rychlé a poměrně věrné osvětlení scén, přesto však existují omezující parametry zobrazovaných scén – pohyb světelných zdrojů, zobrazení nepřímého osvětlení atd. Hra, jejíž vytvoření bylo cílem této práce, implementuje globální osvětlení v reálném čase, k jeho výpočtu je použita externí knihovna. I při pohybu několika světelných zdrojů a dynamického výpočtu nepřímého osvětlení dosahuje hra v běžně používaném rozlišení (800x600) rychlosti zobrazení vyšší než 50 FPS. K testování byl přitom použit běžně dostupný hardware střední třídy (viz tab. 7.1). Nepřímé osvětlení zobrazené ve hře má pouze difuzní charakter, zrcadlové a lesklé odrazy nepřímého osvětlení tedy nejsou v této implementaci zobrazeny. Příčinou je podstata radiozitní metody, která se zaměřuje především na difuzní odrazy (viz kapitola 3.4). Pro běžné použití v počítačových hrách lze však toto zjednodušení považovat za postačující, difuzní složka je totiž z hlediska lidského zrakového vjemu nejpodstatnější, ostatní typy odrazů nehrají v tomto případě tak významnou roli [15] (viz kapitola 4.1). Použitá radiozitní metoda stojí na pomezí mezi osvětlovacími technikami, které jsou aktuálně používány v počítačových hrách a fyzikálně korektními metodami. Bere v potaz základní charakteristiky osvětlení a umožňuje jeho dynamický výpočet. Zároveň je snadno škálovatelná z hlediska kvality a rychlosti a tím spíše vhodná pro použití v interaktivních aplikacích.
KAPITOLA 8. ZÁVĚR
47
8 Závěr Cílem práce bylo provedení analýzy globálních osvětlovacích metod a jejich možností v rámci interaktivních aplikací. Provedl jsem proto obecnou rešerši osvětlovacích metod a metod používaných pro výpočet globálního osvětlení. Účelem bylo nalezení a formulace vizuálně pozorovatelných výhod, které globální osvětlovací přístup přináší. Vzhledem k zaměření na interaktivní aplikace jsem rovněž provedl rešerši metod, které jsou v počítačových hrách aktuálně používány pro zobrazení osvětlení. Výsledkem bylo zjištění, že globální osvětlení je v interaktivních aplikacích aktuálně pouze aproximováno, popř. napodobeno fyzikálně ne zcela korektními metodami, které dosahují různého stupně věrohodnosti. Jednoduché aproximativní metody nějakým způsobem zjednodušují nepřímé osvětlení. Rozdíly oproti korektnímu globálnímu osvětlení lze pozorovat především v interiérech a při dynamické změně osvětlení. V interiérech dochází k četnějším světelným odrazům a tím i méně pravidelnému rozložení světla – konstantní aproximativní metody zde proto při komplexnějším osvětlení často selhávají. Nepřímé osvětlení je ve většině případů předpočítáno. Předpočtené nepřímé osvětlení má však pouze statický charakter, jakékoliv dynamické změny světelných podmínek proto nejsou v rámci nepřímého osvětlení zohledňovány. Zatímco v případě statického srovnání mohou interaktivní aplikace napodobit globální osvětlení poměrně věrně, při dynamickém osvětlení jsou rozdíly mnohem patrnější. V důsledku své výpočetní náročnosti však nejsou dynamické globální osvětlovací metody v interaktivních aplikacích dosud ve větší míře využívány. Právě dynamická změna světelných podmínek je hlavní výhodou dynamického globálního osvětlení, na kterou poukazuje hra, kterou jsem v rámci této práce vytvořil. Hra jednoduchou formou seznamuje s hlavními aspekty globálního osvětlení a snaží se při tom nabídnout srovnání s běžně používanými aproximativními metodami. Hráč zde cíleně manipuluje s několika zdroji světla a dynamicky tak upravuje světelné podmínky. Ve hře je implementováno difuzní nepřímé osvětlení, které postačuje pro předvedení základních výhod dynamického globálního osvětlení. Výsledná hra tedy prezentuje výhody dynamického globálního osvětlení, které dosud nebylo v interaktivních aplikacích ve větší míře využíváno. V důsledku statického charakteru osvětlení byla částečně omezena dynamika i celkový charakter zobrazovaných scén, s využitím dynamického osvětlení by však bylo možné tato omezení minimalizovat. Možným pokračováním práce by mohla být implementace lesklých a zrcadlových nepřímých odrazů, popř. techniky Ambient Occlusion používané pro napodobení nepřímého osvětlení. Hra by rovněž mohla být rozšířena o další kapitoly, které se zaměří na jiné aspekty globálního osvětlení (statické světelné mapy, ambient cube, atd.). Pro potřeby hry jsem navrhl jednoduchý skriptovací jazyk, pomocí kterého lze psát scénář hry bez nutnosti jakékoliv úpravy původní aplikace.
48
KAPITOLA 8. ZÁVĚR
KAPITOLA 9. LITERATURA
49
9 Literatura [1] D. Ambrož. Stíny v počítačové grafice, 2006. http://www.shadowstechniques.com. [2] W. Donnelly and A. Lauritzen. Variance shadow maps. In I3D ’06: Proceedings of the 2006 symposium on Interactive 3D graphics and games, pages 161–165, New York, NY, USA, 2006. ACM. [3] P. Dutré. Global illumination compendium. [Online]. [4] P. Heckbert. "Adaptive Radiosity Textures for Bidirectional Ray Tracing". In Proceedings of SIGGRAPH ’90, pages 145–154, August 1990. [5] J. T. Kajiya. The rendering equation. In SIGGRAPH ’86: Proceedings of the 13th annual conference on Computer graphics and interactive techniques, pages 143–150, New York, NY, USA, 1986. ACM. [6] A. Keller. Instant radiosity. In SIGGRAPH ’97: Proceedings of the 24th annual conference on Computer graphics and interactive techniques, pages 49–56, New York, NY, USA, 1997. ACM Press/Addison-Wesley Publishing Co. [7] J. Křivánek. X36RSO - Realistická syntéza obrazu, 2007. výukové materiály, CTU Prague. [8] S. Laine, H. Saransaari, J. Kontkanen, J. Lehtinen, and T. Aila. Incremental Instant Radiosity for Real-Time Indirect Illumination. In Proceedings of Eurographics Symposium on Rendering 2007. Eurographics Association, 2007. [9] B. D. Larsen and N. Christensen. "Simulating Photon Mapping for Real-time Applications". In A. K. Henrik Wann Jensen, editor, "Eurographics Symposium on Rendering", June 2004. [10] G. McTaggart. Half-life 2 / Valve Source shading, Direct3D Tutorial Day, Game Developer’s Conference, March 2004. http://www.valvesoftware.com/publications.html. [11] J. Mitchell, G. McTaggart, and C. Green. Shading in Valve’s Source engine. In SIGGRAPH ’06: ACM SIGGRAPH 2006 Courses, pages 129–142, New York, NY, USA, 2006. ACM. [12] M. Mittring. Finding next gen: Cryengine 2. In SIGGRAPH ’07: ACM SIGGRAPH 2007 courses, pages 97–121, New York, NY, USA, 2007. ACM. [13] P. B. Philip Dutré, Kavita Bala. Advanced Global Illumination. A K Peters Ltd., 2nd edition, 2006. [14] J. Schmittler, D. Pohl, T. Dahmen, C. Vogelgesang, and P. Slusallek. Realtime ray tracing for current and future games. In SIGGRAPH ’05: ACM SIGGRAPH 2005 Courses, page 23, New York, NY, USA, 2005. ACM. [15] W. A. Stokes, J. A. Ferwerda, B. Walter, and D. P. Greenberg. Perceptual illumination components: a new approach to efficient, high quality global illumination rendering. ACM Trans. Graph., 23(3):742–749, 2004. [16] Wikipedia. "Ambient occlusion — Wikipedia, The Free Encyclopedia", 2008. [Online; accessed 18-April-2008]. [17] J. Žára, B. Beneš, J. Sochor, and P. Felkel. Moderní počítačová grafika. Computer Press s.r.o, Brno, 2nd edition, 2004.
50
KAPITOLA 9. LITERATURA
DODATEK A. BAREVNÁ PŘÍLOHA
51
A Barevná příloha
Obrázek 1.1: Srovnání počítačové grafiky ve filmu a v počítačových hrách – film Final Fantasy: Advent Children (2006, Sony Pictures Home Entertainment), hra Half-Life 2: Episode Two (2007, Valve Corporation), hra Crysis (2007, Crytek)
Obrázek 2.5: Efekty globálního osvětlení: color-bleeding (vlevo), kaustika (vpravo)
Obrázek 3.3: Raytracing in Egoshooters
52
DODATEK A. BAREVNÁ PŘÍLOHA
Obrázek 3.4: Oasen
Obrázek 5.1: Obrázky ze hry
Obrázek 4.1: Srovnání ambientního a globálního osvětlení. U ambientního osvětlení (horní řada) lze pozorovat určitou mělkost stínů, naopak stíny globálního osvětlení (dolní řada) jsou prokreslenější a dávají vyniknout prostorové organizaci scény.
DODATEK A. BAREVNÁ PŘÍLOHA
53
Obrázek 4.5: Srovnání osvětlovacích metod – horní řada: lokální stínování, přímé osvětlení (s vrženými stíny), klasický raytracing. Dolní řada: ambient occlusion, radiozita, photon mapping (s final gather).
54
DODATEK A. BAREVNÁ PŘÍLOHA
DODATEK B. SEZNAM POUŽITÝCH ZKRATEK
B Seznam použitých zkratek 3D Three-Dimensional CPU Central Processing Unit FPS Frames Per Second GPU Graphical Processing Unit GUI Graphical User Interface HDR High Dynamic Range PIXEL Picture Element VRML Virtual Reality Modeling Language
55
56
DODATEK B. SEZNAM POUŽITÝCH ZKRATEK
DODATEK C. SPECIFIKACE JAZYKA GAMESCRIPT
57
C Specifikace jazyka GameScript Datové typy String "
", napr. "asdb sabdas
sdsd"
bool 0|1 float <desetinne_cislo>, napr. 0.123 vec3 (,,), napr. (1.1,2,3.5)
Příkazy text (String ,[bool <wait_for_click>=1 ,String ]) je-li nastaven wait_for_click, pouze zobrazí text a provádí daląí příkazy image (String , float =0) zobrazí obrázek přes celou obrazovku hideImage (float =0) skryje obrázek title (String , float =0) zobrazí titulek hideTitle (float =0) skryje titulek controls (bool <enable_movement>, bool <enable_look>) zapne ovládání volume (float ) hlasitost 0/100 loadAudio (String ) sound (String [, bool ]) muze jich hrat vice soucasne music (String [, bool ]) prehrava se pouze jedna stopAllSounds () wait (float <seconds>) end () ukončí čtení příkazů jump (float ) skok na přísluąný řádek skriptu loadScript ( String <script_filename> ) načte přísluąný soubor skriptu loadScene ( String <model_filename> ) smaľe vąechny objekty, restartuje Lightsprint, načte novou scénu lookAt (vec3 [,float , vec3 , bool ]) přesune kameru na dané místo (plynule, nebo okamľitě, pokud transition_time==0), je-li zadáno camera_pos, pak přesune i kameru, jinak se jen natočí daným směrem, automaticky nastavuje controls(false, false) lookAtObject (String [,float , vec3 , bool ] ) is_relative udává relativní souřadnice vůči aktuální pozici objektu watch (String , vec3 ) nastaví kameru, aby se fixovala za daný objekt
58
DODATEK C. SPECIFIKACE JAZYKA GAMESCRIPT
setPlayer (String ) nastaví ovládání pro manipulaci daného objektu addObject (String ,String <model_file>, vec3 <position>, vec3 ) addLight (String , vec3 <position>, vec3 , vec3 ) addLever (String ,bool ,vec3 <position>,vec3 , float <min_value>, float <max_value>,float <def_value>) addGIMachine (String , vec3 <position>, vec3 ) animate (String , float , vec3 <position> [, bool , vec3 ]) posune objekt z aktuálni pozice na výslednou, postupně interpoluje pozici i rotaci map (String <src_name>,String <property>,String ,String <property>) přidá záznam do mapovací tabulky unmap (String <src_name>,String <property>,String ,String <property>) odebere záznam z mapovací tabulky set (String , String <property>, float ) nastaví vlastnost objektu set (String , float ) nastaví vnitřní proměnnou setFromProperty (String , String , String <property>) nastaví vnitřní proměnnou podle vlastnosti objektu
Podmínky eq (String ,float ) neq (String ,float ) gt (String ,float ) lt (String ,float ) isNearVal (String ,String , float) areObjectsNear (String ,String , float [, bool ]) isNearObject (String , float [, bool ]) poslední parametr způsobuje negaci isNear (vec3 <position>, float ) isLightDir (String , vec3 , float ) test směru světla isLookingAt (String <watcher_name>, String , float ) test orientace dvou objektů isLightColor (String , vec3 , float ) test barvy světla isLit (String , vec3 [, float ])
DODATEK D. PŘÍRUČKA
59
D Příručka Doporučená konfigurace GPU s podporou Shader Model 2, CPU 1.5+ GHz, MS Windows
Instalace a spuštění Adresáře /bin a /media zkopírujte na disk s možností zápisu - během spuštění aplikace jsou v /bin/release/temp vytvářeny dočasné soubory. Hra je spouštěna souborem /bin/release/RTGI.exe. Po spuštění je zobrazeno dialogové okno s nastavením zobrazovacího rozhraní. Zvolte DirectX nebo OpenGL, rozlišení a zobrazení v okně, resp. přes celou obrazovku. Zobrazení v DirectX může být na méně výkonných GPU pomalejší (vlivem zpoždění při přenosu dat z GPU na CPU). Některá GPU řady ATI Radeon v OpenGL nepodporují funkce potřebné pro detekci přímého osvětlení (Render To Texture) – tato chyba je ohlášena varováním "RTT overwriting not supported". V takovém případě je nutno přepnout do rozhraní DirectX. Primárně proto volte OpenGL a pouze v případě nefunkčnosti přepněte do DirectX. Během prvního spuštění hry dojde k vytvoření pomocných souborů pro urychlení výpočtu globálního osvětlení. Po zobrazení nápisu ...loading... tedy vyčkejte cca jednu až dvě minuty.
Ovládání A,S,D,W pohyb postavy myš pohled kamery tlačítka myši potvrzení dialogu, interakce s objekty Esc ukončení aplikace M, shift+M změna zobrazovacího módu PrintScr uložení snímku obrazovky F zobrazení FPS statistik
60
DODATEK D. PŘÍRUČKA
DODATEK E. OBSAH PŘILOŽENÉHO CD
61
E Obsah přiloženého CD
bin – přeložené knihovny a spouštěcí soubor doc – automaticky generovaná dokumentace zdrojových kódů hry a knihovny OgreLightsprint media – modely, textury a definice materiálů používaných ve hře src – zdrojové kódy hry a knihovny OgreLightsprint text – text této práce a uživatelská příručka ve formátu TeX a PDF vcproj2005 – soubory pro spuštění projektu aplikace ve VS 2005