Obj-Loader, welchen Buffer benutzen
-
Hi,
ich bin gerade dabei ein obj-loader für meine 3D-Engine zu programmieren. Allerdings weiß ich nicht genau wie ich die einzelnen Werte übergeben soll.
Ich habe zwei Buffer, ein Vertex Buffer Object (vbo) und ein Index Buffer Object (ibo). Zuvor habe ich einfach alle Vertex-Koordinaten in den vbo gesteckt und die Indices in den ibo. Jetzt habe ich aber auch noch texture-Koordinaten und Normals, und zwar weniger als ich Vertices habe. Ich habe aber auch Indices für diese Punkte, und ich bin total verwirrt wie ich die Sachen wo zuordnen muss bzw. welche Werte in welchen Buffer kommen. Wie zuvor kann ichs ja nicht machen, weil manche Punkte ja unterschiedliche Normals/Texture-Koordinaten haben, je nachdem welches Dreieck gezeichnet wird. Ich könnte zwar für jedes Dreieck drei neue Vertices erstellen, aber dann habe ich ganz schnell zig Vertices, was auch nicht Sinn der Sache ist. Also könnte mir das evtl wer verständlich erklären, welche Werte genau in welcher Reihenfolge in welchen Buffer gehören?Ich hoffe ich hab jetzt nicht zu verwirrend geschrieben und ihr versteht was ich meine ^^ ansonsten bitte einfach nachfragen
Mfg,
DujiBujiEDIT: Also Das Problem ist, dass ich für einen Vertex verschiedene normals/texCoords habe, um es kurz auszudrücken ^^
-
Duji-Buji schrieb:
EDIT: Also Das Problem ist, dass ich für einen Vertex verschiedene normals/texCoords habe, um es kurz auszudrücken ^^
Das ist in der Tat ein Problem, da du in OpenGL nur einen Satz von normals, texcoords etc. pro Vertex haben kannst. Du wirst also nicht darum herumkommen, für verschiedenen Kombinationen von Position, Normale und Texcoords einen neuen Vertex zu erzeugen; musst dir also etwas Schlaues überlegen, um die Daten für die Darstellung mit OpenGL erstmal entsprechend aufzubereiten...
Beachte, dass es um die verschiedenen Kombinationen der drei Dinge geht. Es kann und wird weiterhin viele Dreiecke geben, die sich den selben Vertex teilen können, weil sie die selbe Kombination von Position, Normale und Texcoords verwenden...
-
Ich denke du suchst sowas: http://www.braynzarsoft.net/Code/index.php?p=VC&code=Obj-Model-Loader
Der Code ist gut kommentiert und somit recht verständlich.
-
Erstmal danke für die Antworten.
Für alle, die das selbe Problem wie ich hatten, hier meine Implementation:
Entweder wird für jeden Vertex ein neuer Vertex erstellt (da nach meiner Einschätzung die Anzahl komplett gleicher Vertices zu gering ist als dass sich es lohnen würde dort noch mehr Rechenarbeit reinzustecken), das Modell also flat-shading hat, oder dass die normals komplett ignoiert werden und später ein Mittelwert für jeden Vertex gebildet wird. Um zu überprüfen ob der Vertex bereits vorhanden ist, habe ich eine unorderd_map eingefügt, welche die position und texturkoord mit dem indices mapped. wenn ich jetzt also überprüfen möchte, ob der vertex (nur koordinaten und texKoordinate) schon vorhanden ist, wird dies in der Map nachgeschlagen. Wenn nicht, wird es neu eingefügt, ansonsten wird der index von dem vertex zurückgegeben. Um dies zu implementieren muss auch eine Hash-Funktion für die map geschrieben werden (da der key die koord+texCoord ist).
Dadurch ist auch die Anzahl an vertices von ca. 47.000 auf ca. 10000 runter gegangenNach meinen Messwerten reicht die Geschwindigkeit für meine Zwecke aus, ebenso wie die Genauigkeit. Zwar bilden sich bei der smooth-shading-variante Streifen am rand mancher texKoordinate in den normals, das kann ich aber verkraften^^
Der Artikel sieht auch interesannt aus, aber ich hab in letzter Zeit genug Zeit in den obj-Loader gesteckt, jetzt kommen erstmal andere Aspekte der Engine dran. Ich werd ihn mir mal ansehen, wenn mein Loader erweitert werden soll (er kann z.b. noch keine materialien lesen, oder shading gruppen unterscheiden o.ä.).
Mfg