Vývoj aplikací v Unreal Engine | Optimální nastavení projektu

Vývoj aplikací v Unreal Engine | Optimální nastavení projektu Tagy: Software, Vývoj aplikací
| Publikováno dne

Poslední úprava dne

Vývoj 3D real-time her a aplikací je poměrně náročnou disciplínou propojující dohromady 3D grafiku, zvuk, animace a přímou (uživatel-aplikace) i nepřímou (aplikace-aplikace / aplikace - vnější input) interaktivnost v rámci "obecně" definovaného, událostmi řízeného, funkčního designu. Z charakteristiky real-time, veškeré toto dění je vyhodnocováno, procesováno a řízeno v mžiku milisekund.

S dostupnými herními enginy Unreal a Unity má dnes každý tvůrce přístup ke špičkovým nástrojům využívaným v tvorbě AAA her, Holywoodských filmů, živých vysílání i profesionálních vizualizací a simulací. Rozdíl mezi nejvyšší možnou a běžnou kvalitou není v první řadě definován dostupnostmi technologií, ale znalostmi tvůrců při jejich tvorbě, aplikaci a nastavení. Tento článek je jakousi mou znalostní bází určenou pro mě, mé kolegy a jakékoli další tvůrce. Cílem je shrnout důležité, přínosné a ověřené informace nejen ohledně vývoje VR aplikací v Unreal Engine přehledně na jednom místě. Z důvodu omezení datového typu 'text' (65,535 znaků) používaného pro ukládání blogových příspěvků zde na vrapps je článek rozdělen do několika navazujících článků.

Než začnete používat Unreal Engine

Základní informace o herním enginu a příklady oborů jeho využití jsou na oficiální stránce UnrealEngine.com. Informacemi nabité jsou rovněž videa dostupná na oficiálním YouTube kanále. Skvěle zpracovaný vzdělávací obsah naleznete na https://learn.unrealengine.com, dokumentaci na https://docs.unrealengine.com. Pro přístup k oficiálním diskuzním fórům je třeba být přihlášen pod Epic games účtem, pro přístup ke všem zdrojům na GitHubu (včetně zdrojového kódu Unreal Engine) je nezbytné stát se ověřeným vývojářem Unreal Engine. Toho docílíte přihlášením se do účtu Epic Games a propojením svého licencovaného účtu Epic Games se svým GitHub účtem. Mimo vše výše zmíněné a řadu dalších skvělých zdrojů, své poznatky ohledně práce s Unreal Engine shrnuji rovněž na Unreal Engine Wiki webu Vrealmatic.com.

V enginu se programuje ve vizuálním skriptovacím prostředí Blueprints postaveném nad C++. C++ lze stále používat jednak pro rozšiřování funkcí Blueprints, jednak i jako výchozí programovací jazyk. Používání Unreal Engine je do prvního vydělaného milionu dolarů zdarma. Stáhnout si jej můžete z webu Unreal, čímž rovněž do počítače nainstalujete "správcovskou" aplikaci Epic Games Launcher. Alternativní instalací je vykompilování si Unreal Enginu ze zdrojového kódu pomocí Visual Studia. Tímto způsobem se zbavíte závislosti na Epic Games, stejně jako získáte možnost kompilování customizovaných verzí Unreal enginu.

Nastavení projektu v Unreal Engine

Výchozí nastavení

Při zakládání nového projektu v Unreal Engine (délka názvu a cesty projektu je omezená, snažte se ji držet co nejkratší - optimálně na úrovni vyhrazené diskové jednotky) je na výběr z 5 základních kategorií:

  • hry
  • film, televize a živé vysílání
  • architektura, strojírenství a konstrukce
  • automotive, produktový design a výroba
  • Simulace

Po zvolení výchozí kategorie následuje souhrn šablon relevantních využití v rámci kategorie. Po volbě konkrétní šablony, případně prázdného projektu (neobsahuje demo a aktivované vybrané built-in pluginy) následuje konečná obrazovka výchozího nastavení projektu. Její možnosti se v závislosti na zvolené kategorii liší, nicméně jejími možnostmi jsou zpravidla výběry:

  • defaultního programovacího prostředí (Blueprint / C++)
  • platformy (Desktop (Console) / Mobile (Tablet))
  • požadované výstupní kvality (maximální / scalable) a Raytracingu (zapnut / vypnut)
  • zahrnutí základní obsahové knihovny do scény (Ano/Ne))

Automatické výchozí nastavení Unreal Enginu na základě parametrů z odstavce výše konfiguruje určitá nastavení a funkce Unreal Enginu a tím zásadním způsobem snižuje čas nastavení projektu. Toto předdefinované nastavení však nemusí být v mnoha ohledech optimální - pro dosažení maximálního výsledného efektu je vhodné jej doladit na základě parametrů konkrétní platformy a aplikace. To je možné prostřednictvím okna Project Settings (Edit → Project settings). Ještě předtím se však ujistěte, že máte aktivovány veškeré (pro nynějšek) potřebné pluginy v Edit → Plugins. V průběhu změn prováděných v rámci pluginů a nastavení projektu Unreal Engine vyžaduje restartování - restart není potřebný po každé změně → restart enginu proveďte až po dokončení všech změn.

Průvodce důležitými parametry v Project settings

Rendering

V Unreal Engine je výchozí metodou renderování Deferred rendering. Přepnutí na Forward Rendering se provádí zaškrtnutím boxu "Forward Shading" v [Project Settings / Engine / Rendering / Forward Renderer]. Před výběrem správného rendereru pro konkrétní VR aplikaci se vychází z následujících otázek:

  1. Kolik ms můžeme strávit na render 1 framu? V jakém rozlišení?
  2. Kolik světel potřebujeme na prostor 1px a jaká je preferovaná metoda stínů?
  3. Jak komplexní materiály jsou vyžadovány, jaká je preferovaná Anti-aliasing metoda?
  4. Na jaká zařízení je aplikace určena?
Deferred Rendering

Deferred rendering existuje v několika typech, přičemž všechny se spoléhají na ukládání dat v textuře - tzn. ke každému pixelu jsou přiřazeny materiálové parametry (color, roughness, surface normal).

Classic Deferred Shading
  1. objekty jsou renderovány s pixelovým shaderem vydávajícím materiálové attributy
  2. stíny jsou vypočítány pomocí G Bufferu a světelných informací

Deferred Rendering umožňuje práci s materiálovými attributy, světlem a tóny odděleně a tím dosahuje jednoduššího kódu a dobrého výkonu u složitých materiálů s působením mnoha světelných zdrojů. Nevýhodou je vyšší využití paměti při čtení a zápisu - jejíž zatížení roste s rozlišením (tedy u mobilních VR aplikací může být problém s pamětí). U deferred shadingu je však problém s anti-aliasingem. Multisample anti-aliasing lze použít s G Bufferem, avšak s tím roste náročnost a zvýšený požadavek na potřebnou paměť. V UE4 navíc není nativní podpora.

Classic Forward Rendering

Klasický Forward Rendering je rendering dostupý pod již zmíněnou možností [Project Settings / Engine / Rendering / Forward Renderer]. Při tomto renderingu je geometrie renderována na základě trojůhelníkové mřížky, přičemž pro každý zahrnutý povrchový pixel GPU počítá finální RGB barvu na základě textury, materiálových atributů a světelných dat.

V případě venkovních scén jsou světelná data od slunce na všech objektech. Lokální světla jsou složitější pro kontrolu a výkon - proto je důležité volit vhodně jejich dosvit (= omezení počtu objektů, jejichž povrch je daným světelným zdrojem ovlivněn).

Cluster Forward rendering

Clustered Forward Rendering využívá dynamického větvení a hiearchie světla. Při runtime renderingu umožňuje efektivní vyřazení světla bez velkého dopadu mezilehlé vyrovnávací paměti (např. G Buffer) na přímý výstup barvy RGB → tím šetří využití paměti a jako benefit umožňuje využít v GPU zabudovaný Anti-alising hardware, v tomto případě MSAA.

Přepínání mezi Deferred a Forward Renderingem

Při samotném přepnutí aplikace z Deferred do Forward renderingu a naopak se výkonové změny nemusí v komplexních scénách viditelně projevit. K projevům může dojít až s redukcí aktivních funkcionalit - například použití odlesků jen na zvolených objektech (zrcadlo) namísto všech (kliky dveří, podlahy, vodní hladina...). Velký vliv může mít rovněž zakázání stínů od skyboxu atd. Vyhodnocování renderovací náročnosti konkrétních prvků se bude věnovat kapitola výkonová optimalizace.

Fixed Foveated Rendering (FFR)

Fixed Foveated Rendering, zkráceně FFR, lze zjednodušeně chápat jako nástavbu klasického Deferred a Forward renderingu. Oproti zmíněným, nastavuje se v záložce Oculus v projects settings, řídit lze i dynamicky prostřednictvím Blueprint nodu Set Fixed Foveated Rendering Level (případně C++ předpisu). Podporovaný je aktuálně pouze pro mobilní VR (stand-alone aplikace pro Quest).

Účelem FFR je šetření výpočetního času pixelového shaderu (pixely jsou počítány prováděním fragmentových operací, jejichž počet roste s rozlišením displejů, které je u VR velmi vysoké), a to tím způsobem, že na základě využití GPU snižuje rozlišení po okrajích (v periferní části) obrazovky. Zjednodušeně řešeno, rozlišení klesá s postupným vzdalováním se vyobrazených objektů od středu displeje do jeho periferních oblastí. FFR je určeno především pro mobilní platformy, na Oculus Quest je podporováno. Více informací, společně s popisem nastavením 4 FFR levelů je jednoduše popsáno v Oculus dokumentaci pro FFR.

Při FFR se záměrně aplikuje dithering (forma šumu používaná k randomizaci chyby kvantizace, která brání tvorbě vzorů ve velkém měřítku, jako jsou např barevné pruhy v obraze), ovšem při přepínání úrovně kvality FFR nedochází k prolínání stavů před a po, což může vyústit v tvorbu nechtěných vzorů o ještě vyšší intenzitě, než kdyby se dithering nepoužíval vůbec. Z toho důvodu je dobré vyhnout se ditheringu pomocí FFR. FFR je kompatibilní s MSAA. Více informací v Oculus dokumentaci pro vývojáře.

Rendering Hardware Interface (RHI)

Starší grafické API jako Direct X před verzí 12 a Open GL umožňují omezenou kontrolu enginu nad zprávou vykreslování. Vedle toho mají obvykle dopad na vyšší zatížení. Z toho důvodu je nutné (je-li to možné) v "Project Setings / Platforms / Konkrétní platforma (např. Windows) / Targeted RHIs / Default RHI" nastavit možnost Direct X 12 nebo Vulkan.

Anti-Aliasing

Anti-aliasing je řešení pro eliminaci zubatých hran (jagged edges) a flickerringu. Anti-Alising lze dosáhnout renderem obrazu ve vyšším rozlišení (např. 4x) a jeho následném zmenšení. To ovšem není efektivní, protože v takovém případě je potřeba přepočítat (např. 4x) více pixelů. Proto se používají různá efektivnější řešení. Anti-aliasing se řeší pro objekty, stíny i textury. Unreal Engine nabízí hned několik řešení pro Anti-aliasing, jejichž podpora se liší v závislosti na aktivní metodě renderingu. Anti-Aliasing lze nastavit v "Project Settings / Engine / Rendering / Default Settings / Anti-aliasing Method".

Multisample anti-aliasing (MSAA)
  • MSAA se vyhýbá potřebě zvětšování aplikací duplikováním hodnot barev do 4 sub pixelových regionů dle toho, zda primitiv pokrývá subpixel. Tento další subpixel šetří čas exekuce fragmenového shaderu, ale stále využívá 3x více paměti → tzn. že MSAA řeší pouze primitivní aliasing, ale nemá žádný efekt na aliasing textur a stínů.
  • Anti-aliasing textur lze řešit použitím mip map a kvalitním filtrováním. Pro generování mip map je nutné držet velikost textur v násobcích 2 v rámci spektra 64, 128, 256, 512, 1024, 2048... Textury mohou mít tvar čtverce (např. 512x512) i obdélníku (např. 256x512).
  • MSAA není schopna řešit anti-alisingu stínů. Unreal Engine 4 pro to nabízí techniku, která opravuje Specular Shimmering (zrcadlové třpytky) s Composite textures funkcí.
Temporal Anti Aliasing (TAA)
  • vyžaduje souběh několika framů k dosažení dobrých výsledků. Toho není docíleno u objektů, jež jsou čerstvě zobrazený (např. Vstupem do zorného pole). V takovém případě trvá pár framů, v jejichž průběhu je dosaženo ostrosti. K opětovnému rozmazání může vést rychlý pohyb a pohyb přes neostrý obsah.
  • funguje s Deferred Shading a opravuje více aliasing problémů než MSAA, např. zrcadlový aliasing.
  • spoléhá na zpětnou vazbu s vyrovnávací pamětí pro celou obrazovku, což má vyšší dopad na výkon u VR
Fast Approximate Anti-Aliasing (FXAA)
  • nemá omezení zpožděné konvergence
  • spoléhají se na zpětné čtení cílového obsahu - jsou paměťově náročné (nevhodné pro mobilní zařízení)
  • mají výhody při používání mnoha funkcí
  • forward rendering může být modifikován k poskytnutí dobrých funkcí s nižším důsledkem na výkon

Occlusion Culling

Occlusion Culling je metoda renderování pouze uživateli viditelných objektů. Aktivovat a konfigurovat lze v [Project Settings / Engine / Rendering / Culling]. Technicky se vychází z View Frustrum Culling - pracuje se s těsně předpočítaným ohraničujícím rámečekem kolem každého objektu proti kolmici pohledu uživatele. View frustum je definováno hranami obrazovky a polohou kamery. Ve VR engine může počítat jedno frustum pro obě oči.

Occlusion Culling může poskytnout dodatečné šetření zdrojů. Kontrola viditelnosti objektů probíhá a je vyhodnocována v runtime. Změny viditelnosti objektů probíhají v rámci více framů, čímž jsou částečně vyhlazeny výkonové špičky při změně viditelnosti jednotlivých objektů. Proces Occlusion Culling sebou nese samozřejmě určitou výkonovou zátěž.

Efektivnějším řešením oproti Occlusion Culling může být manuální přednastavení s použitím PreComputed Visibility Volume, což jsou aktory které drží stav viditelnosti objektů a jejich pozice ve scéně na základě polohy kamery hráče. Jsou zabuildovány v aplikaci. Pro jejich funkci je nutné povolit možnost [Precomputed Visibility] v okně [Widnow / World Settings].

Správa viditelnosti objektů má nejvyšší přínos ve scénách s vysokým počtem vzájemně zakrytých objektů. S jednotlivými objekty není potřeba pracovat samostatně - lze jej seskupovat (přes merge actors) do logických celků a tím zásadním způsobem redukovat počet draw callů.

Best practices v nastavení projektu

  • Unreal Engine pracuje s metodou tzv. Uber shaderu vycházejícího z implementace obecného shaderu customizovatelného skrze Shader Permutations. Ty lze aktivovat a deaktivovat v nastavení projektu, přičemž Unreal Engine poté na základě zvolených Shader Permutations vykompiluje konečný shader. Jde o efektivní řešení, nicméně kompilace nových shaderů je časově náročná. Provádějte tedy ideálně více změn relevantních nastavení shaderů současně pro eliminaci zbytného kompilačního času. Mimo shaderu generovaného Unreal Enginem lze pracovat i se speciálním shaderem. Jeho přínos může být při potřebě dynamického větvení ve shaderu nebo určité funkcionality svázané s materiály.
  • Jestliže je cílení na vysoce výkonné PC a maximální možnou grafickou kvalitu, za zvážení stojí Deferred forward rendering s FXAA. (Forward Renderer v UE4 má omezené množství funkcionalit. Některé z nich mají vysoký dopad na výkon a neměly by být použity. Jiné zase ještě nemusí být implementovány.)
  • Pokud se vyvíjí aplikace pro mobilní platformu, jako Quest - je možnost použít jednodušší lighting model oproti standardnímu. Toho se docílí deaktivací sofistikovaných světelných shaderů v Project Settings → Shader Permutation shaders. Nejvyššího přínos je u aktivního Forward Shadingu (zahrnuje Stímy, typy světel, typy materiálů, Tone mapování do jednoho průchodu shaderu). (Deferred Shading rozděluje materiálové attributy, světla a tóny do rozdílných průchodů.)

Příklad nastavení projektu pro VR (Project Settings)

Renderování virtuální reality má oproti klasickým aplikacím pro PC a telefon určitá specifika - tím nejzásadnějším je potřeba velmi rychlého a stabilního renderu ve vysokém rozlišení na dvojici displejů. To vyžaduje zaměření na co nejvyšší výkonovou optimalizaci při dodržení požadované vizuální kvality. S dvojicí displejů souvisí i vyšší 3D perspektiva vnímání prostoru (2 displeje pro oči dodávají vyšší schopnost vnímání hloubky těles). Nutností při VR vývoji je rovněž mít aktivovaný některý plugin přinášející potřebné VR funkce a umožňující běh aplikace ve VR módu.

  • Forward Shading [enable] - umožňuje rychlejší a efektivnější renderování z důvodu zakázání funkcí, které nejsou obvykle ve virtuální realitě potřeba.
  • Motion Blur [disable] - rozmazává výhled kdykoli dochází k pohybu kamery (hlavy uživatele). Tím je ve VR velmi nekomfortní. Navíc, není podporován při aktivním Forward Shadingu
  • Instanced Stereo [enable] - umožňuje sdílení určitého množství dat při renderingu mezi dvojicí obrazovek VR headsetu. Výsledkem je snížení počtu a času odbavení draw požadavků.
  • Anti-Aliasing Method [MSAA] - MultiSample Anti-Aliasing poskytuje dobré výsledky na většině GPU (vyjma GPU s velmi nízkou pamětí). Účelem MSAA je vyhlazení hran (jaggies).
  • Smooth Frame Rate [Disable] - funkce je určena pro situace, kdy je cílový hardware a FPS proměnné. V případě snahy držet stabilní uzamčený frame rate je vhodné tuto funkci zakázat,
  • Use Fixed Frame Rate [Disable] - tato funkce se snaží udržet zvolené FPS s pomocí modifikace "rychlosti plynutí času"
  • Custom TimeStep [None] - Tato funkce je pro aplikace vyžadující přesný čas mezi 2 framy. To u běžné VR aplikace (ne simulace) není potřebné.
  • Occlusion Culling [enabled] - Unreal bude automaticky renderovat pouze viditelné objekty nacházející se v zorném poli
  • Start in VR [enable] - automatické spouštění gameplay sessions ve VR
  • V menu Supported platforms aktivovat pouze relevantní platformy.
  • V nastavení platformy nastavit Default RHI na [Direct X 12] nebo [Vulkan]
  • U mobilních / Android zařízení (Oculus Quest 2 - standalone běh). Možnosti v případě PC VR jsou ignorovány.
    • Mobile HDR [disabled]
    • Single-Pass linear rendering [enabled]
    • Mobile Multi-view [enabled]. Mobile Multi-view řeší neefektivitu vícenásobného vykreslování poskytnutím optimalizované cesty pro stereofonní vykreslování na mobilním zařízení, zjednodušeně umožňuje vykonávání jednoho multiview draw callu pro oba displeje VR headsetu namísto 1 draw callu pro každé oko. Dále vylepšuje "Instanced stereo" rendering. Pro možnost užití je nutnost mít zakázáno "Mobile HDR". Společně s mobile multiview direct [enabled] je zajištěno snížení výpočetních nákladů na odesílání draw calls do CPU o 50%.
    • V případě cílení na Oculus Store vložit se držet průvodcem dalšího nastavení. (vložení App ID, aktivace pluginů atd.)
    • Namísto standardního světelného shaderu je možnost použít jednodušší lighting model. Jeho "aktivace" se provede deaktivací sofistikovaných světelných shaderů seskupenách v sekci Shader Permutation Reduction
  • U PC VR
  • Blueprints nativization: V nastavení výpočetně náročných Blueprints nastavit možnost Nativize [Enabled]. Současně povolit nativizaci v Project Settings - Blueprint nativization method [Exclusive]. Celkovou výkonovou spotřebu Blueprints lze rychle zjistit přes konzolový příkaz "stat game".

Další typy lze najít v dokumentaci Oculus.

Pokračujte v čtení knihy na dalších stránkách blogu: