4. června 2010

Rozdíl mezi viewporty v 3d aplikacích a herními enginy

Často slýchám diskuze o tom, proč 3D programy nevykreslují ve viewportech modely tak kvalitně jako to vidíme v dnešních hrách. Čím to tedy vlastně je? Nabízím zde několik svých úvah.



První, co asi mnoho lidí napadne je, že 3D aplikace při použití třeba pro filmové efekty musí vykreslovat mnohem více polygonů. To je jistě pravda, ale dnešní hry vykreslují najednou v jednom snímku i několik miliónů polygonů. Samozřejmě, k některým způsobům využití 3D programů to nestačí, zvláště když se podíváme na některé z novějších celovečerních filmů jako Avatar. Naproti tomu pro využití např. ve většině reklamních animací by to stačilo. Přesto nejsou dnes tyto aplikace schopné tolik polygonů plynule realtime (v reálném čase) zobrazovat. Herní enginy toho dosahují především mnoha důmyslnými optimalizacemi, které není technicky možné použít v 3D aplikacích.

Především se jedná o datové struktury pro uložení scény, které dovolují vyloučit z vykreslování polygony, které nejsou právě vidět a ušetří se tedy výkon grafické karty. Tyto ale nelze využít v 3D aplikacích, protože ty se snaží nechat umělci volnost a nijak jej neomezovat. V herních enginech totiž tzv. BSP stromy, portal enginy či quad-trees omezují level-designéry v tom, co lze a co nelze vytvořit. U BSP enginů se designér musí rozhodnout co vytvořit pomocí BSP stěn a co použitím modelů. Vytváření těchto stěn je omezeno kvůli optimalizaci na velké málo detailní objemy a třeba na přichycení vertexů k mřížce. Také často není možné vytvářet konkávní tvary, i když to je možné obejít vytvořením pomocí několika konvexních těles.

A co realtime zobrazení shaderů (materiálů) a osvětlení? Nejdříve musím říct, že existují řešení, jak renderovat i velmi realisticky vypadající materiály ve viewportu. V programu 3ds max se pro tento účel využívá shader (nebo spíše modul) "DirectX shader", který nám dává možnost napsat si vlastní shader v některém jazyce jako HLSL ve formátu pro DirectX (*.fx). Na internetu je k dispozici velké množství takových skriptů napodobujících svým uživatelským rozhraním standartní materiály z 3D aplikací. Stačí potom vybrat jednotlivé textury, případně nastavit efekty jako fresnel a materiál se zobrazuje přímo ve viewportu a není třeba jej přerenderovat. Takové shadery často využívají herní grafici pro náhled, jak bude model vypadat v herním enginu. Příkladem může být třeba Xoliul's shader od Laurense Corijna. Většinou je dostupná podpora pro maximálně 3 bodová světla. I samotný 3ds max obsahuje v posledních verzích několik vylepšení vykreslování jako realtime stíny či ambient occlusion, ale často to citelně snižuje FPS ve viewportu.

[caption id="attachment_47" align="alignnone" width="400" caption="Ukázka realtime viewport shaderu (moje tvorba)"]Ukázka realtime viewport shaderu[/caption]

I když jsou tu tedy možnosti vykreslování třeba stínů v reálném čase, stále to samozřejmě má velmi daleko ke kvalitnímu raytrace rendereru především v kvalitě a fyzikální přesnosti. Takové kvality zobrazení ve viewportu zřejmě ještě dlouho nedosáhne. Jedním z řešení může být využití cloud-computingu, jako je to již možné např. v Google SketchUp.

Žádné komentáře:

Okomentovat