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.

Částicové systémy (Particle Systems)


Ten, kdo hrál hru F.E.A.R., jistě ví, že jakmile jste střelili do zdi, objevila se spousta jisker a různého harampádí. To, jestli to vypadalo ve F.E.A.Ru reálně nebo ne, nechám na vašem vkusu, pro nás je nyní důležitý fakt, jak takovéto efekty vznikají. Obvykle jde o velmi jednoduchý princip, např.: kulka letí bezprizorně světem spokojeně si hoví, ale najednou narazí do nebožákovy hlavy resp. jeho helmy. Jakmile se detekuje tato kolize, nejen že se ubere zdraví nepříteli, ale zároveň se začnou emitovat (vytvářet) částice. Tyto částice nejsou nic jiného než jednoduché polygony, které mají předem stanovenou animaci a orientaci vzhledem k pohledu popř. k objektu, který je emituje. Na tyto polygony se namapuje textura, která má například. takovýto vzhled:





Schválně jsem nechal zobrazit šachovnici pod texturou, aby co nejvíce vynikla průhlednost dané textury. Všimněte si, že textura je u okrajů zcela průhledná. Díky tomu se emitovaný polygon při hře netváří jako obdélník, ale jako v tomto případě malinký plamínek s nepravidelným tvarem. Částicové systémy samozřejmě nejsou omezeny jen na emisi samotných jednoduchých polygonů, ale lze emitovat i celé objekty s texturou, pixelshader kódem apod. Takto lze například velice dobře simulovat tekoucí vodu, páru a jiné tekutiny. Zkrátka a jednoduše částicové systémy dotváří různé detaily a bez nich by hra nikdy nevypadala tak reálně. Částicový systém může být třeba i roj much nad mrtvolou nebo hejno ryb v moři.

Částice jako taková však musí mít ještě další vlastnosti, aby vypadala reálně. Obvykle se jí přiřazuje životnost a nějaké dynamické vlastnosti. Například jiskra od odražené kulky může mít takovéto vlastnosti: životnost = 1 s, maximální počet odrazů = 2, kolize s ostatními dynamickými objekty = ne. V obecné řeči to znamená asi toto: Vyemitovaná částice letí podle nějaké předprogramované trajektorii a pokud narazí na zeď, podlahu, či podobný objekt, který se nepohybuje a není příliš složitý (záleží na programátorech jak určí dané objekty), tak se odrazí podle zjednodušených fyzikálních zákonů popř. podle předem připraveného vzorce (obvykle se používá druhá metoda pro ulehčení práce procesoru). Takto se odrazí jednou, maximálně dvakrát a po 1 s přestane existovat. Lze také nastavit postupné mizení této částice, aby nezmizela naráz, což by jistě nevypadalo reálně.

Hra Crysis používá na oko honosný systém SoftParticles. I když se to může zdát jako převratná novinka, tak ve své podstatě nejde o nic extra hi-tech. Je to čisté využití PixelShaderů při zobrazování částicových systémů. Problém obyčejných částicových systémů spočívá hlavně v tom, že pokud je polygon emitován (například simulace kouře), musí být dostatečně velký a prochází různými objekty. Právě toto procházení objekty vytváří dost často ostré hrany, které nevypadají přirozeně a dojem z prachu hodně kazí. NVIDIA se s tím vypořádala celkem kulišácky.





Opět si situaci zjednodušíme do 2D prostoru. Mějme krabici Svět hardware plnou článků o počítačích, kolem které chceme vytvořit trochu prachu, abychom tyto články schovali před konkurencí. Vytvoříme částicový systém, ten se skládá, pro jednoduchost, z jednoho polygonu, na kterém je namapována textura prachu. Tímto by dřívější způsob vytváření prachu končil, ale protože jsme moderní magazín, tak chceme, aby kolem krabice SHW byly SoftParticles. Použijeme tedy PixelShader. Vyšleme paprsek z kamery (pozorovatele) a jakmile dorazí k polygonu částice, začne měřit vzdálenost a pokračuje dál.

Pokud paprsek letí stále dál a dál, tak se zobrazí pixel stejně jako u klasických částicových systémů, To je případ "1". Pokud však paprsek brzy narazí na nějaký objekt (polygon), tak se dle této vzdálenosti pixel trochu zprůhlední (případ "2" a "5"). Pokud je pixel na hranici s dalším objektem, tak se zprůhlední úplně (případ "3"). Případ "4" znázorňuje, kdy je pixel jen lehounce průhledný. V případě "6" se pixel nachází za dalším objektem, a tak není zobrazen vůbec.





Na předchozím obrázku je prezentace SoftParticles dle firmy NVIDIA. NVIDIA v této prezentaci používá křivkové zprůhlednění okrajů, aby co nejvíce eliminovala viditelné hrany, které se mohou vyskytnout, pokud se okraj zprůhledňuje lineárně. To jsou však již pouze drobné detaily a záleží na konkrétním herním enginu, jak naprogramuje PixelShader. Toliko celé tajemství kolem SoftParticles. Tato metoda je ve hře Crysis povolena v DX10 režimu jen protože DX10 umožňuje číst hodnotu Z-buferu v PixelShaderu, a tím hodně usnadňuje výpočet. Efekt jako takový však není problém vytvořit ani na DX9 hardwaru.


SubSurface Scattering


Velice zajímavý efekt, s kterým se setkáváme například u hry Crysis, je SubSurface Scattering (dále jen SSS). O co jde? Velice na pohled jednoduchá věc. Představte si například kuličku hroznového vína a skrz ní se podívejte do nějakého zdroje světla. Kulička jako taková se zdá neprůhledná, ale jakmile ji prosvítíme nějakým světlem, tak získá na objemu a vidíme vlastně vnitřní strukturu kuličky vína. Různé žilky, zrníčka apod. Podobně se chová i lidská kůže. Ač se to zdá asi divné, tak i při běžném pohledu vidíme pod kůží žilky, tukovou vrstvu a někde i kosti. Zkrátka kůže jako taková propouští světlo. Ten, kdo někdy modeloval lidskou postavu v 3D, jistě velmi dobře ví, že vytvoření správného materiálu pro kůži není zrovna žádný med a chce to trochu zkušeností. Vytváří se spousta vrstev (pro žilky, tukové tkáně apod.) a z těchto textur se skládá výsledný materiál.

Podobně na tom je i listí stromů. A jsme u toho. Listí stromů při pohledu do slunce je hodně průsvitné a je v něm vidět žilnatina a řapík. Protože se listy modelují jako velmi jednoduché polygonální modely o max. 20 polygonech, tak je třeba zohlednit tloušťku řapíku jinak. Z tohoto důvodu je zde SSS. Pro SSS vytvoříme další texturu, která představuje "objem" listu a nakreslíme v ní žilnatinu a již zmiňovaný řapík jako tmavší hnědá místa. Naopak čepel je třeba vyplnit hodně světle zelenou barvu, aby nebránila průchodu světla. Další materiál, kde se SSS používá, je vosk, matný plast apod. Masivní použití tohoto jevu je ve hře Crysis, která na tom staví prakticky celý dojem z tropického ostrova. Pokud by zde nebyl aplikován efekt SSS, tak jde v podstatě stále pouze o takový FarCry s lepšími modely, většími texturami apod. Ač se to nezdá, tak efekt SSS je na listí opravdu hodně vidět. Příklad je na následujícím obrázku.




Listy ve hře Crysis využívající SSS


Efekty SSS jsou nejlépe vidět v animacích, kde dobře vidíte, jak se v průběhu času lístek různě zprůhledňuje v závislosti na tom, co se za ním nachází. Proto samotný obrázek nemusí vypadat tak přesvědčivě. Každopádně vzpomeňte si na FarCry, který ještě SSS neměl a listí vypadalo dost prapodivně. Při připomenutí se podívejme na jeden obrázek.




Listy ve hře FarCry bez SSS


3D textury


3D textury se začaly používat nejdříve u jednoduchých světel, které potřebovaly vytvářet jakýsi viditelný kužel. Většinou se však ona 3D textura nacházela na nedůležitých objektech, které nepotřebovaly nikterak vysoké detaily. Tyto textury jsou obvykle ve hře použity v dost malém rozlišení, protože paměť vyžadovaná na jejich uložení je enormní. Pokud má 2D textura s rozlišením 1024x1024 velikost 3 MB, tak v podstatě stejná 3D textura s rozlišením 1024x1024x1024 má velikost 3 GB a to je zkrátka i při cenách DDR2/3/4 pamětí stále moc. Kdybychom ještě nasadili na tuto texturu zvýšenou přesnost (HDR), tak se dostáváme k již prakticky nereálným číslům. Naopak třínásobné zmenšení velikosti přinese jen jeden barevný kanál (pro různé mlhy apod. jeden kanál stačí). Stále však musíme i do budoucna počítat, že 3D textury budou využívány opravdu jen sporadicky a nebudou mít až tak velký podíl na grafických efektech. Stále je daleko jednodušší vytvořit efekt pomocí matematické textury či jinak. Také se dá využít například pixelshaderu, který i z velmi jednoduchého objektu vytvoří velmi dobrý dojem například plamene, kouře apod.