25. 2. 2013

Killzone "screen space" podfuck


Jasné, že som dopredu vedel, že herná časť KZ:SF videa bude stáť za bačkoru, sústredil som sa teda iba na grafické finesy. Medzi nami, podľa mňa ide o značne updejtovaný KZ3 engine /forward plus deferred renderer/ a ešte to nemá nič spoločné s pravým DX11+ GPGPU next gen enginom post PS3 éry. Takže video. Letíme nad mrakodrapmi. Krasná draw distance, baráky, stromčeky, futuristické vnášadlá, mesto vyzerá luxusne, ide však len o jednoduché instancované krabice a textúry, zlúčené batch draw calls, pravdepodobne iba jednoduchý environmentálny mapping na sklenených stenách. Fajn transparencie, volumetrické light shafts, nah asi len ďalší sreen space postefekt, pravdepodobne trochu MSAA ale evidentne aj post efektové screen space AA.

Pristávame. Trochu topornej animácie panduľákov, dokonca niečo ako sprite animácia v diaľke, sem tam doskočenie tieňa /CSM - cascaded shadow maps/, ne-antialiasované transparencie, subsurface scattering nevidím, god rays, anamorfné lens flare, srať na vás, depth alfa sorting, pekne ale to je v AMD grafikách už od piatej generácie. Poďme, poďme. Hups a toto je čo ? Odrazy v reálnom čase /1:40 min, video nižšie/. Počkať. Nie to bude iba pseudo reflexia, ďalší enviromentálny mapping, banálna textúrka, odraz seba predsa v naleštenej ploche predsa nevidím. Displacement mapping, bokeh DOF, velocity per pixel motion blur, hlavne objektový. Bloom, jasne. SSAO /screen space ambient occlusion/ ako na starej dobrej PS3, chacha. More grafických techník, naraz na jednom mieste, polovicu som ani nespomenul a všetko krásne plynulé.


"Hej, seržo - daj cigaretľu" - /3:55min/

Doprdele /6:30 min/. Červená stopovka  po hodenom granáte sa predsa jasne odrazilo na lesklej stene vpravo a dokonca aj následný výbuch a dym !! Bingo SSR /screen space reflections/. Okey už vás nebudem ďalej ťahať za fusekľu. Pohovorím teraz niečo o tom screen space bazmeku, ktorého je plný internet. Čo to do pekla vlastne je ? Stručná odpoveď - svinská fake finta a každý, kto do toho trochu vidí ju preklína.

World space, viewport space, screen space. Nomenklatúra sa podľa zdroja líši. Ja vám to poviem po svojom. World space je priestor, kde žije sám engine hry. Renderuje, ak mu to nepoviete inak, krajinu a objekty ad infinitum. Do nekonečna a ešte ďalej. Každý šuter, kvet, okno, stĺp, mláku. To by samozrejme neutiahol žiaden hardvér. Engine teda musí vedieť kde sa nachádzate vy ako pozorovateľ a čo vlastne vidíte. Viewport space je teda pohľad cez šošovku kamery, ktorou je vaše oko. Ak teda stojím na ulici a technicky nevidím za múr /oklúzia/, všetko za ním engine pustí z hlavy /culling, clipping, hidden surface removal/. To značne redukuje nároky na systémove požiadavky. Stále to však nie je dosť. Ide o bilióny virtuálnych pixelov, keď čumím v GTA z jedného brehu rieky Hudson na celý Manhattan.

A tu nám pomôže screen space. Projekcie 3D sveta na 2D tienidlo obrazovky !! Zrazu sa nám to scvrkne iba na nejakých 1920x1080 pixelov a to už nejako zvládneme. Múdre hlavy totiž prišli na to, že screen space sa dá použiť na aproximáciu world/viewport efektov /sú enormne náročné na výkon, pamäť a priepustnosť/. Príklad SSAO /screen space ambient occlusion/ - dodá objektom/detailom lepšiu hĺbku, ukotví ich v priestore. Pravá AO je príliš náročná, ide vlastne o tiene vrhané nepriamym nasvietením. V preklade - auto v tieni pod stromom vrhá napriek tomu ďalší vlastný tieň pod seba, aj keď naňho slnko priamo nesvieti. Fake SSAO si predstavte ako vyfarbený obrázok auta na ktorý priložíte priehľadnú fóliu so sekundárnymi tieňami /pod autom, disky kolies, v prehlbinách na karosérii/. Pozor. Screen space efekt existuje iba z pohľadu vás ako uživateľa, je prísne "pohľadovo závislý". Je vlastne možné povedať, že engine sám ten efekt zo svojho word space uhla nevidí !! Zlé SSAO spoznáte tak, že je ho vidieť aj na priamom slnku, pri priamom nasvietení /je to mor dnešných hier, viď Far Cry 3, ten čierny obrys je tam doslova za každých okolnosti/.

Výhody screen space efektov /AA, AO, reflexie atď./ sú zjavné - je úplne jedno aká je geometrická komplexnosť scény, ide predsa iba o počet pixelov na obrazovke /2D screen space/. Ide vždy o pixel shader efekt, spotreba pamäte je teda nízka. Dobre to funguje aj s dynamickou scénou. Všetko je na strane GPU, nezaťažujete CPU. Ľahko integrovateľné do akéhokoľvek enginu, časti rendereru. Ide predsa len o tú "priehľadnú foliu" nalepenú na finálny framebuffer.

Nevýhody SS efektov vyplývajú z neschopnosti pracovať s depth bufferom. Tie efekty proste nevidia hrany alebo hĺbkové súvislosti medzi časťami obrazu /že tu končí pleco postavy a ďalší pixel už patri 5 metrov vzdialenému pozadiu je SS efektu úplne fuk, preňho je to iba "ďalší pixel"/. Ešte raz sa pozrite na video s tým odrazom od 1:40 min. Screen space zrkadlo odrazí jedine a iba objekty medzi vami a zrkadliacou plochou.  Vy sám a všetko ostatné mimo screen space je neviditeľné za týmto magickým priestorom vo world space. SS zrkadlo vás nevidí, čo viac, nevidí nič čo nevidíte aj vy. Hehehehe. Ak teda medzi vami a zrkadlom je stĺp a na jeho zadnej strane je porno plagát - zrkadlo ho neukáže, rovnako ako ho neuvidíte aj vy zo svojej pozície. Pri screen space efektoch sa bez výnimky dočkate záplavy artefaktov. Klasikou je trendový antialiasing MLAA, FXAA /screen space postefekty/ - nevedia pracovať so subpixelami, majú k dispozícií iba screen space /MSAA naopak aj subpixel vzorky/. Artefaktom je teda pixel crawling/shimmering. Screen Space AA proste skáče po celých pixeloch aj keď sa sám obraz hýbe po subpixeloch.

Všetko. Nie, ani zďaleka. Už dlho sa pracuje na tom ako napríklad spojiť SS efekty s MSAA jednotkou /vie nám dodať depth parametre/ a už tu máme Depth-based screen-space effects and multisampling a keď si nasliním prst a vytiahnem staršie GPU GEMS 3 - kapitola High-Speed Off Screen Particles.  Alebo použijeme Sobel filter /hľadá hrany, "vidí hĺbku"/, následne stencil masku-buffer. Najnovšie DX11+ API ide ešte ďalej. Nesnažím sa vás opäť zmiasť, ide skôr o tom, že keď v KZ:SF vidím podobné screen space /zrkadlové/ efekty mám chuť tam aspoň hodinu stáť a študovať ako presne to urobili, čo sa tu vlastne deje. Je tam zjavne ešte kopa ďalších nuáns, znovupoužitie dát medzi dvoma rôznymi frejmami, je tu aj čudná distorzia efektu, latencia a ani sa nepýtajte, čo sa stane, keď sa ocitnú dva také plochy oproti sebe. Časový paradox a koniec vesmíra.