complete
All checks were successful
CI / Build thesis PDFs (pull_request) Successful in 2m2s
CI / Verify PDF/A (pull_request) Successful in 1m52s

This commit is contained in:
Oleg Petruny 2025-07-06 21:26:40 +02:00
parent 77bae7eef1
commit 1433255d64
2 changed files with 107 additions and 98 deletions

204
ch2.tex
View File

@ -183,62 +183,69 @@ Již teď je možné předpovědět co~nebude kompletně fungovat nebo~nebude fu
\section{Grafika}
\label{sec:graphics}
\subsection{Statické objekty}
Engine disponuje modely základnich tvarů (krychle, koule, valec) a navíc lze zdarma vzít libovolné assety z balíčku Starter Content\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/starter-content-in-unreal-engine} nebo assety použité v demo projektech společnosti Epic Games. Přestože assety mají souvislý styl, většinou jsou zaměřeny na konkretní prostředí, a proto v další hře nemusí najít využití. Zřejmě lze nahrát ze souboru a nastavit vlastní modely, které lze ručně vytvořit nebo obstarat na libovolné online platformě.
Engine disponuje modely základních tvarů (krychle, koule, válec) a~navíc lze zdarma vzít libovolné assety z~balíčku Starter Content\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/starter-content-in-unreal-engine} nebo~assety použité v~demo projektech společnosti Epic~Games. Přestože assety mají souvislý styl, většinou jsou~zaměřeny na~konkrétní prostředí, a~proto~v~další~hře nemusí najít využití. Zřejmě lze nahrát vlastní modely, které~lze~ručně vytvořit nebo~obstarat na~libovolné online platformě.
V Unreal Engine verze 5 navíc přidali bohatý na funkcionality editor 3D modelů. Tvůrci propagují editor tak, že v něm lze vytvářet vlastní modely, protože množina funkcí dovoluje tvořit hardsurface a sculpting modely, ale aktuální provedení není dostačujíci a je v nesrovnání s dedikovaným softwarem. Drobné pouhé editovácí funkce na druhou stranu jsou užitečné a šetří čas. Ty umožňují například editování UV map, normalových vektorů ploch nebo změnu středového bodu modelu. ,,Best practice'' je využití tohoto editoru pouze v případě nouze (například časová výhoda nebo neexistence původního souboru), jinak je v dlouhodém měřítku prospěšné editovat původní verzováný soubor.
V~Unreal Engine verze~5 navíc přidali funkčně bohatý editor 3D~modelů. Tvůrci propagují editor tak, že~v~něm lze vytvářet vlastní modely, protože~množina funkcí dovoluje tvořit hardsurface a~sculpting modely, ale~aktuální provedení není~dostačující ve~srovnání s~dedikovaným softwarem.
\newpage
Drobné editovací funkce na~druhou stranu jsou~užitečné a~šetří čas. Ty~umožňují například editování UV~map, normálových vektorů plošek nebo~změnu středového bodu modelu. ,,Best practice'' je~využití tohoto editoru pouze v~případě nouze (například časová výhoda nebo~neexistence původního souboru), jinak~je~v~dlouhodobém měřítku prospěšné editovat původní verzovaný soubor.
\paragraph{Použití cizích assetů} Rychlejší a občas jednodušší je získání assetů třetí strany. K tomu existují různé volně dostupné webové platformy. Jednou z takových platforem je FAB\footnote{https://www.fab.com/}, který navíc má přímou integraci s UE 5. Objektivně FAB nemá dostatečně velký výběr assetů, jelikož nemá ani dostatečnou popularitu vývojářů a tvůrců. Přičinou jsou hlavně větší platformní marže z prodeje a sice jednoduchý, ale přesto nevýhodné licencování produktů pro kupující stranu. Tyto a další problému popisují i jiný uživatelé na forumech\cite{fabRealityCheck}.
Z finančních důvodu, v této praci byli využite pouze produkty dostupné zdarma. Neznamená to, že vše skončí pouhým stahnutím souborů a vložením do editoru. Často (v této práci všech 100%) assety nevypovídají žádnou známku optimalizace nebo profesionální tvorby. Modely tak mají některé normaly plošek invertované\footnote{Invertováné normály plošek jsou při tvorbě obejktů běžné a triviálně řešitelný problém, který často způsobuje že ploška v scéně ,,není vidět'', jelikož se vykresluje pouze ve viditelném směru normalového vektoru a tedy vytváří ,,díry'' v objektu.}, středové body jsou nesmyslně mimo, textury a UV mapy je potřeba kompletně předělat. Nejhorší jsou primitivní objekty, které mají bezdůvodně velké množství vrcholů. V praxi se nachází i náhodné vrcholy bezúčelně existující v prostoru modelu.
\paragraph{Použití cizích assetů} Rychlejší a~občas jednodušší je~získání assetů třetí strany. K~tomu~existují různé volně dostupné webové platformy. Jednou z~takových platform je~FAB\footnote{https://www.fab.com/}, která~navíc má přímou integraci s~UE~5. Objektivně FAB nemá dostatečně velký výběr assetů, jelikož nemá ani~dostatečnou popularitu vývojářů a~tvůrců. Příčinou jsou~hlavně větší platformní marže z~prodeje a~sice jednoduchý, ale~přesto nevýhodné licencování produktů pro~kupující stranu. Tyto a~další problémy popisují i~jiní uživatelé na~fórech\cite{fabRealityCheck}.
\paragraph{Vlastní tvorba} Vlastnoručně jsou tvořeny modely ze staré verze hry a během vývoje této práce se pouze upravovali nebo tvořili textury. Standardem v oboru jsou obecně Maya\footnote{https://www.autodesk.com/products/maya/overview} nebo 3ds Max\footnote{https://www.autodesk.com/products/3ds-max/overview} pro všeúčelové zpracování a úpravy, ZBrush\footnote{https://www.maxon.net/en/zbrush} pro sculpting a Substance Painter\footnote{https://www.adobe.com/products/substance3d/apps/painter.html} pro texturování objektu. V tomto projektu byl použit výhradně Blender\footnote{https://www.blender.org/} a software pro editaci obrazkových formátů, které jsou k dispozici na internetu zdarma. Výsledný model lze často bez problémů rovnou využít v enginu.
Z~finančních důvodů, v~této praci byly využity pouze produkty dostupné zdarma. Neznamená~to, že~vše~končí pouhým stahováním souborů a~vložením do~editoru. Často (v~této práci všech~100\%) assety nevykazují známky optimalizace nebo~profesionální tvorby. Modely tak~mají některé normaly plošek invertované\footnote{Invertované normály plošek jsou při~tvorbě objektů běžné a~triviálně řešitelný problém, který~často způsobuje, že~ploška ve~scéně není vidět, jelikož~se~vykresluje pouze ve~viditelném směru normálového vektoru a~tedy vytváří ,,díry'' v~objektu.}, středové body jsou~nesmyslně mimo, textury a~UV~mapy je~potřeba kompletně předělat. Nejhorší jsou primitivní objekty, které~mají bezdůvodně velké množství vrcholů. V~praxi se~nachází i~náhodné vrcholy bezúčelně existující v~prostoru modelu.
\paragraph{Modeling a Sculpting} Nejprv se vytvaří tvar modelu. Toho se docíli pomoci modelování polygonů nebo sculptingu. Obě metody jsou velmi odlišné a stejně tak mají odlišný výstup.
\paragraph{Vlastní tvorba} Vlastnoručně jsou tvořeny modely ze~staré verze hry a~během vývoje této práce se~pouze upravovaly nebo tvořily textury. Standardem v~oboru jsou~obecně Maya\footnote{https://www.autodesk.com/products/maya/overview} nebo~3ds~Max\footnote{https://www.autodesk.com/products/3ds-max/overview} pro~víceúčelové zpracování a~úpravy, ZBrush\footnote{https://www.maxon.net/en/zbrush} pro~sculpting a~Substance~Painter\footnote{https://www.adobe.com/products/substance3d/apps/painter.html} pro~texturování objektu. V~tomto projektu byl použit výhradně Blender\footnote{https://www.blender.org/} a~software pro~editaci obrázkových formátů, které~jsou k~dispozici na~internetu zdarma. Výsledný model lze často bez~problémů rovnou využít v~enginu.
Sculpting se provádí předevšim přes grafický tablet, kde pomoci různých 3D štětcu se natahují nebo smršťují vrcholy a celý proces napodobuje tvorbu sochy z plastického materiálu. Především takový přístup se používa pro tvorbu organických modelů nebo modelů s měkkým povrchem jako například živá stvoření, rostliny nebo oblečení.
\paragraph{Modeling a Sculpting} Nejprve se~vytváří tvar modelu. Toho se~docílí pomocí modelování polygonů nebo~sculptingu. Obě~metody jsou velmi odlišné a~stejně~tak mají odlišný výstup.
Modeling na druhou stranu je obecnější zpracování vrcholů, hran a ploch. Tady se manuálně přidavají resp. odebírají a posouvají vrcholy. Navíc toto prostředí obsahuje funkce umožňující různé druhy chytrého instancování, množinových operací mezi objekty a zjednodušených simulací vrcholů a tedy i objektů. V takovém prostředí se tvoří především komplexní resp. hybrydní nebo tvrdé povrchy jako například nábytek, architektura nebo scény se sculpting modely.
Sculpting se~provádí především přes~grafický tablet, kde~pomocí různých 3D~štětců se~natahují nebo~smršťují vrcholy a~celý proces napodobuje tvorbu sochy z~plastického materiálu. Především takový přístup se~používá pro~tvorbu organických modelů nebo~modelů s~měkkým povrchem jako~například živé bytosti, rostliny nebo~oblečení.
Specifickou scuplting instancí v enginu je Landscape\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/landscape-overview}, de-facto siť vrcholů předem určené hustoty, kterou můžeme v editoru sculptovat a napodobovat křivý resp. různě vysoký teren. Manuální sculpting je pomalý a přináší slabé až nevyhovující výsledky. Proto místo sculptingu se používá výškova neboli height mapa, což je textura odstinů šedí, kde káždý pixel kóduje výšku v 3D prostoru. Potom stačí naskénovat nějaký povrch v reálitě a získat skvělé výsledky. Stejné height mapy lze použivat i jako štětce v běžném sculptingu, pro specifické detalizace povrchů, a samotné height mapy lze získat na nějakých online platformach dokonce zdarma. Ukázka landscapu je k dispozici v druhé úrovní, kde povrch terénu jsem vytvořil pomoci textury výšek a hory jsem tvořil růčně základními štetci.
\newpage
Modeling na~druhou stranu je obecnější zpracování vrcholů, hran a~ploch. Tady se~manuálně přidávají resp.~odebírají a~posouvají vrcholy. Navíc toto~prostředí obsahuje funkce umožňující různé druhy efektivního instancování, množinových operací mezi objekty a~zjednodušených simulací vrcholů. V~takovém prostředí se~tvoří především komplexní resp.~hybridní nebo~tvrdé povrchy jako~například nábytek, architektura nebo~scény se~sculpting modely.
\paragraph{Animace} Animace se tvoři v dalším kroku modelingu. Pokud jsme předtím vytvořili model pomoci sculptingu, potřebujeme ho imortovat do modeling prostředí. Začíná se tvorbou umělé kostry z tzv. kostí a kloubů.
Specifickou sculpting instancí v~enginu je Landscape\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/landscape-overview}, de-facto síť vrcholů předem určené hustoty, kterou~můžeme v~editoru sculptovat a~napodobovat křivý resp.~různě vysoký terén. Manuální sculpting je pomalý a~přináší slabé až~nevyhovující výsledky. Proto místo sculptingu se~používá výšková neboli height~mapa, což~je textura odstínů šedi, kde~každý pixel kóduje výšku v~3D prostoru. Potom stačí naskenovat nějaký povrch v~reálném světě a~získat skvělé výsledky. Stejné height~mapy lze používat i~jako~štětce v~běžném sculptingu, pro~specifické detalizace povrchů, a~samotné height mapy lze získat na~některých online platformách dokonce zdarma. Ukázka landscapu je k~dispozici ve~druhé úrovni, kde~povrch terénu jsem vytvořil pomocí textury výšek a~hory jsem tvořil ručně základními štětci.
Klouby slouží pouze k specifikaci hierarchie mezi kosti, tak že nějaká kost propaguje vlastní modifikaci na všechny následující. Navíc specifikují střed rotačního bodu.
\paragraph{Animace} Animace se~tvoří v~dalším kroku modelingu. Pokud jsme předtím vytvořili model pomocí sculptingu, potřebujeme ho importovat do~modeling prostředí. Začíná~se tvorbou umělé kostry z~tzv.~kostí a~kloubů.
Kostí jsou samostatné absraktní označení pro nosič prostorových transformací, pro který můžeme přiřadit množinu vrcholů. Potom v logice nějáké animace stačí pouze posouvat určité kostí a nějaký předrendrovácí engine bude souvislé modifikovat přiřazené vrcholy. Navíc kostí často modifikují vrcholy podle předem úrčené váhy pro každý vrchol, čímz lze škálovat a skládat posuny různých kostí na úrčitých vrcholech. Jen je potřeba brát v úvahu, že skeleton animace neboli modifikace provedené předrendrovacím enginem jsou spouštěné na CPU, jelikož jsou řízeny nějakou logikou herního světa. Naštěstí moderní procesory s instrukčními sady AVX a více jádry v takových úlohach dokažou předvádět poměrně skvělé až nadbytečné výkony.
Klouby slouží pouze ke~specifikaci hierarchie mezi kostmi tak, že~kost propaguje vlastní modifikaci na~všechny následující. Navíc specifikují střed rotačního bodu.
V Unreal Engine 5 přidaly rozhraní pro tvorbu skeleton animací přímo v editoru. Předtím bylo možné pouze hotové animace naimportovat. Uvnitř editoru je přiliš mnoho způsobů jak režirovat animace (myšleno přehrávání, slepení přechodů, modifikace, skládání atd.) a lze se v tom jednoduše ztratit. V základu je předpokládáná tvorba state-machine, který bude přehrávat a cyklit jednotlivé animace v závislosti na větvení grafu a podmínkach hran.
Kosti jsou samostatné absraktní označení pro~nosič prostorových transformací, pro~který~můžeme přiřadit množinu vrcholů. Potom v~logice animace stačí pouze posouvat určité kosti a~předrenderovácí engine bude souvislé modifikovat přiřazené vrcholy. Navíc kostí často modifikují vrcholy podle předem určené váhy pro~každý vrchol, čímž~lze škálovat a~skládat posuny různých kostí na~určitých vrcholech. Jen~je~potřeba brát v~úvahu, že~skeleton animace neboli modifikace provedené předrenderovacím enginem jsou spuštěné na~CPU, jelikož jsou řízeny logikou herního světa. Naštěstí moderní procesory s~instrukčními sadami AVX a~více jádry v~takových úlohách dokážou předvádět poměrně skvělé až~nadbytečné výkony.
Táto práce obsahuje pouze jednoduché animace postav, které byli přenesené ze staré verze. Animace hráče navíc disponuje immersivním\footnote{Immersivita je označení pro větší stupeň uživetelské odezvy nebo pocit přítomností a ponoření do děje hráčem.} otačením trupu a animace nohou jsou přitahovány k podlaze pomoci inverse kinematic metody\footnote{Inverse kinematic metoda umožňuje procedurální modifikaci skeleton animace.}.
V~Unreal~Engine~5 přidaly rozhraní pro~tvorbu skeleton animací přímo v~editoru. Předtím bylo možné pouze hotové animace naimportovat. Uvnitř editoru je příliš mnoho způsobů jak~režírovat animace (myšleno přehrávání, slepení přechodů, modifikace, skládání atd.) a~lze se~v~tom jednoduše ztratit. V~základu je předpokládaná tvorba state-machine, který~bude přehrávat a~cyklit jednotlivé animace v~závislosti na~větvení grafu a~podmínkách hran.
Tráva vidítelná na úrovních 1 a 2 je animováná pomoci offsetů vrcholů. V reálnem čase pod hráčem se generují částíce s barevným gradientem kódující offset v prostoru. Takové častíce jsou vidítelné pouze pro speciální render target menší velikosti -- sníma se pouze blízké okolí hráče. Materiál trávy následný render target interpretuje jako texturu, kterou interpoluje spolu s texturou jednoduchého proceduralního shaderu větru dostupného v enginu. Výsledkem je výkonná procedurální animace reakce na vítr a chůzi hráče v okolí objektu obsahující velké množství instancí resp. vrcholů.
Táto práce obsahuje pouze jednoduché animace postav, které~byly přeneseny ze~staré verze. Animace hráče navíc disponuje imersivním\footnote{Imersivita je označení pro~větší stupeň uživatelské odezvy nebo~pocit přítomností a~ponoření do~děje hráčem.} otáčením trupu a~animace nohou jsou přitahovány k~podlaze pomocí inverzní kinematické metody\footnote{Inverzní kinematická metoda umožňuje procedurální modifikaci skeleton animace.}.
\paragraph{Texturování} Za účelem texturování nejdřív potřebujeme objektu úrčit jedinečnou UV mapu, která bude mapovat plochý 3D modelu na normalizovaný prostor 2D obrázku. Často tvůrci mají na začatku problém pochopit o co se vlastně jedná a jak model rozložit. K tomu může napomoct myšlenka s rozlepováním resp. slepováním hran papírové figurky. Celý koncept UV mappingu je totožný se zpětným procesem tvorby například papírove krychlé, kde nějak rozbalenou krychli skládáme z jednoho uceleného kousku materiálu.
\newpage
Tráva viditelná v~první a~druhé úrovní je animovaná pomocí offsetů vrcholů. V~reálném čase pod~hráčem se~generují částice s~barevným gradientem kódující offset v~prostoru. Takové~částice jsou viditelné pouze pro~speciální render target menší velikosti -- snímá~se pouze blízké okolí hráče. Materiál trávy následný render target interpretuje jako~texturu, kterou~interpoluje spolu s~texturou jednoduchého procedurálního shaderu větru dostupného v~enginu. Výsledkem je~výkonná procedurální animace reakce na~vítr a~chůzi hráče v~okolí objektu obsahující velké množství instancí resp.~vrcholů.
Když máme hotové mapování, můžeme volně přirazovat textury, které mohou úrčovat barvu vrcholů, modifikovat jejích normalový vektor, lesk, matnost, průhlednost a případně další. Přibližně do roku 2014, kdy vznikl Substance painter a dnes i jeho alternativy, jediný způsob texturování objektu bylo manuální kreslení navrch vytvořené mapy. Dnes existují uživatelsky přijemné softwary, kde stačí kreslit rovnou komplexní materiály na povrch 3D modelu a aplikace sama obstará data všech textur.
\paragraph{Texturování} Za~účelem texturování nejdřív potřebujeme objektu určit jedinečnou UV~mapu, která~bude mapovat plošky 3D~modelu na normalizovaný prostor 2D~obrázku. Často tvůrci mají na~začátku problém pochopit o~co~se~vlastně jedná a~jak~model rozložit. K~tomu může napomoci myšlenka s~rozlepováním resp.~slepováním hran papírové figurky. Celý koncept UV~mappingu je totožný se~zpětným procesem tvorby například papírové krychle, kde~rozbalenou krychli skládáme z~jednoho uceleného kousku materiálu.
V tomto projektu většína objektů nepoužívá diffusní textury a vybarvování modelů je tvořené pomocí vybarvování určítých skupin jeho ploch. Přesto jsou často využiváné normal mapy nebo masky průhlednosti. Bohůžel se můsely zahodit mapy pro tessellaci\footnote{Tessellace je technika podrozdělění a modifikace plošek za účelem zvětšení detalizace objektu.} povrchů používáné v staré verzi projektu, jelikož s příchodem UE 5 tvůrci odebrali celou podporu tesselace kvůli technologii Nanite.
Když máme hotové mapování, můžeme volně přiřazovat textury, které~mohou určovat barvu vrcholů, modifikovat jejich normálový vektor, lesk, matnost, průhlednost a~případně další. Přibližně do~roku~2014, kdy~vznikl Substance Painter a~dnes i~jeho alternativy, jediný způsob texturování objektu bylo manuální kreslení navrch vytvořené mapy. Dnes existují uživatelsky příjemné programy, kde~stačí kreslit rovnou komplexní materiály na~povrch 3D~modelu a~aplikace sama obstará data všech textur.
V~tomto projektu většina objektů nepoužívá difuzní textury ale~jednoduché vybarvení určitých skupin plošek. Přesto jsou často využívané normal mapy nebo~masky průhlednosti. Bohužel se~musely zahodit mapy pro~tesselaci\footnote{Teselace je technika podrozdělení a~modifikace plošek za~účelem zvětšení detalizace objektu.} povrchů používané v~staré verzi projektu, jelikož s~příchodem UE~5 tvůrci odebrali celou podporu tesselace kvůli technologii Nanite.
\paragraph{Exportování a Importování}
Workflow nebo pipeline exportu jsou standardizováné v profesionálních softwarech jako 3ds Max. Blender má pouze základní možnosti exportu, které je potřeba nejdřív přizpusobit spicifickému hernímu enginu. Potřebný minimum je zajištění správné interpretace dopředního a vrchního vektorů celého modelu. Taky se vyplatí:
Workflow nebo~pipeline exportu jsou standardizované v~profesionálních softwarech jako~3ds~Max. Blender má pouze základní možnosti exportu, které~je potřeba nejdřív přizpusobit specifickému hernímu enginu. Potřebné minimum je zajištění správné interpretace dopředního a~vrchního vektorů celého modelu. Taky se~vyplatí:
\begin{itemize}
\item nastavit šablonu pro všechny budoucí projekty, tak aby modelovací program a herní editor sdíleli měřítko jednotek,
\item vyzkoušet jak se chová exportovaná hierarchie modelů v jednom souboru,
\item před exportem ověřit že všechny plošky modelu mají správně natočený normalový vektor (očekává se směr mířící na venek z objektu).
\item nastavit šablonu pro~všechny budoucí projekty, tak~aby~modelovací program a~herní editor sdíleli měřítko jednotek,
\item vyzkoušet, jak~se~chová exportovaná hierarchie modelů v~jednom souboru,
\item před exportem ověřit, že~všechny plošky modelu mají správně natočený normálový vektor (očekává~se směr mířící ven z~objektu).
\end{itemize}
Unreal engine se jeví standardem herního oboru a proto verze 5 implementuje systém importovacích pipelines. Jedná se o mocný nástroj, který citelně zrychluje a sjednocuje postupy importování různých assetů nebo dokonce stejných assetů podle specifických filtrů (adresař assetu, typ, obsah, podřetězce názvu atd.). Subjektivně největší výhodou je předání zodpovědnosti specifického importu pouze osobam v týmu s odpovídajícími znalostmi. V praxi týmový senior založí pipelines pro často využíváné importy, tak aby odpovídali vnitřním firemním politikam a proto nováček v týmu resp. celý tým nemá žádné starosti při importu assetů.
Unreal Engine je standardem herního oboru a~proto verze~5 implementuje systém importovacích pipelines. Jedná~se o~mocný nástroj, který~citelně zrychluje a~sjednocuje postupy importování různých assetů nebo~dokonce stejných assetů podle specifických filtrů (adresář assetu, typ, obsah, podřetězce názvu atd.). Subjektivně největší výhodou je předání zodpovědnosti specifického importu pouze osobám v~týmu s~odpovídajícími znalostmi.
\newpage
V~praxi týmový senior založí pipelines pro~často využívané importy~tak, aby~odpovídali vnitřním firemním politikám a~proto celý tým nemá žádné starosti při importu assetů.
\paragraph{Optimalizace} Ikdyž objekty jsou statické, stále vyžadují optimalizace. Takové lze najít i v tomto projektu:
\paragraph{Optimalizace} I~když objekty jsou statické, stále vyžadují optimalizace. Takové lze najít i~v~tomto projektu:
\begin{itemize}
\item Instancování se využívá k tvorbě prostorů hustých na specifické modely. V UE se jedná o editovácí prostředek sousedicí vedle Landscape. Umožnuje pokročilé nastavení různých množín instancí a jejích parametry náhodného umístění.
\item Optimální topologie objektu pro minimalizaci vrcholů potřebných k vykreslování. Převážná většina modelů -- patří sem i získáné od třetích stran -- mají růčně přepracované mnou topologie. Jedná se nejen o jednoduchou redukci nepotřebných vrcholů, ale taky použití techniky lítající neboli floating geometrie. Tato metoda spočívá v protínání plošek, místo skutečného propojení vrcholů někde uprostřed, jelikož takové propojení by vyžadovalo podrozdělení jedne z ploch, čili zbytečného zvětšení vrcholů (viz \Cref{fig:FloatingGeometry}). Taktéž objekty mají redukovanou k-DOP kolizní topologii, pro urychlení výpočtů fyzických simulací.
\item Modely náročné na vykreslování nebo použité v instancování používájí LOD technologii (viz \Cref{fig:LodShowcase}). Nanite v práci využit nebyl.
\item Instancování se~využívá k~tvorbě prostorů hustých na~specifické modely. V~UE se~jedná o~editovací prostředek sousedící vedle Landscape. Umožňuje pokročilé nastavení různých množin instancí a~jejich parametry náhodného umístění.
\item Optimální topologie objektu pro~minimalizaci vrcholů potřebných k~vykreslování. Převážná většina modelů -- patří sem i~získané od~třetích stran -- mají mnou ručně přepracované topologie. Jedná~se nejen~o~jednoduchou redukci nepotřebných vrcholů, ale~taky použití létající neboli floating geometrie. Tato~metoda spočívá v~protínání plošek, místo skutečného propojení vrcholů někde uprostřed, jelikož takové propojení by~vyžadovalo podrozdělení plošek, což~by~vedlo ke~zbytečnému zvětšení počtu vrcholů (viz \Cref{fig:FloatingGeometry}). Taktéž objekty mají redukovanou k-DOP kolizní topologii, pro~urychlení výpočtů fyzických simulací.
\item Modely náročné na~vykreslování nebo~použité v~instancování používají LOD~technologii (viz \Cref{fig:LodShowcase}). Nanite v~práci nebyl využít.
\end{itemize}
\begin{figure}
\centering
\includegraphics[width=1\linewidth]{img/FloatingGeometry.pdf}
\caption{Floating geometrie využitá v modelu okna. Vlevo je výsledný vzhled, uprostřed floating topologie (48 vrcholů a 52 trojúhelniků) a napravo naivní běžná topologie (64 vrcholů a 152 trojúhelniků).}
\caption{Floating geometrie využitá v~modelu okna. Vlevo je výsledný vzhled, uprostřed floating geometrie (48~vrcholů a~52~trojúhelníků) a~napravo běžná naivní topologie (64~vrcholů a~152~trojúhelníků).}
\label{fig:FloatingGeometry}
\end{figure}
@ -249,143 +256,146 @@ Unreal engine se jeví standardem herního oboru a proto verze 5 implementuje sy
\label{fig:LodShowcase}
\end{figure}
Optimalizace textur je zprovozněná pouze hlídáním rozumných rozlišení. Jinak některé textury určitě je možné seskupit do jedné a vybírat potřebnou instanci podle UV mapy, což zrychlí přístup k datům.
Optimalizace textur je zajištěná pouze hlídáním rozumných rozlišení. Jinak některé textury je určitě možné seskupit do~jedné a~výběr instance řídit pomocí UV~mapy, což~zrychlí přístup k~datům.
Jiná grafická optimalizace není nijak řešená. Modely použité v instancování občas mohou vyvolat snižení výkonu, což by bylo potřeba už řešit nahrazením plnohodnotných modelů na kolekce průhledných textur (billboard metoda popsaná v další podsekci).
Jiná grafická optimalizace není řešená. Modely použité v~instancování občas mohou vyvolat snížení výkonu, což~by~bylo potřeba už~řešit nahrazením plnohodnotných modelů za~kolekce průhledných textur (billboard metoda popsaná v~další podsekci).
\subsection{Dynamické a procedurální objekty}
\paragraph{Sequencer} Běžná dynamická animace se vytváří přímo v editoru objektu Sequencer\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-sequencer-movie-tool-overview}. Taková animace dokáže modifikovát parametry objektů na úrovní a volát funkce v úrčité okamžiky. Objekty mohou být úrčené předem nebo Sequencer umí dynamicky vyhledát jejích reference před spuštěním. Pravě v tomto prostředí se tvoří cutscény nebo cyklické animace objektů na úrovní.
\paragraph{Sequencer} Běžná dynamická animace se~vytváří přímo v~editoru objektu Sequencer\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-sequencer-movie-tool-overview}. Taková animace dokáže modifikovat parametry objektů na~úrovní a~volat funkce v~určité okamžiky. Objekty mohou~být určené předem nebo~Sequencer umí dynamicky vyhledat jejich reference před~spuštěním. Právě v~tomto prostředí se~tvoří cutscény nebo~cyklické animace objektů na~úrovni.
\paragraph{Procedurální generování} V předchozí verzi hry model trávy byl vytvořen pomoci billboard metody, kde místo vykreslování 3D geometrie vegetace, se vykresluje průník ploch s texturou vegetace a průhledným pozadím. Tato technika je standardem ve video hrach, přesto nestačila k splnění dizajnových účelů projektu. Buď vegetace musela být řídká, nebo vyžádovalá nesmyslně mnoho hardwarových prostředků a občas vznikalo i drobné zamrazení aplikace.
\paragraph{Procedurální generování} V~předchozí verzi hry model trávy byl vytvořen pomocí billboard metody, kde~místo vykreslování 3D~geometrie vegetace, se~vykresluje průnik ploch s~texturou vegetace a~průhledným pozadím. Tato~technika je~standardem ve~videohrách, přesto nestačila ke~splnění dizajnových účelů projektu. Buď~vegetace musela být řídká, nebo~vyžadovala nesmyslně mnoho hardwarových prostředků a~občas vzniklo i~drobné zmrazení aplikace.
Pro tento účel se implementovál nástroj pro editor, který podle úrčitých parametrů je schopný vygenerovát náhodnou a hustou trávu z 3D trojúhelníků. Výsledný objekt má několikanásobně více geometrických dat než billboard metoda, přesto má skvělý výkon a navíc vegetace působí mnohem hustějí, má kvalitnější vzhled a lépe reaguje na offset vrcholů v shaderech (viz \Cref{fig:GrassShowcase}). Trik je v přenesení velké texturové zátěže s převýpočty průhledností na vykreslování jednotné a jednoduché 3D geometrie. K tomu generativní přístup umožňuje kvalitnější pokrytí ploch, jako například v tomto projektu, kde trává se generuje pouze v oblastech určité velikosti a jestli jsou pokryté úrčitým materiálem, tedy tráva se negeneruje na cestíčkach a mezi povolenou a zakázanou plochou je pozvolný přechod v velikosti jednotlivých stebel. Takový přístup byl okoukan ze hry Ghosts of Tsushima od studia Sucker Punch Productions, kde autoři si vytvořili podobný proprietární nástroj, jelikož chtěli dosáhnout husté kinematografické a stilistické vegetace na konzolích.
\newpage
Pro~tento účel jsem implementoval nástroj pro~editor, který~podle určitých parametrů je~schopen vygenerovat náhodnou a~hustou trávu z~trojúhelníků. Výsledný objekt má několikanásobně více geometrických dat než~billboard metoda, přesto~má skvělý výkon a~navíc vegetace působí mnohem hustěji, má kvalitnější vzhled a~lépe reaguje na~offset vrcholů v~shaderech (viz \Cref{fig:GrassShowcase}). Trik~je v~přenesení velké texturové zátěže s~převýpočty průhledností na~vykreslování jednotné a~jednoduché 3D~geometrie. K~tomu, generativní přístup umožňuje kvalitnější pokrytí ploch, jako~například v~tomto projektu, kde~tráva se~generuje pouze v~oblastech určité velikosti a~jestli jsou pokryté určitým materiálem, tedy~tráva se~negeneruje na~cestičkách a~mezi povolenou a~zakázanou plochou je pozvolný přechod ve~velikosti jednotlivých stebel. Takový přístup byl inspirován hrou Ghosts~of~Tsushima od~studia Sucker~Punch~Productions, kde~autoři si~vytvořili podobný proprietární nástroj, jelikož chtěli dosáhnout husté kinematografické a~stylistické vegetace na~konzolích.
\begin{figure}
\centering
\includegraphics[width=1\linewidth]{img/GrassShowcase.pdf}
\caption{Ukázka procedurální (vlevo) a billboard (vpravo) metod pro vykreslování vegetace. Procedurální metoda má přibližně 6-krát menší render time a paměťové požadavky.}
\caption{Ukázka procedurální~(vlevo) a~billboard~(vpravo) metod pro~vykreslování vegetace. Procedurální metoda má přibližně 6-krát menší render time a~paměťové požadavky.}
\label{fig:GrassShowcase}
\end{figure}
\subsection{Osvětlení}
Teměř každý objekt osvětlení sdíli podobné parametry, které mohou definovat, to jak světlo vypada nebo ovlivňuje prostředí. Vedle běžných dizajnových parametrů nechybí ani široká škála technických triků a úskalí.
Téměř každý objekt osvětlení sdílí podobné parametry, které~mohou definovat~to, jak~světlo vypadá nebo~ovlivňuje prostředí. Vedle běžných dizajnových parametrů nechybí ani~široká škála technických triků a~úskalí.
\paragraph{Forward shading} Jelikož celá hra je ve forward shading režimu, -- podle tvůrců enginu obsolete funkcionalita čekájící na plný rework, -- některé technologie jsou značně omezené nebo nefungují a zhoršuje se to s každou novou verzi. Například z časem přestal fungovat Rect Light, který ale můžeme napodobit tak, že Point Light zdroji přiřadíme IES texturu, která nám specifikuje způsob šíření světla neboli v herním světě tvar světla. Stejně tak lze vytvořit vlastní Light Function, což je materiál definujicí co a jak světelný zdroj vyzařuje.
\paragraph{Forward shading} Jelikož celá hra je v~režimu forward shading, -- podle tvůrců enginu obsolete funkcionalita čekající na~plný rework, -- některé technologie jsou značně omezené nebo~nefungují a~zhoršuje~se~to s~každou novou verzi. Například časem přestal fungovat Rect Light, který~ale~můžeme napodobit~tak, že~Point Light zdroji přiřadíme IES~texturu, která~nám specifikuje způsob šíření světla neboli~tvar světla v~herním světě. Stejně~tak lze~vytvořit vlastní Light Function, což~je~materiál definující co~a~jak světelný zdroj vyzařuje.
Navíc je potřeba pamatovat na reálná technická omezení forward shadingu, jako nejvýše tři zdroje světla na jeden objekt a nedostatek SSAO nebo SSR. S čímž stále si můžeme nějak poradit. Pokud je potřeba víc zdrojů světel ve scéně, máme k dispozici tři různé sloučitelné kanály, které můžeme specifikovat pro konkretní objekt a zdroj světla. A pokud nutně potřebujeme Ambient Occlusion mužeme použít Lightmass Volume\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/cpu-lightmass-global-illumination-in-unreal-engine} pro jeho simulaci a stejně tak můžeme použít Planar Reflections\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/planar-reflections-in-unreal-engine} pro simulaci odrazů.
\newpage
Navíc je potřeba pamatovat na~reálná technická omezení forward shadingu, jako~nejvýše tři~zdroje světla na~jeden objekt a~nedostatek SSAO nebo~SSR. S~čímž~stále si~můžeme poradit. Pokud~je potřeba víc zdrojů světel ve~scéně, máme k~dispozici tři~kanály, které~můžeme specifikovat pro~konkrétní objekt a~zdroj světla. A~pokud~nutně potřebujeme ambientní okluzi můžeme použít Lightmass Volume\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/cpu-lightmass-global-illumination-in-unreal-engine} pro~jeho simulaci a~stejně tak~můžeme použít Planar~Reflections\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/planar-reflections-in-unreal-engine} pro simulaci odrazů.
\paragraph{Základy osvětlení na úrovni} Kromě bodových světel na úrovní teměř vždy chceme přidat globální osvětlení, který sestává z Directional Light a Sky Light.
\paragraph{Základy osvětlení} Kromě bodových světel na~úrovní téměř vždy chceme přidat globální osvětlení, který~sestává z~Directional~Light a~Sky~Light.
Directional zdroj funguje jako jeden velký bodový zdroj pro celou scénu, který napodobuje funkci slunce a slouží primárně k vykreslování stínů.
Directional zdroj funguje jako~jeden velký bodový zdroj pro~celou scénu, který~napodobuje funkci slunce a~slouží primárně k~vykreslování stínů. Zdroj typu Sky~Light také~může ovlivňovat stíny, ale~primárně zobrazuje Skybox texturu a~modifikuje ambient složku celého osvětlení.
Zdroj typu Sky Light taky může ovlivňovat stíny, ale primárně zobrazuje Sky Box texturu a modifikuje ambient složku celého osvětlení.
Navíc pokud chceme zobrazit venkovní prostory, je dobré použít nějakou formu mlhy, jako~je Ambient~Fog. Mlha přidá pocit velkého a~neomezeného prostoru i~když ve~skutečnosti je malý a~uzavřený. Navíc mlha výborně skryje a~tedy~umožní horší detailizaci objektů v~dálce, čímž~efektivně zkrátíme dobu vykreslování snímku.
Navíc pokud chceme zobrazit venkovní prostory, je dobré použit nějkou formu mlhy jako je Ambient Fog. Mlha přidá pocit vělkého a neomezeného prostoru ikdyž ve skutečnosti je malý a uzavřený. Navíc mlha výborně skryje a tedy umožní horší detalizaci objektů v dálce, čímž efektivně zkratíme renderovácí čas snímku.
Nakonec se lze uchýlit k použítí mnoha různých Volume objektů, které z důvodů rozsahu práce nebudou podrobně probírany. Pomoci těchto prostorů lze specifikovat oblastí s úrčitými parametry, které nějak budou napovídat enginu potřebné optimalizace, nebo zapínat výkonostně náročné vykreslovácí technologie. Pro představu Lightmass Importance Volume\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/lightmass-basics-in-unreal-engine} specifikuje oblast, kde je potřeba propočítat větší počet odrazů paprsků světla než jednou.
Nakonec se~lze odchýlit k~použití mnoha různých Volume objektů, které~z~důvodů rozsahu práce nebudou podrobně probrány. Pomocí těchto prostorů lze~specifikovat oblastí s~určitými parametry, které~budou napovídat enginu potřebné optimalizace, nebo~zapínat výkonnostně náročné vykreslovací technologie. Pro~představu Lightmass~Importance~Volume\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/lightmass-basics-in-unreal-engine} specifikuje oblast, kde~je potřeba propočítat větší počet odrazů paprsků světla.
\subsection{Post-Processing}
Post-Processing lze definovat přímo v kameře nebo v jíž zmíněných Volume objektech. Každá definice je de-facto materíál, který lze vrstvít mezi sebou. PP vyžaduje hlubší grafické znalosti, aby bylo možné vytvořit něco užitečnějšího než barevnou korekci. Zároveň kvůli tématice práce jen nastínim jak jsem naimplementoval PP materiály (viz \Cref{fig:PPShowcase}), které mají gamedizajnový důvod, ale nestíhly se použít.
Post-Processing lze~definovat přímo v~kameře nebo~v~již zmíněných Volume objektech. Každá~definice je de-facto materíál, který~lze vrstvit mezi sebou. PP~vyžaduje hlubší grafické znalosti, aby~bylo možné vytvořit něco užitečnějšího než~barevnou korekci. Zároveň kvůli tématice práce pouze nastíním jak~jsem naimplementoval PP~materiály (viz~\Cref{fig:PPShowcase}), které~mají gamedizajnový důvod, ale~se~nestihli použít.
\begin{figure}
\centering
\includegraphics[width=1\linewidth]{img/PPShowcase.pdf}
\caption{Ukázka post-process materiálů ve hře. Efekt deště jsem nedokázal rozumně zachytít.}
\caption{Ukázka post-process materiálů ve~hře. Efekt deště jsem nedokázal rozumně zachytit.}
\label{fig:PPShowcase}
\end{figure}
\begin{itemize}
\item Plovoucí obrazovka - UV prostor obrazu se lehce zakřiví pomoci animováné šumové textury.
\item Námraza - obraz interpolujeme s animavánou texturou. Nejlépe použít nejký gradient uprostřed jako masku průhlednosti, aby hráč měl čistší vídění.
\item Stylová dálková kamera - obraz rozložíme na trochu sesunuté proužky dle rozlišení výstupu a zároveň tyto proužky střídavě zabarvíme. Nakonec proužky animujeme posunem nahoru nebo dolu.
\item Dešť - obraz rozložíme na jemnou mřížku a v blocích vygenerujeme různé kapky pomoci složení dvou turbulencí, každá z kterých bude mít animovanou lehce odlišnou rychlost posunu, aby kapky nebyly stalé stejn. Paralelně k tomu znovu rozložíme obraz, ale teď na hrubou mřížku, kde animujeme svislé pády bloků s gradientním ocasem. Oba výstupy složíme, tak že hruba mřížka představuje animovánou masku průhlednosti, která nam bude v různý okamžik otevírat pouze nějaké kapky. Nakonec přidame trochu distortion a výsledek použijeme jako modifikator UV výstupního obrazu.
\item Pixelizace - rozložíme obraz na potřebnou mřížku dle rozlišení a modifikujeme UV prostor výstupního obrazu.
\item Tavení pixelů - vytvoříme netriviální vertikální gradient s více přechody. Výsledek znečistíme zaokrouhlováním a umnožováním dat, zpixelizujeme rozdělením na mřízku a výsledek použijeme k modifikaci UV prostoru výstupního obrazu a barevné korekci.
\item Slepota - výstupní obraz nahradíme vlastním, ve kterém zobrazujeme pouze ohraníčení objektů s effektem emise. Ohraničení lze dosáhnout různymi způsoby a v tomto projektu je implementováné pomoci drobného posunu hloubkové textury ve všech směrech. Mezi posuny se provede rozdíl s originální hloubkou a sloučením rozdílů dostaneme hrany objektů.
\item Tužka a papíř - výstupní obraz nahradíme texturou ambient occlusion.
\item Plovoucí obrazovka - UV~prostor obrazu se~lehce zakřiví pomocí animované šumové textury.
\item Námraza - obraz interpolujeme s~animavanou texturou. Nejlépe použít nějaký gradient uprostřed jako~masku průhlednosti, aby~hráč měl čistší vidění.
\item Stylová dálková kamera - obraz rozložíme na~trochu sesunuté proužky dle~rozlišení výstupu a~zároveň tyto~proužky střídavě obarvíme. Nakonec proužky animujeme posunem nahoru nebo~dolu.
\newpage
\item Déšť - obraz rozložíme na~jemnou mřížku a~v~blocích vygenerujeme různé kapky pomocí složení dvou turbulencí, každá~z~kterých bude mít animovanou lehce odlišnou rychlost posunu, aby~kapky nebyly stále stejné. Paralelně k~tomu znovu rozložíme obraz, ale~teď na~hrubou mřížku, kde~animujeme svislé pády bloků s~gradientním ocasem. Oba~výstupy složíme~tak, že~hruba mřížka představuje animovanou masku průhlednosti, která~nám bude v~různý okamžik otevírat pouze některé kapky. Nakonec přidáme trochu distortion a~výsledek použijeme jako modifikátor UV~výstupního obrazu.
\item Pixelizace - obraz rozložíme na~potřebnou mřížku dle~rozlišení a~modifikujeme UV~prostor výstupního obrazu.
\item Tavení pixelů - vytvoříme netriviální vertikální gradient s~více přechody. Výsledek znečistíme zaokrouhlováním a~násobením dat, zpixelizujeme rozdělením na~mřížku a~výsledek použijeme k~modifikaci UV~prostoru výstupního obrazu a~barevné korekci.
\item Slepota - výstupní obraz nahradíme vlastním, ve~kterém zobrazujeme pouze ohraničení objektů s~efektem emise. Ohraničení lze dosáhnout různými způsoby a~v~tomto projektu je~implementováno pomocí drobného posunu hloubkové textury ve~všech směrech. Mezi posuny se~provede rozdíl s~originální hloubkou a~sloučením rozdílů získáme obrysy objektů.
\item Tužka a~papír - výstupní obraz nahradíme texturou ambient occlusion.
\end{itemize}
\subsection{Materiály a shadery}
Přestože materiály jsou omezené shadery, stále lze pomoci nich definovat mnoho různých a komplexních grafických funkcí. Základem jsou jednoduché barevné výstupy s triviálními parametry lesku, matnosti a emise. Může záležet na druhu objektu, pro který materiály tvoříme, tedy potřebujeme správně nastavit i druh materiálu, čimž následně dostaneme další, předtím uzavřené, výstupy a vstupy, nebo naopak některé již definovat nebudeme moct. Například za účelem optimalizace, můžeme přepnout materiál ze základního režimu osvětlení neboli Default Lit do neosvětleného režimu Unlit, čimž budeme moct definovat barvu objektu pouze emisní složkou, ale zmenšíme vykreslovací čas potřebný pro materiál.
Přestože materiály jsou omezené shadery, stále lze pomocí nich definovat mnoho různých a~komplexních grafických funkcí. Základem jsou jednoduché barevné výstupy s~triviálními parametry lesku, matnosti a~emise. Může záležet na druhu objektu, pro~který~materiály tvoříme, tedy~potřebujeme správně nastavit i~druh materiálu, čímž~následně dostaneme další, předtím uzavřené, výstupy a~vstupy. Například za~účelem optimalizace, můžeme přepnout materiál ze~základního režimu osvětlení neboli~Default~Lit do~neosvětleného režimu Unlit, čímž~budeme moci definovat barvu objektu pouze emisní složkou, ale~zmenšíme vykreslovací čas potřebný pro~materiál.
V UE materiály resp. shadery mají mnoho globálních proměnných, z kterých můžeme získat cenné údaje o enginu, scéně, vykreslovaném objektu, render buffrech atd. Dokonce můžeme definovat vlastní globální nebo lokalní parametry a měnit jejich hodnoty v logice světa. Použití takových proměnných lze často vidět v již zmíněných post-procesech, které přebírají a modifikují hodnoty výstupního zobrazení nebo jsou animaváné pomoci sinusové funkce s globálním parametrem herního času jako vstup.
V~UE materiály resp.~shadery mají mnoho globálních proměnných, z~kterých můžeme získat cenné údaje o~enginu, scéně, vykreslovaném objektu, render buffrech atd. Dokonce můžeme definovat vlastní globální nebo~lokální parametry a~měnit jejich hodnoty v~logice světa. Použití takových proměnných lze často vidět v~již~zmíněných post-procesech, které~přebírají a~modifikují hodnoty výstupního zobrazení nebo~jsou animované pomocí sinusové funkce s~globálním parametrem herního času jako~vstup.
Stojí za to zmínit, že některé materiály se hodí pouze na úrčitý druh objektů podle velikostí a umístění ve světě. Jedním z příkladu v teto hře je materiál skla. Původně navržený shader, který simuluje zalomování a vnitřní objem, skvěle funguje na drobných objektech jako lahve nebo skleněné střepy. Při použití na velkých skleněných plochach jako jsou okna, takové simulace vytváři nežádané artefakty nebo nefungují správně. Pro takové situace byl přidan duplicitní shader skla, který primarně vykresluje polopruhlednou barvu na povrchu objektu.
Stojí~za~to zmínit, že~některé materiály se~hodí pouze na~určitý druh objektů podle velikostí a~umístění ve~světě. Jedním z~příkladu v~této hře je materiál skla. Původně navržený shader, který~simuluje zalamování a~vnitřní objem, skvěle funguje na~drobných objektech jako lahve nebo~skleněné střepy. Při~použití na~velkých skleněných plochách jako~jsou~okna, takové simulace vytváří nežádané artefakty. Pro takové situace byl přidán duplicitní shader skla, který~primárně vykresluje poloprůhlednou barvu na~povrchu objektu.
\paragraph{Funkce} V materiálech se lze zbavit duplicitního kódu, čímž zaroveň se zrychlí kompilace a běh shader variací. Implementoval jsem funkce:
\paragraph{Funkce} V~materiálech se~lze zbavit duplicitního kódu, čímž~se~zároveň zrychlí kompilace a~běh shader variací. Implementoval~jsem funkce:
\begin{itemize}
\item Škalování vstupné hodnoty podle vzdaleností objektu od kamery.
\item Uniformní škalování a tiling textury nezávislé na velikosti objektu.
\item Získání obrysů objektů v podobě masky.
\item Rotace objektu ve směru kamery.
\item Škálování vstupné hodnoty podle vzdálenosti objektu od~kamery.
\item Uniformní škálování a~tiling textury nezávislé na~velikosti objektu.
\item Získání obrysů objektů v~podobě masky.
\item Rotace objektu ve~směru kamery.
\end{itemize}
\subsection{UI}
Před Unreal Engine 5 teměř každý UI byl rastrový a v minulosti to ani nebyl problém. Stačilo vytvořit mip-mapy pro menší množinu nejrozšířenějších rozlišení (HD, WSXGA a Full HD) a k tomu škálovat mip texturu menšího rozlišení na potřebný lehce větší výstup. Předtím hry nevypadaly zaostřeně takže nemuselo ani UI a dokonce to rozostření rastrového obrazu nebylo tak viditelné na displejích menší velikosti v té době. Dnes rastrové UI vytvaří příliš komplikací při tvorbě a vykreslování. Je potřeba mnoho mip-map ve velkých rozlišeních pro ostrý obraz na každém displeji, což vyžadují velké množství paměti a hlavně velkou propustnost při čtení dat, což se nejvíc projevuje u rastrových animací.
Před~Unreal~Engine~5 téměř každé~UI byl rastrový a~v~minulosti to~ani~nebyl problém. Stačilo vytvořit mip-mapy pro~menší množinu nejrozšířenějších rozlišení (HD, WSXGA a~Full~HD) a~k~tomu škálovat mip~texturu menšího rozlišení na~potřebný lehce větší výstup. Předtím hry nevypadaly zaostřeně takže nemuselo ani~UI a~dokonce to~rozostření rastrového obrazu nebylo tak~viditelné na~displejích menší velikosti v~té~době. Dnes rastrové~UI vytváří příliš komplikací při~tvorbě a~vykreslování. Je potřeba mnoho mip-map ve~velkých rozlišeních pro~ostrý obraz na~každém displeji, což~vyžadují velké množství paměti a~hlavně velkou propustnost při~čtení dat, což~se~nejvíc projevuje u~rastrových animací.
Jelikož původní projekt vznikal ve čtvrté verzi enginu, ale v době již velkých rozlišení, nebylo realistické pro dva vývojaře celé hry vypracovat přijatelné rastrové UI. Proto jsem tehdy a teď vytvořil všechny prvky pomoci černobílých poloprůhledných vektorových čtverců s transformacemi. Rastrové textury se používají pouze v podobě masek nebo gradientů, při použití kterých nejsou zřejmé škalovací artefakty.
Jelikož původní projekt vznikal ve~čtvrté verzi enginu, ale~v~době již~velkých rozlišení, nebylo realistické pro~dva vývojáře vypracovat přijatelné rastrové~UI. Proto jsem tehdy a~teď vytvořil všechny prvky pomocí černobílých poloprůhledných vektorových čtverců s~transformacemi. Rastrové textury se~používají pouze v~podobě masek nebo gradientů, při~použití~kterých nejsou zřejmé škalovací artefakty.
Všechny kořenové UI prvky (overlay, kontejner questů, kontejner nápověd ovládání, menu atd.) spravuje mnou implementováná třída Widget Manager. Táto třída slouží nejen jako high-level api pro všechny kořenové prvky resp. kontejnery, ale primárně přehledně udržuje reference na takové prvky. Bez manuálního udržování reference, po instancování libovolného UI prvku, ho již nelze získat a tedy nemužeme prvek ani odstranit z obrazovky.
Všechny kořenové UI~prvky (overlay, kontejner questů, kontejner nápověd ovládání, menu~atd.) spravuje mnou implementována třída Widget~Manager. Tato~třída slouží nejen jako~high-level~API pro~všechny kořenové prvky resp.~kontejnery, ale~primárně přehledně udržuje reference na~takové prvky. Bez~manuálního udržování reference, po~instancování libovolného UI~prvku ho~již~nelze získat a~tedy nemůžeme prvek ani~odstranit z~obrazovky.
Každý prvek se instancijuje na začátku a udržuje se v paměti po celou dobu. Důvodem stálého údržování prvků v pamětí je jejich naplňovaní daty, které občas může trvát déle a tak při dynamickém instancování vyvolavat zaseknutí aplikace.
Každý prvek se~instancuje na~začátku a~udržuje~se v~paměti po~celou dobu. Důvodem stálého udržování prvků v~paměti je jejich naplňování daty, které~občas může trvat déle a~tak při~dynamickém instancování vyvolávat zaseknutí aplikace.
\paragraph{Texty a překlady} V enginu je více druhů řetězců:
\paragraph{Texty a překlady} V~enginu je více druhů řetězců:
\begin{itemize}
\item FString - běžný řetězec pro reprezentaci UTF-16 se stejnou množinou funkcí jak u std::string. Je optimalizovaný pro konkatanace.
\item FName - pouhý ukazatel na tabulku triviálních unikatních bajtových řetězců. Používa se pro pojmenování konstant v kódu nebo tagování objektů a je to doporučený textový format pro přenos přes internet.
\item FText - komplexní řetězec schopný překladat obsah podle tabulky nebo formatovat čísla podle pravidel jazyka.
\item FString - běžný řetězec pro~reprezentaci UTF-16 se~stejnou množinou funkcí jako~u~std::string. Je optimalizovaný pro~konkatenace.
\item FName - pouhý ukazatel na~tabulku triviálních unikátních bajtových řetězců. Používá~se pro~pojmenování konstant v~kódu nebo~tagování objektů a~je~to doporučený textový formát pro~přenos přes internet.
\item FText - komplexní řetězec schopný překládat obsah podle tabulky nebo~formátovat čísla podle pravidel jazyka.
\end{itemize}
Engine při instancování úrčitého FText nebo FString se snaží najít již existující instanci v paměti čimž se dost redukuje duplicita dat zejména v blueprintech.
Engine při~instancování určitého FText nebo~FString se~snaží najít již~existující instanci v~paměti, čímž~se~výrazně redukuje duplicita dat zejména v~blueprintech.
Při tvorbě projektu jsem si dál záležet, aby veškerý text viditelný hračem byl překladatelný. Zároveň jsem dbal na zachování unikátností řetězců, aby se v tabulce překladů nevyskytovali duplicitní záznamy.
Při~tvorbě projektu jsem~si~dal záležet, aby~veškerý text viditelný hráčem byl překladatelný. Zároveň jsem dbal na~zachování unikátností řetězců, aby~se~v~tabulce překladů nevyskytovaly duplicitní záznamy.
\paragraph{Načítací obrazovka} Načítací obrazovká je povinná z důvodů licenčních podmínek některých kníhoven a programů. Zejména Unreal Engine a FMOD vyžadují, aby produkt obsahoval načítačí obrazovku s logem jejích softwaru. Tato zdánlivě triviální problematika ve skutečností zahrnuje netriviální množství časové investice a rozboru startovácí sekvence enginu, což vyusťuje v nekompetenčná řešení začínajících i pokročílých vývojářů. Přesně se jedna o:
\paragraph{Načítací obrazovka} Načítací obrazovka je povinná z~důvodů licenčních podmínek některých knihoven a~programů. Zejména Unreal~Engine a~FMOD vyžadují, aby~produkt obsahoval načítací obrazovku s~logem jejich softwaru. Tato~zdánlivě triviální problematika ve~skutečnosti zahrnuje netriviální množství časové investice a~rozboru startovací sekvence enginu, což~vyúsťuje v~nekompetentní řešení začínajících i~pokročilých vývojářů. Přesně se~jedná~o:
\begin{itemize}
\item úplné vynechání cele funkcionality a tedy porušování licenčních podmínek,
\item nebo simulaci náčítaní tak, že po již plném načténí enginu se otevře speciální scéna obsahující pouze UI s animaci načítaní s předem definovanou délkou zobrazování.
\item úplné vynechání celé funkcionality a~tedy porušování licenčních podmínek,
\item nebo~simulaci načítaní~tak, že~po již plném načtení enginu se~otevře speciální scéna obsahující pouze UI s~animaci načítání s~předem definovanou délkou zobrazování.
\end{itemize}
Ve své práci pro mě bylo zásádní vytvářet věci technicky správně a tedy vyhýbat se programotorským workaroundům nebo technickému ,,lhaní'' hráči. Proto jsem si dál záležet i na spravném provedení načítací obrazovky.
Ve~své práci pro~mě bylo zásadní vytvářet věci technicky správně a~tedy vyhýbat~se programátorským workaroundům nebo~technickému ,,lhaní'' hráči. Proto~jsem~si~dal záležet i~na~správném provedení načítací obrazovky.
Postup tvorby načítací obrzovky vývojáři enginu nedokumentují a běžně dostupné návody třetích stran jsou již zmíněné nekvalitní simulace. Dokázal jsem najít pár funkčních ukázek u kolegů z Číny, které mi umožníli se zorientovat v základech a následně provést revers engeneering celé problematiky. K mému překvápení jedná se o důkladně propracovaný systém, který je podrobně přizpůsoben specifikům různých platforem.
Postup tvorby načítací obrazovky vývojáři enginu nedokumentují a~běžně dostupné návody třetích stran jsou již zmíněné nekvalitní simulace. Dokázal jsem najít pár funkčních ukázek u~kolegů z~Číny, které~mi~umožnily se~zorientovat v~základech a~následně provést reverse engineering celé problematiky. K~mému překvapení jedná~se o~důkladně propracovaný systém, který~je podrobně přizpůsoben specifikům různých platforem.
Engine při načítaní nepodporuje UI vytvořený v blueprintech, jelikož blueprinty jsou assety s hlubokou reflexí, kterou engine již načíta (po načtení již lze zobrazovat blueprint načítácí obrazovky mezi úrovně). Proto jsem se musel navíc učit a vytvořit UI v nizkourovňovém Slate.
Engine při~načítaní nepodporuje UI vytvořený v~blueprintech, jelikož blueprinty jsou assety s~hlubokou reflexí, kterou~engine již~načítá (po~načtení již~lze zobrazit blueprint načítací obrazovky mezi úrovněmi). Proto~jsem~musel vytvořit navíc UI~v~nízkoúrovňovém Slate.
\section{Audio}
\label{sec:audio}
V tomto projektu jsem se zaměřil primárně na zprovoznění všech potřebných technologií potřebných k dokončení uceleného produktu a proto ve hře je značný nedostatek audia. Přesto je ale připravené široké technické zázemí, které obsahuje drobné ukázky:
V~tomto projektu jsem~se~zaměřil primárně na~zprovoznění všech technologií potřebných k~dokončení uceleného produktu a~proto~je ve~hře značný nedostatek audia. Přesto je připravené široké technické zázemí, které~obsahuje drobné ukázky:
\begin{itemize}
\item nastavení a ukládání hlasitostí různých kategorií audia,
\item nastavení a~ukládání hlasitostí různých kategorií audia,
\item prostorové přehrávání,
\item dynamický hudební doprovod
\item a možnost dabování dialogů spolu s hotovým procesem generování hlasů.
\item a~možnost dabování dialogů spolu s~hotovým procesem generování hlasů.
\end{itemize}
Optimalizace audia nebyla mezi cíle této práce, avšak nějaký základní systematický pravidla byli určeny.
\newpage
Optimalizace audia nebyla mezi cíle této práce, avšak~základní systematická pravidla byla určena.
\begin{itemize}
\item Použít streaming a kompresi dat kdekoliv to bude možné,
\item hudební doprovod je formatu mp3,
\item hlasy a jiné zvuky jsou formatu wav.
\item Použít streaming a~kompresi dat kdekoliv to~bude možné,
\item hudební doprovod je~ve~formátu~MP3,
\item hlasy a~jiné zvuky jsou~ve~formátu~WAV.
\end{itemize}
V budoucnu by také pomohlo zabalit všechny hlasy a jiné audio do samostatných datových balíčků neboli chunků. Aktuálně všechny herní assety jsou automaticky zabalené do pár ucelených balíčků, což může vyvolát sice drobné zpomalení načtení assetů, ale stále kriticky ovlivnit audio zážítek.
V~budoucnu by~také pomohlo zabalit všechny hlasy a~jiné audio do~samostatných datových balíčků neboli~chunků. Aktuálně všechny herní assety jsou automaticky zabalené do~pár ucelených balíčků, což~může vyvolat sice drobné zpomalení načtení assetů, ale~stále kriticky ovlivnit audio zážitek.
\subsection{Dynamický hudební doprovod}
Když mluvíme o dynamickém doprovodu ve hrách, často myslíme právě dynamické přepínání častí skladby v zavislostí na proměnných světa. Pří vývoji jsem se uchýlil k použítí zvukového enginu FMOD (viz \Cref{prg:fmod}) a hudbu jsem skládál sám bez použití samplů, tedy pomocí VST hudebních nástrojů. Častí hotové kompozice za účelem dynamičností měli by být nějakým způsobem nerušívě zacyklené, na což jsem kladl největší důraz. Bohužel kvůli omezenému času jsem nemohl věnovat dostatečnou pozornost rozmanitosti a komplexitě hudebních kompozic. Prototypy dynamického doprovodu lze již zaslechnout v průběhu třetí úrovně.
Když~mluvíme o~dynamickém doprovodu ve~hrách, často myslíme právě~dynamické přepínání částí skladby v~závislosti na~proměnných světa. Pří~vývoji jsem se~uchýlil k~použití zvukového enginu~FMOD (viz~\Cref{prg:fmod}) a~hudbu jsem skládal sám bez~použití samplů, tedy~pomocí~VST (Virtual~Studio~Technology) hudebních nástrojů. Častí hotových kompozic za~účelem dynamiky by~měly~být nerušivě zacyklené, na~což~jsem kladl největší důraz. Bohužel kvůli~omezenému času jsem~nemohl věnovat dostatečnou pozornost rozmanitosti a~komplexitě hudebních kompozic. Prototypy dynamického doprovodu lze již~zaslechnout v~průběhu třetí úrovně.
\subsection{Dabing dialogů}
Jelikož hra by měla poskytnout prostor pro AI generativní obsah, dialogy jsou již nadabováné pomoci AI. Na internetu je velký výběr modelů zdarma, které dokažou tvořit skvělé výsledky. Původně jsem začínal s python knihovnou Coque TTS\footnote{https://github.com/coqui-ai/TTS}, ale dosáhnout v něm aspoň dobrých výsledku bylo náročné. Proto jsem přešel na knihovnu a model Zonos\footnote{https://github.com/Zyphra/Zonos}, který již v základu poskytuje vyníkájící výsledky a navíc má prostředky pro udržování kontextu nebo parametry zabarvení hlasu.
Jelikož hra by~měla poskytnout prostor pro~AI generovaný obsah, dialogy jsou již~nadabované pomocí~AI. Původně jsem začínal s~python knihovnou Coque~TTS\footnote{https://github.com/coqui-ai/TTS}, ale~dosáhnout v~ní aspoň dobrých výsledků bylo náročné. Proto~jsem~přešel na~knihovnu a~model Zonos\footnote{https://github.com/Zyphra/Zonos}, který~již v~základu poskytuje vynikající výsledky a~navíc má~prostředky pro~udržování kontextu nebo~parametry zabarvení hlasu.
V modulu VoiceGenerator v repozitáři hry je k dispozici skript na jednoduchou instalaci prostředi. Z časových důvodu jsem nestihl vytvořit skript, který by jednoduše generoval množiny resp. sekvence dialogů přímo z jednoho textového souboru. Aktuálně je potřeba ručně generovat každou větu jednotlivě přes webové rozhraní, které je součástí knihovny.
V~modulu VoiceGenerator v~repozitáři hry je~k~dispozici skript pro~jednoduchou instalaci prostředí. Z~časových důvodů jsem~nestihl vytvořit skript, který~by jednoduše generoval množiny resp.~sekvence dialogů přímo z~jednoho textového souboru. Aktuálně je~potřeba ručně generovat každou větu jednotlivě přes~webové rozhraní, které~je~součástí knihovny.
Ukázkové dialogy lze již zaslechnout v průběhu třetí úrovně. Původně jsem taky planoval vytvořit robotický hlas v třetí úrovní pomoci modifikace základního hlasu v novém pro UE5 zvukovém systému MetaSound. Ten dokáže komplexně modifikovat zvukový signal za běhu, ale na začlenění takové technologie do hry nezbýval čas.
Ukázkové dialogy lze již~zaslechnout v~průběhu třetí úrovně. Původně jsem~taky~plánoval vytvořit robotický hlas ve~třetí úrovni pomocí modifikace základního hlasu v~novém pro~UE5 zvukovém systému MetaSound. Ten~dokáže komplexně modifikovat zvukový signál za~běhu, ale~na~začlenění takové technologie do~hry nezbýval čas.
\section{Co se nestihlo nebo změnilo}
Přestože do práce jsem vložil mnoho času a úsilí, nepodařilo se mi splnít všechny mnou stanovené cíle. Místo herního dema, práce představuje spíš demo technické, neboli jsem úspěšně vytvořil technické zázemí, ale nestihl naplnít hru obsahem. Třetí úroveň nějakým obsahem disponuje a dohromady lze tuto úroveň považovat za hru. Jinak všechny úrovně resp. celá hra trpí nedostatkem nebo neobsahuje vůbec:
\newpage
\section{Co se~nestihlo nebo~změnilo}
Přestože do~práce jsem~vložil mnoho času a~úsilí, nepodařilo se~mi splnit všechny mnou stanovené cíle. Místo herního dema, práce představuje spíš demo technické, neboli~jsem~úspěšně vytvořil technické zázemí, ale~nestihl naplnít hru obsahem. Třetí úroveň nějakým obsahem disponuje a~dohromady lze tuto úroveň považovat za~hru. Jinak~všechny úrovně resp.~celá hra trpí nedostatkem nebo~neobsahuje vůbec:
\begin{itemize}
\item Grafické prvky jako animace postav, efekty, 3D modely.
\item Zvukové prvky jako hudební doprovod, zvuky interakce se světem a UI.
\item Příběhové dialogy, cutscény a dokončený level design.
\item Balancování herních mechánik a doladění ovládání.
\item Grafické prvky jako~animace postav, efekty, 3D modely.
\item Zvukové prvky jako~hudební doprovod, zvuky~interakce se~světem a~UI.
\item Příběhové dialogy, cutscény a~dokončený level design.
\item Balancování herních mechanik a~doladění ovládání.
\end{itemize}
Nestíhl jsem vytvořit poslední pátou úroveň a společně s tím jsem se rozhodl změnit žánr této úrovně z first-person shooter na top-down shooter. Důvodem změny posloužila analýza náročnosti tvorby obsahu pro takový žánr. Přestože first-person shooter se může zdát jako jednoduchý koncept, ve skutečnosti pro hezký herní zážitek je potřeba vložit mnoho usíli a času. Pro tento žánr je potřeba výborně odladit všechny prvky hry a hlavně animace, které jsou mojí slabinou. Na druhou stranu top-down shooter nekladé tak přísné požádavky a dokonce umožňuje schovat od hráče fakt nedostatku nebo slabé kvality animací.
Nepodařilo~se~mi vytvořit poslední pátou úroveň z~časových důvodů. Zároveň jsem~se~rozhodl změnit žánr této úrovně z~first-person shooter na~top-down shooter. Důvodem změny posloužila analýza náročnosti tvorby obsahu pro~takový žánr. Přestože~first-person shooter se~může zdát jako~jednoduchý koncept, ve~skutečnosti pro~hezký herní zážitek je~potřeba vložit mnoho úsilí a~času. Pro~tento~žánr je~nutné pečlivě odladit všechny prvky hry a~hlavně animace, které~jsou má slabá stránka. Na~druhou stranu top-down shooter neklade tak~vysoké nároky a~dokonce umožňuje skrytí od~hráče nedostačující animace.
\subsection{Obsah mimo hru}
Projekt není tvořen pouze technickým demo hry, ale taky zahrnuje nasazení a údržbu sítě s věřejnou ip adresou, webového a git serverů. Postupy nasazení a údržby z důvodu zaměření práce nejsou zvěřejněny.
Projekt není~tvořen pouze technickým demem hry, ale~také zahrnuje nasazení a~údržbu sítě s~veřejnou ip~adresou, webového a~git serveru. Postupy nasazení a~údržby z~důvodu zaměření práce nejsou zveřejněny.

View File

@ -15,5 +15,4 @@ Hlavní témata na~které se~práce zaměřuje:
\item Návrh tvorby generativního obsahu a~jeho načítaní v~Unreal Engine (\cref{sec:contentGenerationAndIntegration}).
\item Postupy tvorby různé grafiky v~UE (\cref{sec:graphics}).
\item Postupy tvorby zvuků a~hudby pro~hry (\cref{sec:audio}).
\item Práce s~Unreal~Engine, jeho reálná omezení, obcházení/vyrovnání se~s~těmito omezení a~tipy (\cref{sec:UETips}).
\end{itemize}