Welkom

Op het blog van Unchained Games, hier kan je onze voortgang volgen.

Buzzwords

Procedural, shmup, Star Fox, C++, 3D, Windows & Linux

S.P.A.C.E

Stars Planets And Cosmic Encounters
 

Model importer & converter

vrijdag 20 december 2013

Na me te verdiepen in hoe 3D programma's bestanden exporteren heb ik besloten dat Wavefront OBJ het beste bestandsformaat is om te gebruiken doordat alle grote modelleerprogramma's dit bestand exporteren. En ander voordeel aan .obj bestanden is dat het een ascii tekst bestand is, dus het op elke OS makkelijk te wijzigen en in te zien. Het grote nadeel hiervan is dat het meer ruimte kost om data op te slaan, zo kan een float die normaal standaard 4 bytes inneemt ineens 30 bytes innemen. Een ander nadeel is dat de bestanden eerst geparsed moeten worden voordat ze in OpenGL gebruikt kunnen worden, voor kleine bestanden is dit niet zozeer een probleem maar zodra je hoog gedetailleerde modellen in wilt laden kan dit erg lang duren. Laadtijden in games zijn dan vaak ook een groot frustratiepunt onder gamers.

Een mooie oplossing voor dit probleem is bij het installeren de .obj bestanden te parsen en dan binair op te slaan. Zo voorkom je platform-afhankelijke knelpunten als endianness. Het binaire bestand kan dan later gelijk ingeladen worden tijdens het laden van het spel in het geheugen van de GPU zonder eerst geparsed te hoeven worden. Dit bestaat dus in de kern als 2 programma's:

Model Converter

Dit is het programma wat tijdens het installeren aangeroepen wordt, het is een CLI met de volgende syntax: (-v) -i <input> ... -o <output>
Waarbij de -v voor verbose staat, dus je krijgt berichten over de status terug, -i en -o zijn altijd verplicht, waarbij na -i een of meerdere .obj bestanden die geparsed moeten worden volgen en na -o een binair bestand als output. Het binaire bestand wat gegenereerd wordt heeft de volgende indeling:
De CLI ziet er als volgt uit:

Model Importer

Nu het binaire bestand gegenereerd is wordt eerst de header van de file in het memory van het spel geladen, deze is altijd 13 bytes. Hieruit wordt de lengte en hoeveelheid van de individuele headers opgehaald en in een datastructuur gezet. Met deze lengte worden alle headers van de models opgehaald en allemaal in een daarvoor bedoelde datastructuur gezet. Hierna wordt alle vertex en index data geladen in een buffer en geupload naar de GPU. Tijdens het renderren hoeft er nu alleen via een OpenGL call een pointer gezet te worden naar de goede plek en lengte van de buffer door middel van de model datastructuren. Dit zorgt ervoor dat er maar 1x een grote hoeveelheid data naar de GPU verstuurd hoeft te worden.

0 reacties:

Een reactie posten

Lorem

Please note: Delete this widget in your dashboard. This is just a widget example.

Ipsum

Please note: Delete this widget in your dashboard. This is just a widget example.

Dolor

Please note: Delete this widget in your dashboard. This is just a widget example.