Metody 3D grafiky (5. část, obloha)

Ostatní jazyky Petr Lite 3D grafika Metody 3D grafiky (5. část, obloha)

... pokračování z minulé lekce

Obloha je završením našeho 3D světa. Je to jeden z nejvíce viditelných prvků scény. Prvek nenápadný, ale silně ovlivňující dojem hráče z hry. Proto stojí za to věnovat obloze obzvláštní pečlivost.

1. Jednobarevná obloha

Jednobarevná obloha je úplně nejjednodušším řešením oblohy. Nestojí nás skoro nic, stačí jen nastavit barvu pozadí scény na vybranou barvu. Samozřejmě náročnějšího hráče tímto stylem oblohy příliš neuspokojíme.

2. Mlha

Je-li scéna trochu komplikovanější, můžeme narazit na nedostatečnou rychlost vykreslování grafiky. Jedním z možných řešení je omezení vzdálenosti dohledu. Vykreslují se jen blízké objekty a tím lze výrazně přispět k rychlosti grafiky. Chceme-li zabránit náhlému objevování se objektů, můžeme použít mlhu. Mlha zajistí, že objekty s rostoucí vzdáleností pomalu mizí v mlze a až jsou v mlze zcela potopené, mohou zmizet omezením hranice dohledu a přitom mizení vypadá přirozeně a nenásilně.

Pro účel omezení viditelnosti objektů je vhodnější lineární mlha. U lineární mlhy zadáváme počátek a konec mlhy. Na počátku mlhy začnou objekty pomalu šednout až na hranici konce mlhy zmizí úplně. Mezi začátkem a koncem se mlha lineárně zvyšuje. Konec lineární mlhy proto může být shodný se vzdáleností dohledu.

Mlha se renderovací jednotkou realizuje tak, že jednotlivé vykreslované body objektů se lineárně interpolují s barvou mlhy, v závislosti na pozorované vzdálenosti. Pokud jako oblohu používáme jednobarevné pozadí scény, mlha se na pozadí neuplatňuje (není to objekt co by měl nějakou vzdálenost). Je proto nutné pozadí nastavit na přesně stejnou barvu, jakou používáme pro mlhu. V opačném případě bychom pozorovali šedé siluety kopců vystupující na blankytné obloze.

Při použití mlhy je vhodné vypínat stíny pod objekty (v ukázkovém programu není řešeno) a dát pozor na zobrazení průsvitných objektů. Vzhledem k modulaci průhledných objektů mlhou může dojít k násobení efektu mlhy a například stíny pod objekty pak vypadají jako obdélníky z mlhy. Nelze-li to řešit vyřazením průhledných objektů, je nutné efekt mlhy zeslabit.

3. Rovina

Nejjednodušším typem texturované oblohy je rovina. Je to velká čtvercová plocha roztažená ve výšce nad scénou a pokrytá texturou oblohy.

Rovinná textura vypadá přirozeně při použití jako nízko položená oblaka. Při pohledu je patrné zhušťování mraků v dálce. Obzvláště je to patrné při letu letadlem, kdy vidíme jak se přibližujeme k rovině mraků.

Nevýhodou rovinné oblohy je, že nezasahuje až k horizontu. Při použití v otevřeném terénu je viditelný konec textury vznášející se v dálce nad terénem. Můžeme to ošetřit dvěma způsoby. Za prvé, hráče umístíme do terénu s vysokými okraji (skalami), takže hráč nebude nikdy vidět na horizont. Za druhé (to je případ v ukázkovém programu), použijeme mlhu. Hráč vidí jen část oblohy, zbylá část v dálce včetně pozadí scény se ztrácejí v mlze. Tento případ řešení vypadá velmi přirozeně a působivě. Dobře se tak vytváří například ponuře laděná scéna nebo krajina před bouřkou.

Mraky na rovinné obloze můžeme snadno animovat. Stačí, budeme-li celou rovinnou pomalu rotovat kolem osy Y a tím vytvoříme docela věrohodný pohyb mraků po obloze.

4. Kopule

Chceme-li oblohu bez mlhy a zasahující až k horizontu, můžeme k tomu využít objekt polokoule, který nám nad hlavou vytvoří nebeskou klenbu, kopuli. Postačí polokoule s nízkou složitostí, bez dolní podstavy. Po vytvoření provedeme inverzi objektu, která obrátí orientaci plošek. Polokoule tak bude viditelná ne z vnějšku, ale zevnitř. Obloha je roztažená především do šířky, přes celou plochu scény. Na výšku je mnohem menší. Vzhledově se tak blíží podobě roviny, přesto ale zasahuje dolů k horizontu.

Na povrchu kopule je položená bezešvá textura oblak. Textura je namapovaná rovinným promítáním s opakováním. Mapování se provádí opakovaně s pomalým posouváním počátku textury. Tím je zajištěna animace oblak, která pomalu plynou oblohou. Celkově tento typ oblohy vytváří velmi dobrý dojem příjemného letního nebe.

5. Vícevrstvá obloha

Následující typ oblohy je opakem oblohy předešlé, pokud jde o vytvořený dojem. Používá také objekt polokoule pro vytvoření nebeské klenby, ovšem s tím rozdílem, že polokoule jsou dvě. Spodní polokoule je poloprůhledná a překrývá horní. To umožňuje dosáhnout působívého efektu pohyblivých mraků, kdy se mraky na obloze jakoby prohánějí různými směry přes sebe vlivem bouřky. Animace posouvání textur probíhá rychleji než u předešlé oblohy a směry pohybu jsou na sebe kolmé.

Proto je scéna v ukázkovém programu u tohoto typu oblohy laděna jako probíhající bouřka. Je přidána mlha vytvářející dojem bouřkového příšeří. Opakovaně se ozývá zvuk deště a foukání větru. Děšť je též vizuálně animován a to tak, že před kamerou je připevněna stěna opatřená poloprůhlednou texturou s obrazem padajících dešťových kapek. Opakovaným mapováním textury se textura rychle posouvá shora dolů a vytváří tak dojem padajícího deště.

Dalším efektem vytvářejícím dojem bouřky jsou hromy a blesky. V náhodných okamžicích obloha zableskne a ozve se hrom. Záblesk se provede tak, že se na chvíli (na 100 ms) zvýší jas hlavního osvětlení scény, jinak je osvětlení udržováno na příšeří. Současně se během záblesku vypne na chvíli mlha (tma), což vytvoří dojem osvětlení krajiny bleskem.

Při přehrávání zvuku hromu je zvoleno náhodné číslo rozlišovacího kódu zvuku. To umožní přehrávání více hromů současně, zvuky se překryjí. Parametry zvuku jsou náhodné - rychlost přehrávání, hlasitost zvuku a stereofonní vyvážení. To vytváří dojem pestrosti zvuků hromů, hromy nezní všechny stejně.

Ukázkový program v tomto módu oblohy skrývá ještě jeden efekt přispívající ke strašidelnosti scenérie. Ale ten vám neprozradím a nechám vás scénu si vyzkoušet. Doporučuji zvolit si mravence, plovoucí kameru a trochu se porozhlédnout po okolí. Upozorňuji ale, že je to vhodné jen pro otrlé nelekavé povahy.

6. Skybox

Skybox, neboli nebeská krabička. Asi to není nejlepší překlad, tak raději zůstaneme u skyboxu. Co si pod skyboxem představit? Je to krychle. Na stěnách krychle jsou nalepené textury s obrázky oblohy. Nejsou to však ledajaké obrázky. Kdybychom tam nalepily běžnou texturu oblohy, poznali bychom hned, že se jedná o krychli a to především díky perspektivnímu zkreslení. U skyboxu jsou textury oblohy vytvořené speciálně pro tento účel a to tak, že obraz je vyrenderován ve 3D programu (konkrétně byl použitý Bryce 3D) promítáním pohledu do několika navzájem pravoúhlých směrů. Usazením vygenerovaných textur na pravoúhlé stěny dosáhneme přesně stejné reprodukce obrazu jako v okamžiku snímání. Nedochází k žádnému perspektivnímu zkreslení a tvar krychle nelze rozpoznat. Stejného efektu bychom dosáhli běžným fotoaparátem tak, že bychom vyfotili okolní svět v několika navzájem kolmých směrech a výsledné snímky usadili na stejně pravoúhlé promítací stěny. Podmínkou ovšem je, že fotoaparát musí mít pozorovací úhel 90°. Stejná podmínka platí i pro kameru renderovacího programu generujícího texturu.

Samozřejmě musíme pozorovat stěny s obrazy ze stejného místa přesně uprostřed krychle, jak tomu bylo ve chvíli snímání obrazu. Jednou variantou je, že kolem celého 3D světa bychom vytvořili obrovskou krychli. To má nevýhodu v tom, že musíme použít velkou vzdálenost dohledu, aby byla celá krychle stále viditelná. Použijeme-li krychli malou, bude patrná deformace pohledu na oblohu pokud se budeme světem pohybovat.

Proto skybox řešíme jiným způsobem. Ve skutečnosti použijeme krychli velmi malou, například s rozměrem 5 jednotek. Během pohybu kamery se skyboxem neustále pohybujeme spolu s kamerou tak, že skybox kameru stále obklopuje. Tedy - jakoby měl hráč neustále kolem hlavy malou krychli. To, že hráč vidí skybox jako oblohu na vzdáleném pozadí, zajistíme tak, že stěnám skyboxu vypneme ukládání hloubkové informace a skybox zařadíme do nejnižší renderovací skupiny (s indexem 0). To zajistí, že skybox bude na obrazovku vykreslován jako první a až po něm všechny ostatní objekty scény. Protože skybox neukládá hloubkovou informaci, chová se tak, jakoby ve scéně vůbec nebyl. Tak mohou být ostatní objekty přes jeho stěny překreslovány, přestože jsou ve skutečnosti od kamery dále.

Pomocí skyboxu snadno vytvoříme nejen oblohu, ale i slunce a scenérii pozadí, například vzdálené pohoří. Obraz pozadí scény tak může vypadat velmi realisticky. Nevýhodou skyboxu je, že oblaka nelze animovat. Ale i to by bylo možné řešit - překrytím obrazu skyboxu jiným typem oblohy, s průhledností a animovaný. Tip: Hledáním klíčových slov "skybox texture" můžete najít na internetu mnoho hotových textur pro skyboxy.

7. Superbox

Supexbox je ve skutečnosti také skybox, jen jsme pozměnili označení, abychom odlišili trochu jinou variantu skyboxu. Nevýhodou předešlého skyboxu je to, že k dosažení dostatečně vysokého stupně detailů pozadí musíme použít velkou texturu. Rozlišení textury nemůžeme zvyšovat do nekonečna, jsme omezeni přinejmenším schopnostmi grafických karet.

Řešení omezení velikosti textur je v tom, že stěnami skyboxu budou ne pouze jednoduché stěny, ale soustava stěn poskládaných vedle sebe. Tak můžeme zvyšovat rozlišení textur prakticky neomezeně.

V ukázkovém programu jsme stěny skyboxu nahradili sítí 4 x 4 = 16 segmentů. Abychom nemuseli s tolika segmenty textury manipulovat ručně, rozsekali jsme texturu na části programově. K dispozici jsme měli velkou texturu, kterou jsme postupně po malých úsecích vykreslovali na plochu jako 2D obrázek, úsek sejmuli do malého obrázku a nastavili příslušnému segmentu jako texturu. Díky tomu jsme dosáhli daleko vyšší kvality zobrazení skyboxu, přestože jsme použili malé textury.

Jako doplňkový efekt jsme u tohoto typu oblohy vytvořili lens flares, neboli čočkový odlesk od Slunce. Záměrně, pro demonstrační účely, jsme to s odlesky trochu přehnali, tak ve vašich programech buďte trochu střídmější.

8. Noc

Posledním typem oblohy je příklad noční scenérie. Nad hráčem se nachází polokoule tvořící kopuli s texturou hvězdné noční oblohy. Textura je namapovaná s projekcí koule s vyšším počtem opakování textury.

Pro vytvoření dojmu noci je scéna opatřena černou mlhou. Tím je zajištěno, že hráč vidí jen v blízkém okruhu kolem sebe. Pravděpodobně má u sebe lampu a proto použijeme plné osvětlení. V opačném případě bychom hlavní osvětlení scény trochu ztlumili. Kvůli použití mlhy jsme zvolili jen malé rozměry polokoule oblohy. Objekt polokoule má zvolenou renderovací skupinu 0 s vypnutým ukládáním hloubkové informace. Hráč si oblohu nosí neustále sebou, podobně jako tomu bylo v případě skyboxu.

.... Dokončení příště


 

Stáhnout

Staženo 180x (6.09 MB)
Aplikace je včetně zdrojových kódů v jazyce Petr Lite (jsou obsaženy v EXE souboru, který lze v programu přímo otevřít)

 

  Aktivity (1)

Článek pro vás napsal Panda38
Avatar
Programátor C++, WinAPI, ASM.

Jak se ti líbí článek?
Celkem (1 hlasů) :
55555


 


Miniatura
Všechny články v sekci
3D grafika
Miniatura
Následující článek
Metody 3D grafiky (6. část, objekty)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!