Visa ett inlägg
Gammal 2021-11-09, 21:28   #137
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 716
Standard

Hallåj i höstmörkret!

Det var ett tag sedan sista uppdateringen, men verkstaden har inte stått still för det! Jag har filat på engine-specs, modellerat skyffel och kol till interiören, gjort ett lock till Friedmannpumpen och skriptat så att den fylls på när man öppnar, scriptat veven till Friedmann-pumpen så man manuellt kan pressa ut olja, färdigställt Bahr-tendern, fixat kopplingsslangar och scriptat dessa, LOD:at alla mesher på loket och Bahr-tendern(puh!) samt fixat hundra småsaker. Att-göra-listan bockas av sakta men säkert.

Ytterligare en sak som jag fixat sedan sist är att skapa lite ljus i hytten. Mer om det senare.

Det fanns lite intresse tidigare i tråden om hur jag tänkte göra med LOD och resultatet blev som följer. Jag har enbart använt LM-tekniken, där man har en text-fil där alla LOD-nivåer för varje mesh står listade och alltså inte använt mig något av mesh-table-lod-transition-distances-varianten i configen. LOD:ningen är gjord med en blandning av Decimate-modifiern och manuellt edge- och vertex-slidande i Blender. Det gick faktiskt snabbare än vad jag hade befarat, även om det tog tid.

Och nedan antalet trianglar på varje LOD-nivå, enligt Blender.

Loket (Exteriöra modellen, inklusive det som syns av hytten utifrån, exklusive animerade delar som dörrar och fönster):
LOD0: 84891, LOD1: 68782, LOD2: 15224, LOD3: 6034, LOD5: 370
Jag hoppade över LOD4 ifall jag skulle vilja klämma in en till nivå mellan 3 och 5. Sista nivån dumpar alla attachments, så modellen innehåller även hjulen och dörrar m.m. Inte för att de syns på det avståndet men ändå.

Drivhjulen:
LOD0: 12845, LOD1: 7439, LOD2: 3767, LOD3: 726, LOD4: 456

Löphjulen (per styck):
LOD0: 1776, LOD1: 1216, LOD2: 472, LOD3: 256

Alla animerade delar (dvs dörrar, fönster, kol- och vattenluckor, takluckan, samt kol- och vattenytan) LOD:ades med mellan 2 och 3 nivåer, beroende på hur komplicerade mesherna var. Alla animerade delar har tillsammans på LOD0 3372 trianglar. Till detta kommer några extra mesher, som glasrutor och kopplingsslangarna till Bahr-tendern.

Enligt Trainz innebär detta att loket består av runt 108 000 trianglar när man kollar på det från några meters avstånd. Typ 8 gånger mer trianglar än vad jag använde på mina teak-personvagnar med andra ord.

Såhär ser modellen ut om man kollar på den i Preview Asset-verktyget i CM och ändrar LOD-distance:


Notera att jag har missat att droppa löphjulen i sista steget, det måste jag fixa.

Det svåraste har varit stora rundade ytor, som domen, skorstenen och hörnen på vattentankarna. Det märks väldigt tydligt när dessa hoppar mellan LOD-steg, så där har jag varit väldigt försiktig med att minska antalet trianglar i de första nivåerna.

------------------------

Sedan, på tal om höstmörker, så har jag fixat en till sak. Nämligen belysning! Inne i hytten sitter det tre små gaslyktor som ska lysa upp eldarmanometern och vattenståndsglaset, samt förarens manometrar, hastighetsmätare och omkastarskalan. Jag klurade ju ut ett sätt att fejka belysning inne i hytten när vi höll på med Lans Sa och B-lok. Metoden går ut på att man gör en kopia av de mesh-delar i interiören som blir upplysta och flyttar ut varje polygon en millimeter framför den vanliga meshen. Sedan gör man nya texturer till den kopierade meshen och bakar in ljusinformation med hjälp av en riktigt path-tracer-renderingsmotor, i mitt fall Cycles som följer med Blender. Sedan är det väldigt enkelt att visa eller dölja den meshen med hjälp av lite scriptande inne i spelet. Jag fixade det på både Sa och B-loken, så jag tänkte att det inte skulle vara så svårt att greja på mitt lok. Men här visade det sig vara lite krångligare än vad jag tänkt på grund av PBR-texturerna som ju använder alphakanalen. Och Blender kan inte på något enkelt sätt baka till alpha-kanalen. Men med lite bollande med Tanigardi så lyckades jag lösa det. Hela tillvägagångssättet ser ut som följer:

1. Kopiera de mesher som kommer att lysas upp av lyktorna och flytta dem till en egen collection.
2. Jag har mappat interiören på två olika texturer, så ungefär hälften av ytorna kom från vardera texture. Jag vill bara ha en textur till ljus-texturen och dessutom utnyttja ytan ordentligt så här måste jag mappa om och sedan baka över allt och kombinera det till en texture.
3. Jag joinar alla mesher som tillhör samma textur, så jag får två mesher, en för vardera textur. Sedan skapar en ny UV-map på båda dessa mesherna.
4. Med den nya UV-mappen på båda mesherna så UV-mappar jag om alla trianglar och packar allt till en ny ljus-textur på 2048x2048 pixlar. Nu har de båda mesherna varsina två UV-mappar, den gamla mappningen för respektive gamla texturer och en gemensam mappning för den nya ljus-texturen.
5. Jag bakar alla tre PBR-texturerna (albedo, normal, parameter) till nya texturer med den nya gemensamma UV-mappningen. Detta gör jag till exempel genom att koppla in den gamla armatur-texturens albedo i Base color på shadern, och baka till ljus-texturens albedo. Se till att man använder gamla UV-mappen i det man bakar från och den nya till det man bakar. Detta får jag göra först för ena meshen och sedan för den andra, eftersom den använder olika texturer att baka från. Sedan gör jag det för albedo, normal och parameter. Den sista fick jag dela upp eftersom Blender inte kan baka alpha enkelt. Jag bakade därför bara ut Roughness och Metalness, eftersom jag inte har använt AO eller Emission på interiörens texturer. Var noga här med att ställa in "Linear" (tror att "Non-color" fungerar också) både i från och till-Image-texture noderna för normal och parameter-texturen. Annars kommer de att gammajusteras, vilket blir fel. Resultatet blir alltså fyra texturer, albedo, normal, roughness och metalness med innehållet från de båda gamla texturerna med med den nya UV-mappningen.
6. Sedan kopierar jag båda mesherna för att ha som backup, och på kopiorna kastar jag bort de gamla UV-mapparna, så bara ljus-texture-UV-mappen är kvar och joinar dem till en mesh.
7. Den nya meshen måste nu få alla ytor utflyttade med ca en mm för att de inte ska krocka med den vanliga, underliggande hyttens mesher. Detta är busenkelt genom att markera allt och i edit-mode trycka Alt-S (eller leta reda på verktyget Shrink/Fatten). Skriv in 0.001 för 1 mm och vips så är det färdigt!
8. Därefter så bakade jag ut en lightmap, alltså en grå texture som bara innehåller färg och intensitet från lamporna. Så jag satte jag upp ljus (använde point lights med en aning gul ton med hjälp av en blackbody nod på 3800 Kelvin) , satte materialet till att ha en mellangrå Base color, och satte upp Cycles. Därefter bakade jag (Diffuse, kryssa i Direct och Color för att få bara diffust ljus och få med färginformationen från lamporna) till en ny textur. Jag fick skruva upp antalet samples till 2000 för att få ned bruset, så det tog ett par minuter att baka.
9. Därefter satte jag ihop texturerna i Mixer. Här skapade jag bara en ny mix, kopplade in albedo, normal, roughness och metalness som jag fick ut i steg 5 i base-lagret, samt lade in lightmap:en som AO (jag bakar aldrig ut denna som AO, jag bara utnyttjar det "lagret" i Mixer eftersom jag inte använder AO på interiören). Därefter lade jag till ett nytt Solid layer med bara lightmap:en som albedo. Den mixar jag sedan in med multiply för att lägga till ljusinformationen som jag bakade med Cycles på den den vanliga albedon. Jag drog ned opaciteten på detta lager till ~40% för att det skulle smälta ihop bättre med omgivningen i spelet och inte bli för kontrastrik.
10. Sedan exporterade jag Albedo, Normal och Parameter-texturerna, precis som Trainz vill ha dem. Här gjorde jag dock två kluriga saker: Jag exporterade AO-lagret (alltså light-mappen i gråskala) som alpha på albedon (så ljusstyrkan kontrollerar genomskinligheten på materialet) och så exporterade jag även AO-lagret som emission (R-kanalen) på parameter-texturen för att göra materialet självlysande i spelet där lamporna har lyst upp enligt lightmappen.
11. Sedan är det bara att sätta upp ett m.pbrmetalmasked material i Blender och splitta meshen i tre delar, en för varje lykta så att man kan styra dem individuellt i spelet, exportera till Trainz, lägga till lite script och så är det klart. Lätt som en plätt!


Såhär ser det ut i Trainz:

Helt okey tills de lägger till stöd för riktiga point-lights i spelet någon gång i en avlägsen framtid.

Jag har dessutom lagt till flammor i lykthusen som man kan se om man öppna den bakre lyckan på lyktorna. I bilden är de två till vänster öppna och den till höger, på eldarsidan är stängd. Till dessa har jag använt samma trick med en 32-bitars texture som på flammorna i fyrboxen, för att få till bloom-effekten.

Tyvärr blir kanten mellan det synliga och genomskinliga i ljus-meherna lite taggigt, vilket man tydligt ser till vänster och under fönstret. Detta verkar vara en kombination av att den lightmappen som jag bakade ifrån Cycles fortfarande är ganska brusig och att Trainz gör ganska abrupta alphaövergångar. Det kanske går att mildra genom att brusreducera den bakade lightmappen, men vi får se om jag orkar fixa det.
__________________
-k-
korvtiger besöker inte forumet just nu   Svara med citat