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