Modelloader (Texturprobleme)



  • Hallo!
    Ich schreibe gerade einen MD2 Modelloader - Das Model wird bis auf die Textur auch schon richtig dargestellt.

    Dabei speichere ich Vertices, Vertexindices und Co jeweils in std:vector ab. Und die Framebezogenen Daten in einer eigener Klasse.

    Zum Darstellen übergebe ich die Daten an den Shader und stelle alles mit glDrawElement dar:

    glDrawElements(GL_TRIANGLES, Frames[FrameIndex].VerticeIndices.size(), GL_UNSIGNED_SHORT, &Frames[FrameIndex].VerticeIndices[0]);
    

    Ich bin dabei aber auf ein Problem gestoßen - und zwar die Texturkoordinatenzuordnung.
    So weit ich das richtig verstanden habe speichert MD2 zum Einen Triangles mit 6 Indices ab (3 für Vertices und 3 für Texturkoordinaten) und zum Anderen die Texturkoordinaten- und Verticedaten selbst.

    Wenn ich dann aber mit glEnableVertexAttribArray und einem glVertexAttribPointer auf den entsprechenden std::vector zeige weiß ich nicht in welcher Reihenfolge die Texturkoordinaten vorliegen müssen.
    ->Weil die Vertices ja nicht einfach nacheinander sondern durch die in glDrawElements übergebenen Indices dargestellt werden.
    Und weil die Texturkoordinaten ebenfalls durch Indices im MD2File "verlinkt" werden bekomme ich beim Laden (Einfach alle Texturkoordinaten nacheinander in einen std::vector einfügen) zwar auf den ersten Blick gut aussehende Werte, jedoch wird die Textur am Model dann nur tw. bzw. gar nicht angezeigt.

    Das Laden sieht so aus:

    TextureCoordinates.push_back(TexCoorConvert(texcor[triangles[i].st[0]],skinwidth,skinheight));
    	TextureCoordinates.push_back(TexCoorConvert(texcor[triangles[i].st[1]],skinwidth,skinheight));
    	TextureCoordinates.push_back(TexCoorConvert(texcor[triangles[i].st[2]],skinwidth,skinheight));
    

    Wobei .st die Texturkoordinatenindizes pro Triangle darstellen und TexCoorConvert lediglich die Texturkoordinaten (die ja in short vorliegen) in die gleiche Datenstruktur (mit float) umwandeln und gleichzeitig durch die Höhe oder Breite der Textur dividieren. (Weil komprimiert)
    Das Ganze füge ich dann in den std::vector ein, den ich dann an den Shader übergebe.

    Nun weiß ich leider nicht wie ich diese Zuordnung hinbekomme und würde mich über Ratschläge freuen.

    MFG



  • Du kannst zwar die unterschiedlichen Vertexattribute aus unterschiedlichen Buffern lesen aber pro Vertex nur einen einzigen Index spezifizieren - es ist also nicht moeglich, unterschiedliche Texturkoordinaten fuer eine Vertexposition zu benutzen.
    Eine triviale Loesung waere pro Triangle drei unabhaengige Vertices zu erzeugen die jeweils Position, Normale und Texturkoordinaten der gegebenen Indices enthalten.
    Dadurch entfaellt dann allerdings das Indexing und die Gesamtzahl der Vertices erhoeht sich erheblich.
    Da sich die meisten benachbarten Polygone Normale und Texturkoordinaten teilen ist es sinnvoller einen gemeinsamen Vertexbuffer zu erzeugen.
    Durch die gegebenen Indizes hast Du bereits einen Key mit dem Du zwei Vertices auf Gleichheit pruefen kannst.



  • Erzeuge dir einfach einen Vertexbuffer, der die Positionen, Textur-Koordinaten und andere Attribute fortlaufend erzeugt rendere die dann.
    Das Generieren des Vertexes kannst du ebenso wie das Importieren der MD2-Struktur mittels der Assimp durchführen: http://assimp.sourceforge.net/ .
    Das spart Arbeit und man kann aus einem reichhaltigen Pool von Modell-Formaten Assets importieren. Das spart das mühsame Bauen eigener Importer und das Erstellen der für die Grafik-Karten notwendigen Vertexbuffer. Dazu sind Animationen, Szenen-Hierarchien ( sofern Betsandteil des Modellformates ), Materialhandling und einiges mehr mit von der Partie.

    Gruß Kimmi



  • Vielen Dank für die Kommentare! Ich habe es nun hinbekommen.

    MFG


Anmelden zum Antworten