Eksport modelu i tekstur
W tym artykule chciałbym przedstawić podstawy tworzenia dodatków do symulatora pociągów Trainz. Jest to jednocześnie (mam nadzieję) początek serii artykułów, w której będę pokazywać coraz bardziej zaawansowane mechanizmy gry i tego, jak je skonfigurować.
Z uwagi na obszerność zagadnienia nie zamierzam skupiać się na szczegółowej obsłudze programów do modelowania czy tworzenia materiałów PBR. Jedynie w tym początkowym artykule dam kilka wskazówek, skąd i jak się uczyć, jeśli pragniesz opanować również te umiejętności. Później jednak będę zakładał, że posiadasz już gotowy model 3D i materiały i po prostu chcesz umieścić je w grze, dając jedynie wskazówki w tych miejscach, gdzie struktura gry wymusza na nas przestrzeganie w modelu jakiejś ważnej zasady.
Informacyjnie dodam, że artykuł piszę z myślą o tworzeniu dodatków pod najnowsze wersje gry: TRS19/TRS22.
Meshe, LOD, materiały – o co chodzi
Trainz jest grą wykorzystującą grafikę 3D, dlatego prawie wszystkie dodatki, jakie będziemy tworzyć, będą posiadać jakiś model 3D. Ten model po angielsku zwie się po prostu “mesh” i z tą nazwą spotkasz się w wielu miejscach. Model określa jedynie kształt obiektu, natomiast za całą resztę wyglądu obiektu odpowiadają tzw. materiały (ang: “materials”). Dla nas materiał to nic innego, jak zbiór tekstur (plików graficznych) oraz dodatkowych plików konfiguracyjnych, które pomagają grze prawidłowo zrozumieć, co w tych teksturach jest.
Warto wiedzieć: plik graficzny z teksturą to nie tylko informacja o kolorze poszczególnych punktów. W teksturach można też kodować informacje o fizycznych właściwościach materiałów pozwalające karcie graficznej prawidłowo symulować oświetlenie. Powiemy o tym za chwilę.
Ostatnim ciekawym pojęciem jest LOD, czyli poziom szczegółów (ang. level-of-detail). Jest to powszechnie stosowana technika, w którym dla każdego obiektu posiadamy kilka modeli 3D różniących się szczegółowością. W zależności od tego, jak daleko obiekt znajduje się od kamery, renderujemy inny model. Jeśli jesteśmy daleko, nie ma potrzeby obciążać karty graficznej renderowaniem drobnych szczegółów, których z odległości i tak nie byłoby widać. Pozwala to tworzyć bardzo bogate scenerie bez istotnego wpływu na wydajność.
Nieco więcej o materiałach i PBR
Wróćmy jeszcze na chwilę do materiałów i zatrzymajmy się na krótkie zapoznanie z historią Trainza, bowiem jest to bardzo ważne do dalszych wywodów na temat tworzenia dodatków.
W Trainz istnieją różne typy materiałów różniące się możliwościami i przeznaczeniem. W wersji T:ANE (włącznie) wydanej w 2015 roku gra wspierała 7 typów materiałów, z których najpopularniejszym był tzw. m.onetex, w którym obiekt pokrywaliśmy po prostu pojedynczą teksturą – zwykłym obrazkiem opisującym kolor punktów, np. zrobionym ze zdjęć. Bardziej wyspecjalizowane materiały pozwalały na ograniczone stosowanie efektów takich, jak odbicia światła, albo drobne wybrzuszenia (bump). W czasach, kiedy powstała pierwsza wersja Trainza (okolice roku 2000), był to szczyt możliwości ówczesnych kart graficznych, jednak od tamtej pory technologia znacząco się rozwinęła, zwłaszcza w obszarze oświetlenia.
Aby dobrze symulować odbicia świetlne, trzeba naśladować prawa fizyki i karta graficzna potrzebuje w tym celu informacji o fizycznych właściwościach powierzchni modelu 3D. W grafice 3D materiały wzbogacone o te informacje nazywają się właśnie materiałami PBR (Physical-Based Rendering). Od wielu lat PBR jest podstawą grafiki 3D i jest powszechnie stosowany w programach graficznych oraz silnikach gier. Jednak wspomniane 7 materiałów Trainza nie zawierało tych informacji – nie są to materiały PBR, zatem gra nie jest w stanie wykorzystać możliwości współczesnych kart graficznych do renderowania oświetlenia.
Te braki nadrobił Trainz 2019, w którym pojawiło się 5 nowych typów materiałów PBR. Podstawowym materiałem PBR, który powinien być wykorzystywany do większości celów, jest m.pbrmetal. Dostarczamy w nim zestaw tekstur, które łącznie kodują następujące informacje:
- albedo – tradycyjny kolor (obrazek)
- roughness – chropowatość powierzchni
- metallic – metaliczność powierzchni
- ambient occlusion – podatność na rozproszone światło otoczenia (ambient light)
- emissive – w jakim stopniu obiekt sam emituje światło; przydatne do tworzenia widoku nocnego obiektów
- normal map – symulowanie wypukłości i wgłębień na powierzchni obiektu
Tworzenie odpowiedniego zestawu tekstur ręcznie jest bardzo czasochłonne, dlatego nie tworzymy ich ręcznie 🙂. Istnieją gotowe, wyspecjalizowane programy do teksturowania takie, jak Adobe Substance Painter. Jest to dobra i zła wiadomość. Zła jest taka, że trzeba się tych programów nauczyć i (przynajmniej na dzień pisania artykułu) zapłacić za ich wykorzystanie, ponieważ nie ma jeszcze dobrych, otwartych alternatyw. Dobra jest taka, że nie są one wcale trudne w obsłudze i pozwalają na znacznie więcej niż to, co jesteśmy w stanie zrobić ze zwykłą teksturą-obrazkiem w Gimpie czy Photoshopie. Przykładowo, dzięki temu że aplikacja zna fizyczne właściwości powierzchni, pomalowanie czegoś realistycznie wyglądającym brudem czy nawet śniegiem to kwestia kilku minut klikania (serio – z tymi programami nałożenie realistycznego śniegu to banał!). W ten sposób bardzo łatwo możemy stworzyć “letnią”, jak i “zimową” wersję obiektu, a także przygotować go w kilku wariantach kolorystycznych. Korzystam z tego bardzo często w moich dodatkach.
Co zatem z tysiącami dodatków korzystającymi ze starszych materiałów? Co się stanie, jeśli zainstalujemy je w TRS19 lub nowszym? Otóż gra jest w stanie nadal załadować i wyświetlać takie dodatki. Jednak ma to swoje ograniczenia – gra pod spodem konwertuje wszystkie stare tekstury do formatu PBR, przyjmując jakieś rozsądne domyślne ustawienia dla brakujących informacji. Obiekty takie będą wyglądać znośnie, jednak na pewno zauważymy, że część powierzchni obiektu nie wygląda do końca realistycznie, a w niektórych miejscach nasz obiekt będzie tak jakby “przepalony”. Tego nie przeskoczymy. Gra nie jest w stanie po prostu “domyślić się”, że np. dana część tekstury reprezentuje cegłę, która ma inne właściwości fizyczne i zupełnie inaczej odbija światło niż metal.
Z tych dwóch powodów (możliwości, które daje PBR i wygląd w nowych wersjach Trainza) gorąco zachęcam, abyś zainwestował(a) w naukę techniki PBR. Jeśli interesujesz się grafiką 3D, te umiejętności i tak Ci się przydadzą. Jeśli zależy Ci na kompatybilności ze starszymi wersjami Trainza, wciąż możesz z materiału PBR zrobić “starą” teksturę i zapakować drugą wersję dodatku przeznaczoną pod starsze wersje Trainz – w jednym z przyszłych artykułów pokażę, jak to osiągnąć. Ogólnie łatwiej jest z materiału PBR zrobić prostszą wersję z jedną teksturą-zdjęciem niż z prostej tekstury odtworzyć brakujące informacje, aby uzyskać PBR.
Nie znam się na modelowaniu i materiałach, od czego zacząć?
Jeśli dopiero zaczynasz swoją przygodę z grafiką 3D, polecam zainteresować się następującymi programami:
- Blender – darmowy i potężny kombajn do grafiki 3D,
- Adobe Substance Painter – komercyjny program do tworzenia materiałów PBR i nakładania ich na modele.
Do nauki Blendera polecam genialne tutoriale na YouTube autorstwa youtubera Blender Guru. Zaczynało od nich bardzo wielu utalentowanych twórców 3D i gwarantuję, że już nawet po przerobieniu kilku pierwszych filmów będziesz w szoku, zobaczywszy własną twórczość. Do poznania podstaw Substance Paintera polecam z kolei filmy autorstwa PL Tutors, które w przystępny sposób wprowadzają w temat i w dodatku nagrane są w całości w języku polskim!
Substance Painter wymaga niestety zakupu pudełkowej wersji albo wykupienia subskrypcji. Polecam tę drugą opcję, gdyż wraz z nią dostajesz dostęp do ogromnej biblioteki gotowych materiałów PBR, które możesz legalnie wykorzystać w swoich projektach. Wystarczy Ci w zupełności najtańsza subskrypcja “Substance 3D Texturing” kosztująca w momencie pisania artykułu $19,99 miesięcznie, którą można sobie anulować, kiedy z niej nie korzystasz. Otrzymujesz w niej dostęp do biblioteki materiałów i 3 programy: Substance Sampler (tworzenie materiałów PBR ze zdjęć), Substance Designer i właśnie Substance Painter. W wersji pudełkowej płacisz za program raz, ale dostajesz sam program, bez materiałów.
Dodam, że powstaje darmowa, otwarta alternatywa dla Substance Paintera o nazwie Armor Paint, ale niestety jest ona w fazie rozwojowej i dodatkowo nie dostajemy zbyt wielkiej biblioteki materiałów, co będzie wiązało nam ręce. Cóż, tak wygląda obecnie sytuacja – wybór opcji należy już do Ciebie.
Anatomia dodatku do Trainz
Po takim długim, acz niezbędnym wstępie możemy w końcu zająć się dodatkami. Dodatek do Trainza to nic innego, jak zbiór plików zawierający:
- główny plik konfiguracyjny config.txt bezpośrednio w głównym katalogu dodatku,
- pomocnicze pliki konfiguracyjne (np. dla materiałów)
- modele 3D,
- tekstury,
- inne pliki multimedialne lub skrypty (jeśli potrzeba).
Poza wspomnianymi już wyżej aplikacjami graficznymi, nie potrzebujemy żadnych innych wyspecjalizowanych narzędzi. Do tworzenia plików konfiguracyjnych wystarczy nam zwykły edytor tekstu, np. Notatnik. Potrzebujemy też oczywiście samego Trainza :).
Struktura katalogów w dodatku jest dowolna – jedynym “twardym” wymaganiem jest umieszczenie pliku config.txt bezpośrednio w głównym katalogu. W najprostszych dodatkach nie musimy dzielić reszty plików na katalogi, jednak dla własnej wygody warto to robić. Przykładowo, ja w obiektach scenerii tworzę sobie dwa katalogi summer i winter zawierające pliki pod letnią i zimową wersję dodatku.
Do plików konfiguracyjnych wrócimy w drugiej części artykułu, natomiast teraz skupimy się na prawidłowym wyeksportowaniu modelu i tekstur.
Przygotowanie modelu 3D
Tak jak wspomniałem na starcie, w tym artykule nie będę objaśniał podstaw korzystania z aplikacji takich, jak Blender, ani modelowania 3D. Jest jednak pewna konwencja, której musimy przestrzegać, jeśli chcemy nasz model później załadować do Trainz. Dotyczy ona prawidłowego nazewnictwa materiałów oraz konfiguracji shaderów.
Wszelkie materiały używane przez nasz model powinny mieć nazwę w formacie <jakaśnazwa>.<typ> , gdzie typem może być np. “m.onetex” albo “m.pbrmetal”. Przykładowo, ja w swoich modelach budynków posiadam jeden materiał o nazwie “building.m.pbrmetal”. Wybór takiej nazwy wymusza na mnie wykonanie kilku rzeczy:
- typ m.pbrmetal oznacza, że mamy do czynienia z materiałem PBR, do którego muszę prawidłowo skonfigurować w Blenderze shader,
- przy późniejszym pakowaniu plików materiału do katalogu z dodatkami będę posługiwał się nazwą “building”
W Blenderze materiał to po prostu shader, który możemy sobie dowolnie zaprogramować i którego Blender używa później do renderowania sceny. Jednak Trainz posiada swoje własne shadery, a z konfiguracji shadera zapisanej w modelu wyciąga sobie tylko parę potrzebnych informacji. Dlatego nasz blenderowy shader musimy zbudować w ściśle określony (i zawsze taki sam) sposób. Konsekwencją tego jest to, że gdybyśmy spróbowali wyrenderować sobie nasz obiekt w Blenderze, to nie będzie on w nim wyglądał w pełni poprawnie. Jest to oczekiwane i nie powinniśmy się tym przejmować.
Trainz oczekuje, że wszystkie informacje o materiale PBR znajdą się w trzech plikach tekstur nazwanych “albedo” (kolor), “normal” (mapa normalnych) i “parameters” (pozostałe parametry). W naszym shaderze musimy podpiąć dokładnie te trzy pliki w sposób pokazany poniżej:
Kroki:
- Tekstura albedo:
- dodaj węzeł “Image texture” i załaduj w nim plik z teksturą albedo,
- w opcji “Color space” węzła ustaw “sRGB”
- podepnij go do węzła “Color” w “Principled BSDF”
- Tekstura parameters:
- dodaj węzeł “Image texture” i załaduj w nim plik z teksturą parameters,
- w opcji “Color space” węzła ustaw “non-color”
- podepnij wyjście “Color” do wejścia “Roughness” w “Principled BSDF”
- podepnij wyjście “Alpha” do wejścia “Metallic” w “Principled BSDF”
- Tekstura normal:
- dodaj węzeł “Image texture” i załaduj w nim plik z teksturą parameters,
- w opcji “Color space” węzła ustaw “non-color”
- dodaj węzeł “Normal map”
- połącz węzły “Image texture” i “Normal map” poprzez parametr “Color”
- połącz węzły “Normal map” i “Principled BSDF” poprzez parametr “Normal”
Uwagi:
- jeśli nie posiadasz jeszcze plików tekstur, zostaw sobie po prostu odpowiednie węzły i skonfiguruj je później.
- w punkcie 2.d. wygląda, że sam Trainz nie potrzebuje tego połączenia, tj. nawet jeśli go nie stworzymy, to w grze model będzie prawidłowo oteksturowany. Tworzymy je po to, by w Blenderze podgląd był nieco bliższy finalnemu wyglądowi.
Źródło: https://online.ts2009.com/mediaWiki/index.php/M.pbrmetal
Eksport plików
Zobaczymy teraz, jak prawidłowo wyeksportować model i tekstury na potrzeby gry.
O obsługiwanych formatach modeli
Historycznie gra wykorzystywała autorski format plików dla modeli 3D o nazwie IM (“Indexed Mesh”), do którego udostępniony był eksporter z 3D Studio Max. Dało się też wyeksportować do IM model z Blendera. Format ten jest w dalszym stopniu obsługiwany przez grę, jednak od wersji T:ANE (wydanej w 2015 roku) wprowadzono nowe rozwiązania. Nowym docelowym formatem modeli dla gry jest tzw. TrainzMesh. Nie potrzebujemy do niego żadnego dedykowanego eksportera – zamiast tego nasz model zapisujemy w programie graficznym w powszechnie stosowanym formacie FBX, wrzucamy ten plik do katalogu z dodatkiem i podczas instalacji gra sama konwertuje go z FBX-a na TrainzMesh. Zalecane jest, aby nowsze dodatki korzystały z tych dwóch formatów. W przyszłości może pojawić się sytuacja, że hipotetyczne nowe funkcjonalności silnika gry będą możliwe do wykorzystania jedynie w dodatkach korzystających z TrainzMesha i FBX.
Zaletą FBX jest to, że jest on de facto standardem rozumianym i obsługiwanym przez wszystkie wiodące aplikacje związane z grafiką 3D. FBX bez problemu wyeksportujesz w Blendera, załadujesz do 3D Studio Max, oteksturujesz w Substance Painterze, a potem wgrasz zarówno do Trainza, jak i Unreal Engine, jak i Unity Engine, jak i wielu innych miejsc.
Ciekawostka: kiedy już wgramy nasz dodatek do Trainza i uzyskamy plik TrainzMesh, plik FBX możemy… skasować i wypuścić w świat dodatek zawierający sam plik TrainzMesh. Nie tylko sprawi to, że dodatek będzie mniej ważył. Plik FBX można bez problemu otworzyć w każdym programie do grafiki 3D, więc de facto dajemy innym możliwość swobodnych przeróbek lub wykorzystania modelu do innych celów, a nie zawsze chcielibyśmy dawać taką możliwość.
Źródła: https://online.ts2009.com/mediaWiki/index.php/IM_files , https://online.ts2009.com/mediaWiki/index.php/FBX_file_format
O obsługiwanych formatach tekstur
Jeśli chodzi o pliki tekstur, to gra obsługuje wszystkie popularne formaty: BMP, PNG, JPG, TGA. Z wcześniejszych sekcji artykułu wiemy jednak, że w przypadku materiałów PBR część z naszych tekstur będzie kodować informacje o fizycznych właściwościach materiałów i że tych plików raczej nie tworzymy ręcznie. Za chwilę zobaczymy, jak prawidłowo wyeksportować je z Substance Paintera.
Eksportujemy model z Blendera
Aby wyeksportować nasz model 3D do formatu FBX z Blendera, robimy następujące kroki:
- wchodzimy w tryb “Object mode” i zaznaczamy wszystkie obiekty na scenie, które chcemy wyeksportować,
- z menu wybieramy opcję File > Export > FBX (.fbx)
- w oknie dialogowym wskazujemy miejsce zapisu i nazwę pliku,
- po prawej stronie okna dialogowego znajdziemy panel z opcjami eksportu, które musimy ustawić w odpowiedni sposób.
Poniżej widzimy zrzut ekranu pokazujący prawidłowe ustawienia eksportera. Ważne są zwłaszcza ustawienia w “Transform”, które odpowiadają za to, jak eksporter ma przeliczyć współrzędne tak, aby model poprawnie wyświetlił się w grze.
W sekcji “Include” opcja “Limit to: Selected objects” mówi nam, że eksporter zapisze w pliku tylko te obiekty, które zaznaczyliśmy na scenie. W “Object types” wystarczy wybrać eksport obiektów typu “Mesh”. Typ “Empty” może być odznaczony, jeśli w modelu nie wykorzystujemy żadnych punktów zaczepienia np. dla spline’ów, wyzwalaczy (triggerów) czy innych specjalnych funkcjonalności.
Ważne! Ustawień tych nie musisz konfigurować za każdym razem, jak chcesz to wyeksportować. Tuż nad panelem znajdziesz opcję “Operator presets”, w której możesz zapisać sobie wszystkie ustawienia pod jakąś nazwą (np. “Trainz”) i później po prostu wybierać je z listy.
Importujemy model FBX do Substance Paintera
Wspomniałem, że zarówno Trainz, jak i Substance Painter (SP) obsługują format FBX. Tak, to prawda, ale… na potrzeby SP musimy nasz model wyeksportować nieco inaczej niż do Trainza :). Po prostu zamiast używać opcji eksportu pokazanych powyżej, stosujemy domyślne ustawienia Blendera.
Przy tworzeniu nowego projektu w SP wybieramy następujące opcje:
- File: wybieramy nasz plik FBX
- Normal format: DirectX
- Output resolution: docelowy rozmiar tekstury
Po załadowaniu projektu robimy następujące kroki:
- przechodzimy do zakładki “Texture set list” i zmieniamy nazwę materiału z “building.m.pbrmetal” na “building”. Dzięki temu nie będziemy musieli później ręcznie zmieniać nazw wyeksportowanych plików.
- w zakładce “Texture set settings” klikamy “Bake mesh textures” i w ustawieniach “Mesh map settings” ustawiamy “Output size” na identyczny rozmiar tekstur, jak ten, który wybraliśmy, tworząc projekt. SP ułatwia sobie pracę poprzez zapisanie różnych informacji o modelu do zbioru technicznych tekstur. Dzięki tej zmianie upewniamy się, że te informacje będą zbudowane w dokładnie takiej samej rozdzielczości, jak nasze końcowe tekstury. Unikamy w ten sposób pojawienia się różnych dziwnych artefaktów itd.
Wskazówka dot. modelowania i eksportu: ja osobiście zaczynam od stworzenia bazowego modelu w Blenderze, z którego później robię osobną wersję pod Substance Paintera i pod Trainza. Obie wersje mam zapisane w tym samym pliku Blendera (są to po prostu osobne zbiory obiektów na tej samej scenie), posiadają ten sam materiał i dokładnie tę samą mapę UV. Jedynie wersja dla SP pocięta na obiekty wzdłuż rodzajów powierzchni, np. osobno ściana koloru A, osobno ściana koloru B, osobno kamień, osobno np. rama okienna. Ułatwia mi to później pracę w samym SP. Wersja pod Trainza służy mi natomiast do stworzenia poziomów LOD.
Eksportujemy materiał z Substance Paintera
Kiedy pokryliśmy już nasz obiekt materiałem, przychodzi pora na eksport plików tekstur. Różne silniki 3D i aplikacje stosują różne konwencje tego, jak umieszczać informacje PBR w teksturach i SP posiada wiele wbudowanych ustawień. Niestety, nie ma wśród nich gotowej konfiguracji dla Trainza, jednak stworzenie takowej jest bardzo proste.
Wybieramy w menu opcję File > Export textures. Przy pierwszym eksporcie wchodzimy w zakładkę “Output templates” i tworzymy konfigurację dla Trainza wg następującego wzoru – uwaga, pasuje on dla materiału typu m.pbrmetal, inne materiały PBR mogą wymagać niewielkich zmian:
Kroki:
Tekstura albedo: wrzucamy “Base color” jako kanały RGBTekstura parameters:
wrzucamy “Emissive” jako kanał Rwrzucamy “Roughness” jako kanał Gwrzucamy “Ambient occlusion” jako kanał Bwrzucamy “Metallic” jako kanał alfa
Tekstura normal: wrzucamy “Normal DirectX” jako kanały RGB
W polach tekstowych po lewej definiujemy szablon nazwy pliku dokładnie tak, jak pokazane jest na zrzucie ekranu. Wszystko zapisujemy pod nazwą np. “Trainz pbrmetal” i potem naszych ustawień możemy używać na zakładce “Settings” przy kolejnych eksportach:
Kroki:
- Output directory – wskazujemy docelowy katalog,
- Output template – wybieramy nasze ustawienia “Trainz pbrmetal”
Co z kanałem alfa? Niektóre osoby mogą zapytać teraz: hej, a ja chcę mieć przezroczystość i kanał alfa w swoim materiale – dlaczego go nie eksportujemy? Nie eksportujemy go dlatego, że materiał m.pbrmetal go nie wykorzystuje ze względów wydajnościowych. Do tekstur z przezroczystością istnieje osobny typ materiału, o którym powiem więcej w jednej z kolejnych części artykułu wraz z wyjaśnieniem, jak go bezpiecznie stosować, by nie zabił on wydajności.
Podsumowanie
Wykonawszy wszystkie kroki z tego artykułu powinniśmy posiadać w naszym katalogu z dodatkiem następujące pliki:
- building.fbx
- building-albedo.png
- building-parameters.png
- building-normal.png
Wszystkie elementy graficzne są już na miejscu, dlatego teraz będziemy musieli Trainzowi powiedzieć, jak należy ich użyć. Tym zajmiemy się właśnie w drugiej części artykułu, gdzie poznamy podstawy tworzenia plików konfiguracyjnych dodatku i dowiemy się, jak finalnie zaimportować wszystko do Trainza.
Autor poradnika: Zyxist