00. Export z Blenderu do Unity
Prenos 3D modelov, materiálov, textúr a animácií medzi rôznymi softvérovými nástrojmi býva často trápenie. Navyše kompatibilita medzi jednotlivými softvérmi sa neraz mení s vývojom novej verzie niektorého softvéru a čo platilo kedysi, už platiť nemusí.
Ukážeme si niekoľko postupov pre export modelu a textúr z Blenderu do Unity, ktoré momentálne fungujú dobre. Pre pochopenie tejto lekcie je potrebné ovládať aspoň základy práce s materiálmi v Blenderi, alebo chápať všeobecné princípy materiálov.
Začneme s najjednoduchším scenárom.
Jednoduchý materiál s textúrnymi mapami v obrázkoch
Ak si chcete okrem čítania tutoriálu priamo skúšať postup na tých istých dátach, ako je v tutoriáli, tak zdrojový súbor pre Blender si môžete stiahnuť tu: rusted_iron.zip
Stiahli ste si odniekiaľ textúry pre materiál, napríklad ako PNG alebo JPEG súboru. V našom prípade sú to textúry pre hrdzavý kov stiahnuté zo stránky freepbr.com. V Blenderi ste materiál napasovali na model a teraz chcete prejsť so svojím dielom do Unity. Takto vyzerá model v Blenderi a jeho materiál:


Materiál pozostáva z troch textúrnych máp:
- Difúzna zložka (Base Color) farby, v súbore rustediron2_basecolor.png.
- Čierno-biela metalická mapa, ktorá určuje, kde je objekt odrazivý a kde je drsný od hrdze, v súbore rustediron2_metallic.png
- Normálová mapa v súbore rustediron2_normal.png.
Situácia, keď jednotlivé mapy už existujú v podobe súborov, je pre export najjednoduchšia. Na zložitejšie scenáre sa pozrieme v tejto lekcii neskôr. Zatiaľ poďme vyexportovať tento jednoduchý.
Exportovať budeme do formátu FBX. V Blender File -> Export -> FBX.
V dialógovom okne pre export sú podstatné tri nastavenia:

Cieľový adresár je umiestnenie, kam sa má FBX vyexportovať. Ja som tu nastavil priamo adresár Models v assetoch môjho Unity projektu.
Path Mode definuje, akým spôsobom sa majú ukladať textúrne obrázky (PNG, JPG) vzhľadom na exportovaný súbor FBX. Režim Copy zabezpečí, že sa obrázky prekopírujú tam, kde dáme uložiť FBX súbor. Vďaka tomu nehrozí, že by sme pri transporte do iného softvéru zabudli prikopírovať textúry.
Checkbox Limit to Selected Objects vymedzí, že do exportovaného FBX sa dostane len aktuálne označené objekty. Inak by FBX obsahoval celú Blenderovú scénu, vrátane kamier a svetiel. A to teraz nechceme. Vy to inokedy možno budete tak chcieť, vtedy export nelimitujte.
Po vyexportovaní do assetového adresára sa v Unity priamo spustí import nových súborov medzi assety. Exportovaný materiál obsahoval normálovú mapu, na čo ma Unity upozorní:

Normálová mapa je špeciálny typ textúrnej mapy, lebo RGB hodnoty uložené v pixeloch nie sú farebné údaje ale geometrické údaje. Preto sa normálová mapa importuje trochu inak ako obrázkové textúry. Ale nateraz nám stačí stlačiť Fix now a Unity to za nás napraví.
Pozrime sa, ako to teraz vyzerá v assetoch:
Pribudol asset rusted_iron, ktorý obsahuje mesh 3D modelu a materiál:

Pri assete pribudol tiež adresár rusted_iron.fbm. V ňom sú nakopírované textúrne súbory, keďže sme pri exporte zvolili režim Copy.

Pretiahnime assetov rusted_iron do scény:

Nevyzerá veľmi kovovo. Asi sa pri exporte nedodržalo priradenie metalickej zložky materiálu. Pozrime sa na materiál, ktorý bol naimportovaný:

V jeho vlastnostiach vidíme, že má nastavenú difúznu zložku (tu sa volá Albedo, v Blenderi to bolo Base Color) aj že má nastavenú normálovú mapu. Ale nemá nastavenú metalickú zložku:

Zároveň však vidíme, že všetky položky sú šedé a nedajú sa editovať. Nie je teda možné metalickú zložku nastaviť. To je preto, že tento materiál je zatiaľ stále internou súčasťou FBX súboru a nie je plnohodnotným Unity materiálom. Na to, aby sme ho mohli editovať, ho musíme v rámci Unity vyextrahovať von z FBX:
Označme si asset rusted_iron. (Pozor! Chceme asset, nie game objekt v scéne). A pozrime si jeho vlastnosti v inšpektore. Zaujíma nás konkrétne sekcia Materials:

Tu je možnosť Extract Materials…, ktorá nám umožní vyextrahovať materiály von z assetu. Po stlačení sa nás spýta kam má materiál(y) vyextrahovať. Pre jednoduchosť zvolíme ten istý adresár, kde máme náš asset. Po vyextrahovaní sa situácia medzi assetmi zmení:

Materiál RustedIron už nie je súčasťou assetu rusted_iron, ale je samostatným assetom. A je už aj editovateľný, takže mu môžeme za metalickú zložku nastaviť príslušnú textúrnu mapu, ktorá je uložená v adresár rusted_iron.fbm:

A model v scéne už naozaj vyzerá metalický:

Prečo sa pri importe do Unity zachovalo spárovanie normálovej mapy či albedo farby s ich príslušnými textúrnymi mapami a nezachovala sa asociácia metalickej zložky s jej príslušnou textúrnou mapou? Je to jedna z tých mnohých nekompatibilít medzi softvérmi a podstatné je, že ju vieme napraviť.
Materiál kreslený priamo v Blenderi
Ak si textúru nakreslíme priamo v Blenderi a neimportujeme ju do Blendera z externého obrázkového súboru, situácia je trochu iná. Obrázkové dáta vtedy neexistujú v samostatnom súbore, ktorý by sa dal pri exporte skopírovať. Existujú len v pamäti Blendera. Takto nejak môže vyzerať textúra nakreslená priamo v Blenderi:

Keby sme takto otextúrovaný model exportovali do Unity, namaľovaná textúra exportom neprejde a model síce bude mať materiál, ale bez textúry:

Je to tým, že pixelové dáta z namaľovanej textúry sú zatiaľ len uložené v pamäti a nie v žiadnom súbore. Preto export nemá čo skopírovať do cieľového adresára. To, že sú obrazové dáta neuložené, nám Blender ukazuje aj v podobe hviezdičky pri Image v editore textúry:

Obrázok ale môžeme uložiť do externého súboru:

Pozor. Ak vyberiete voľbu Save a nie Save as, tak sa obrázok „uloží“ priamo do .blend súboru a nie do samostatného obrázkového súboru. Vtedy by vám FBX export neskopíroval textúrny súbor, lebo samostatný textúrny súbor pri takomto uložení ani nevznikne.
Keď už je textúra uložená v súbore, postupujeme rovnako ako v predošlom scenári. Čiže File->Export->FBX, nastaviť Path Mode na Copy, exportovať len Selected Objects. Po importe do Unity máme takýto asset:

A v scéne je pekne vyfarbený:

Materiál s procedurálnou textúrou
Najkomplikovanejší scenár je ten, kedy niektorá zo súčastí materiálu je procedurálna, alebo vzniká zmiešavaním viacerých textúr cez materiálové uzly. Napríklad takýto materiál, s náhodným šumom na zvlnenie srsti:

Ak si chcete vyskúšať aj tento scenár na pôvodných dátach, tu je zdrojový súbor pre Blender: noise_monkey.zip
Materiál vyzerá v Blenderi takto:

Používa tri textúry:
- MonkeySkin.png pre základnú farbu
- MonkeyFurMask.png ako masku pre určenie, kde sa má materiál náhodne zvlniť
- Noise Texture ako procedurálny šum, ktorý vyrába zvlnenie
Okrem procedurálneho šumu je tu aj operátor Multiply, ktorý násobí šum s maskou a tým masku aplikuje. A čo je horšie, výstup zo zvlnenia nejde do niektorého z materiálových kanálov, ale je napojený priamo do kanálu Displacement na výstupe zo shadera. Sodoma-Gomora, Cecilko! Dostať materiál v tejto podobe do FBX exportu a následne do Unity importu je prakticky nemožné.
Pomôžeme si tým, že procedurálny šum, aj masku, aj operátor vypečieme do obrázkovej textúry a tú následne uložíme.
Vytvoríme v materiáli novú obrazovú textúru. Nazval som ju NormalMap, pretože budeme vypekať normálovú mapu. Nemusíme ju pripájať k žiadnym ďalším uzlom v materiáli. Uistíme sa, že sme ju označili ako aktívny uzol – bude mať biely rámik:

Keď ju máme označenú, nastavíme Render Engine v Blenderi na Cycles:

A dole v sekcii Bake nastavíme typ vypekania na Normal, čo znamená, že chceme, aby Blender vyrenderoval scénu a do vybratej obrazovej textúry (v našom prípade je to tá novovytvorená NormalMap) vypiekol normálovú zložku.

S takto nastaveným rendererom stlačíme Bake:

Po chvíli renderovania sa do našej textúry uloží normálová mapa povrchu materiálu. Môžeme sa o tom presvedčiť v editore:

A rovno ju môžeme, ako pri minulom scenári, uložiť do súboru. Nazvime ju NormalMap.png:

S takto vypečenou normálovou mapou, môžeme teraz naložiť dvomi spôsobmi:
- Pripojíme ju do materiálu, aby sa nám pri exporte skopírovala automaticky. Toto bude vyžadovať mierne prekáblovanie materiálu, ale export je už potom automatický.
- Skopírujeme si ju do Unity sami.
A. Prekáblovanie materiálu
Ak si vyberieme možnosť A, budeme postupovať tak, že vypečenú normálovú mapu pripojíme do materiálu do kanálu Normal a odpojíme procedurálne časti z kanálu Displacement:

A potom už postupujeme ako v minulom scenári, keď sme nemali žiadne procedurálne časti, ale iba obrázkové textúry. Je to jednoduchší export, ale keby sme chceli napríklad meniť parametre Noise Texture, tak musíme zase materiál prekáblovať do pôvodnej podoby, lebo nebudeme vidieť zmeny v procedurálnej textúre, ktorá je už odpojená z materiálu.
B. Manuálne skopírovanie do Unity
Alebo nemusíme odpájať Displacement a zapájať normálovú mapu. Môžeme materiál ponechať bez zmeny. Vyexportujeme model do FBX štandardne a po importe do Unity zistíme, že sa pri exporte skopírovala iba farebná textúra MonkeySkin.png a normálová mapa sa neskopírovala. Je to preto, že jej uzol nebol nikde pripojený do materiálu. Ale my sme si predsa pre chvíľou uložili našu normálovú mapu do súboru a vieme ju tým pádom pridať do Unity manuálne. Stačí, keď skopírujeme súbor NormalMap.png do assetov:

A nesmieme zabudnúť, že normálové mapy sa importujú do Unity trochu inak, takže označme si novopridaný asset NormalMap. Pozrime sa na jeho inšpektor, v ktorom zmeníme Texture Type na Normal map. A potvrdíme zmenu v importe stlačením Apply:

Takto naimportovanú normálovú mapu budeme už vedieť pridať na materiál.
Nezabudnime, že aby sme mohli upraviť materiál v Unity, musíme ho vyextrahovať z assetu (viď predošlý scenár).
Výsledný naimportovaný model vyzerá v scéne takto:

Tento postup so zapekaným textúr nie je vyhradený len pre normálové mapy. Podobne by sme vedeli zapiecť aj iné zložku materiálu. Len by sme pri vypekaní vybrali v nastavení renderera iný Bake Type a nastavili, čo všetko má vplývať na vypekanie (priame osvetlenie, nepriame osvetlenie atď.) Toto však obsahuje veľa rôznych možností a nie je priestor ich tu pokrývať.
Zhrnutie
Pri exporte/importe cez formát FBX vieme síce vyexportovať celú scénu (aj s kamerou a svetlami) ale viac sa nám hodí exportovať len vybrané objekty ( Limit to Selected Objects ).
Pri exporte vieme nastaviť režim Path Mode na Copy, kedy sa textúrne súbory skopírujú do cieľovej destinácie exportu.
Cieľovú destináciu exportu z Blendera si viem nastaviť priamo do adresárovej štruktúry assetov môjho Unity projektu.
Pri exporte sa kopírujú tie textúry, ktoré existujú v podobe textúrnych súborov. Ak textúra existuje iba ako obrázok v Blenderi (napríklad sme ju namaľovali ručne, alebo vznikla vypečením) tak ju musíme explicitne uložiť aj do súboru na disk, aby sa pri exporte skopírovala. Prípadne si ju z disku skopírujeme do Unity projektu manuálne.
Procedurálne textúry (napríklad šum) či rôzne operátory nad textúrami (násobenie, farebné korekcie a pod.) nebudú súčasťou exportu do FBX, preto ich treba vypiecť do novej obrázkovej textúry a tú uložiť.
Dobrá rada na záver
Špecifické nastavenia materiálov, ako sú shininess, roughness, specularity a iné, sa veľmi líšia medzi jednotlivými softvérmi. Dokonca sa neraz líšia aj v rámci jedného softvéru, keď sa používajú rôzne shadre alebo renderery.
Preto sa veľmi neoplatí investovať do piplania sa s materiálom v Blenderi. Najlepšie je prejsť čo najskôr do Unity a materiál nastavovať už tam. V externých softvéroch (Blender, Substance Painter a pod.) treba porobiť iba UV mapovanie, maľovanie textúr, procedurálne textúry. Potom všetko vyexportovať a šup ho nastavovať lesklosti, drsnosti a ostatné materiálové vlastnosti už priamo v Unity.
Keď náhodou neskôr budete potrebovať premaľovať niektorú textúru, tak ju v Blenderi či Substance premaľujete, vyexportujete a nahradíte starý textúrny súbor v Unity projekte novým. Aktualizácia v Unity prebehne automaticky a materiálové vlastnosti, ktoré ste nastavili v Unity sa zachovajú.