Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

Grafické enginy her a reálný svět

23.2.2012, Pavel Kovač, článek
Grafické enginy her a reálný svět
V tomto článku se podíváme na enginy moderních her, porovnáme si je s reálným světem a se softwarovými rendery. Doba pokročila a dnešní hry již vypadají velice reálně. Čím se tedy liší od reálného světa a moderních rendering systémů? Doplněno o 4 kapitoly.

Depth Of Field (DOF), aneb hloubka ostrosti


Každý, kdo někdy fotil s klasickým fotoaparátem, jistě zná pojem DOF. Hloubka ostrosti (správný český překlad) je také nedílnou součástí našeho života. Proto se tento efekt začal nedávno používat ve hrách. Ve filmařském průmyslu je to jev, kterým se dá zakrýt ledacos, co ve scéně není a navodit tu správnou atmosféru. Také tím upoutáte pozornost na konkrétní místo. Bez DOF bychom jen těžko tvořili např. pěkné fotky či filmy. Pojďme se podívat, jak tento efekt v reálu vzniká.





Celý efekt stojí a padá na velikosti snímacího zařízení. Čím je snímač větší, tím dostáváme menší hloubku ostrosti, naopak menší snímač vytváří hloubku větší. Pokud bychom měli nekonečně malý snímač, hleděli bychom na svět s absolutní ostrostí v celém rozsahu. Např. muška, která by letěla před tímto snímačem, by byla stejně pěkně prokreslená jako mrakodrap v dálce několika kilometrů. Fotografové zde připomenou další vlastnost, která je u nich daleko více diskutovaná. Tím je tato závislost: menší hloubka ostrosti je s menší clonou. tzn. čím je clona blíže 0, tím je hloubka ostrosti menší. Ale to nás v tomto případě moc nezajímá.

Celý problém pro počítač spočívá v tom, že je třeba vysílat paprsky z kamery a tím simulovat klasickou čočku. Čím více paprsků se z kamery vyšle, tím lepší bude kvalita celého DOF efektu. V praxi se tak dost často využívá tzv. Z-Depth mapy. Ta je generována při výpočtu scény a zohledňuje vzdálenost objektu resp. konkrétního pixelu od kamery. Principiálně je tato mapa velmi jednoduchá na výpočet, protože paprsky vysílané z kamery se nikde nelámou a řeší pouze kolizi s jedním objektem. Přesto je třeba vyslat z kamery vetší množství paprsků (záleží na požadovaném rozlišení), a tak si ani toto obvykle hry nemohou dovolit. Můžou např. počítat scénu pro Z-Depth v 1/2 či 1/4 rozlišení a tím si ušetřit spoustu trablů a výkonu pro důležitější části scény. Samozřejmě to přináší i problémy.

První je ten, že taková mapa nemusí zohlednit všechny objekty (paprsek může onen objekt díky nižšímu rozlišení minout), dále je problém s průhlednými texturami. Paprsky totiž obvykle řeší pouze kolizi s objekty a nezohledňují textury. Může se tedy stát, že paprsek skončí v místě, kde je textura průhledná (příklad může být pletivo / tahokov).

Tím bohužel problémy s Z-Depth mapou nekončí. Dalším problémem po průhlednosti textur jsou odrazy. Takové zrcadlo je totiž ve scéně také klasický objekt, ale jeho odraz je vlastně vzdálený obraz a ten pro senzor leží klidně o několik metrů dál. Pokud tedy zaostříte na zrcadlo jako takové, měly by být objekty mimo fokus a opačně. Pomocí Z-Depth se bohužel zrcadlo buď rozmaže celé, nebo naopak celé zůstane ostré i s obrazem v něm.






- problém Z-Depth mapy, který může vzniknout u her -


Hry však používají ještě další berličky. Tento efekt se totiž velmi dobře simuluje např. přidáním desky do scény, která si drží od kamery určitou vzdálenost. Na tuto desku pak stačí aplikovat pixel shader efekt, který rozmazává vše, co je za ní. Tím ovšem vzniká ostrý přechod a rozmazání je konstantní.

Zdá se to velmi nepraktické, ale při použití dlouhého ohniska (např. pokud koukáte dalekohledem) se může tato extrémně rychlá metoda hodit. Pokud ono rozostření totiž uděláte v místě, kde nevidíte okraj scény (a to je při koukání dalekohledem docela jednoduché), tak máte vyhráno. Okraj také můžete schovat v husté trávě, což je příklad Crysis. Může se využít jednoduchého algoritmu, který detekuje kolizi oné plochy a zbytku scény. Poté se již aplikuje gradientní průhlednost na okraj plochy a tím odstranění onoho ostrého okraje. No a máme vyhráno. Dost často jsou používány také gradientní přechody více pozvolné, kdy designéří hry např. při skriptovaných scénách vědí, jak onen gradient nastavit. Např. vědí, že v horní části obrazu se vyskytují jen objekty vzdálenější a čím jsou níže, tím jsou blíže. Stačí jim tedy jednoduchý přechod. To je vidět např. v Crysis 2 hned v úvodu.




- gradientní přechod použitý na simulování DOF v Crysis 2 -


Na následujícím obrázku je červenou barvou znázorněný přechod, který může zhruba odpovídat míře rozmazání. Také si všimněte, že všechny objekty v dálce jsou rozmazané stejně a již nezáleží na jejich vzdálenosti od kamery.




- zhruba takový přechod zde byl použit pro DOF -


Samozřejmě Crysis 2 umí i DOF pomocí Z-Depth, ale nemusí jej používat všude, čímž může ušetřit výkon na jiné části scény.

Poslední verze DirectX 11 přinesla v oblasti DOF pokrok v podobě kvalitnějšího zpracování okrajů. Již nejsou tak ostré a efekt DOF se více podobá reálnému světu. Jde však pouze o drobnou optimalizaci a na principu to nic nemění. Zde bych poukázal na jednu vlastnost marketingu. Je to případ HDAO (Hi-Def Ambient Occlusion), který se tváří jako něco naprosto převratného, avšak jde jen o zpřesnění výpočtu a vyslání většího počtu paprsků. Nic víc, nic míň. Nenechte se zmást marketingem, co vám servíruje. Snažte se spíše pochopit princip věci a nahlížet na něj s adekvátní střízlivostí.

Naopak v renderovaných sekvencích je výpočet efektu DOF prováděn obvykle na základě plné Z-Depth mapy, popřípadě v situacích, které to vyžadují i pomocí RT. RayTracing v tomto případě však znamená značné zpomalení výpočtu. Ať už je použita metoda jakákoli, efekt je výrazně kvalitnější a i lehce trénované oko si hned všimne rozdílu.




- zde byla použita nejspíše Z-Depth mapa -


Pokud se koukneme na největšího rivala CryEngine, tedy Unreal Engine ve své 3. generaci, tak ten má možnost renderu hloubky ostrosti včetně pěkného bokeh efektu. Tato hloubka ostrosti je generována pomocí pixel shaderu na finální snímek. Tento efekt sice umožňuje i CryEngine, ale používá jej pouze v omezeném množství. Příkladem je úprava zbraně.




- DOF v Unreal Engine 3 včetně bokeh se simulací pětilamelové clony -


Ve hrách se z nějakého důvodu používá efekt pětilamelové clony. Fotografové by vám však řekli, že pětilamelová clona je záležitostí levnějších objektivů a obvykle se snaží nevytvářet pětiúhelníkový tvar, ale kulatý. Ve hrách však pro podpoření filmového zážitku se volí právě pětilamelová, asi aby bylo jasné, že jde o bokeh.

Příklad softwarově generované Z-Depth mapy. Pomocí takové mapy můžete např. ve Photoshopu či kompozičním softwaru plynule "zaostřovat" na jakýkoli bod v obraze. Také kvalita rozostření je výrazně vyšší. Ve hrách se obvykle navíc aplikuje jednoduché rozostření, které nezohledňuje přepaly. Na fotkách se totiž při rozostření přepaly ještě zvýrazní, což např. klasický gauss blur neumožní. Jistě uznáte, že zde hry mají stále co dohánět. Naštěstí lidské a netrénované oko si toho obvykle ani tolik nevšimne, takže se těžko v blízké době dočkáme např. plného Z-Depth DOF.




- Z-Depth mapa použita pro generování DOF -




- softwarově generovaný DOF pomocí Z-Depth mapy -


U her je často také problém určit, na co se divák/hráč kouká. Proto se obvykle hloubka ostrosti používá při konkrétních činnostech. Např. pokud nabíjíte zbraň, rozmaže se vše za zbraní, protože vývojáři přesně vědí, že koukáte na zbraň. Ale jak určit ostřící bod při běžném hraní? Pokud by se použil např. zaměřovací kříž, tak dojde ke zběsilému přeostřování. To by šlo vylepšit jakýmsi zpožděním, ale to by zas hráči doslova nadávali, že nevidí nepřítele dostatečně brzo. Je tedy zřejmé, že problematika hloubky ostrosti je u her velmi ošemetná.




- příklad DOF s Bokeh efektem v Crysis 2 -


Motion Blur (rozmazání pohybu)


Často se ve hrách také setkáváme s efektem rozmazání pohybu (Motion Blur - MB). Pokud je tento efekt využit kvalitně a na správných místech hry, tak je velmi příjemný a vlastně pro lidské oko přirozený. Bohužel vývojáři mají dost často sklon tento efekt přehánět a dávat i na místa, kam vůbec nepatří. Typickým příkladem je rozmazání pohybu u závodních her. Dost často se totiž aplikuje rozmazání v jednom směru na velkou část obrazu (typicky skoro vše mimo auta). To je sice efektní, ale naprosto nereálné. Navíc rozmazání pohybu je obvykle přehnaně velké pro umocnění pocitu z rychlosti.

U série Need For Speed je obvykle rozmazání okrajů obrazovky pro navození "tunelu" a tím i pocitu vyšší rychlosti. Na některé hráče tento trik působí velmi dobře. Je tu však druhá skupina, která si tento efekt vypíná. Vadí jí a vlastně ani nemusí vědět proč. Tento Motion Blur je totiž nereálný, a proto jim vadí. Tečka.

Podívejme se však na reálný MB, který se počítá velmi podobně jako např. hloubka ostrosti. Také musí dojít k výpočtu dalšího passu (neboli vrstvy v bufferu). Tato vrstva již není černobílá jako v případě DOF, ale barevná.




- Motion Blur pass, po kliknutí se zobrazí animace -


Na předchozí animaci je vidět příklad výpočtu MB vrstvy v softwarovém renderu. Ve hrách se vrstva počítá velmi obdobně, pouze se využívají triky jako u DOF. Např. snížení rozlišení na polovinu. Intenzita barvy určuje rychlost a odstín směr. Tím engine přesně ví, kam se daný objekt posouvá a může na něj aplikovat konkrétní PixelShader.




- ukázka MB v Crysis 2 -


Na výpočtu rozmazání pohybu v Crysis je dle samotných vývojářů použito poloviční rozlišení. To má za následek vynechání některých detailů, což může vést k nepřesnostem. Ve výsledku si však toho nemáte šanci všimnout. Muselo by se totiž stát to, že se v obraze objeví např. lístek letící před kamerou, který by lehce blikal (pokaždé by se nevešel do výpočtu MB na správné místo). To jsou však tak ojedinělé události, že je vývojáři mohou zanedbat a ušetřit si práci.

U Crysis je efekt MB použit docela s citem a hlavně se zakládá na reálných výpočtech. Proto oproti Need For Speed nepůsobí rušivě. Podobně je zpracován i Motion Blur v Half-Life Episode 2. Zde je navíc aplikován hlavně v případě opravdu rychlých pohybů, a tak si jej ani nemusíte pořádně všimnout.