Quads in TriangleStrips umbasteln



  • Meine wavefront .obj Dateilese-Funktion ist halbwegs geglückt (was für eine Tortur...), wobei ich die idR 4-eckigen Polygone eins nach dem anderen in jeweils 2 Dreiecke zerlegt und das Resultat in einem als TRIANGLE_LIST zu interpretierenden (short)-Indexbuffer gespeichert habe. Jetzt habe ich verschiedenste Dinge bezüglich TRIANGLE_LISTs sowie TRIANGLE_STRIPS recherchiert, angeblich sind letztere Performance technisch besser. Wenn ich die Quads als TRIANGLE_LIST speichere, hätte ich den Vorteil, dass eine (materialbedingte) Sub-Geometrie des Modells mit einem einzigen DrawIndexedPrimitive() Call gezeichnet werden könnte, egal wie die Subgeometrie aussieht, d.h. es können Löcher im Modell sein bzw. Polygone, die zu dieser Sub-Geometrie gehören, müssen nicht einmal gemeinsame Kanten haben sondern können räumlich beliebig voneinander getrennt sein. Trotzdem lässt sich alles mit einem einzigen Draw(TRIANGLE_LIST) Call rendern.
    Bei TRIANGLE_STRIPS stehe ich vor mehreren Rätseln.
    Angenommen, ich könnte davon ausgehen, dass mein importiertes OBJ-Modell eine zusammenhängende Geometrie ist, im Mesh keine Löcher vorkommen, nirgendwo mehr als 5 Kanten zusammenlaufen und außerdem alle Flächen 4-Eckig sind (der selten anzutreffende Idealtypus eines 'sauberen' Meshs eben).

    Lässt sich ein derartiges Mesh IMMER in einen einzigen, zusammenhängenden TRIANGLE_STRIP umwandeln, sodass man auch in diesem Fall das gesamte Modell bzw. Sub-Geometrie in einem einzigen Draw(TRIANGLE_STRIP) rendern lassen könnte ? (Ich habe die Vermutung, dass es möglich sein müsste).
    Gibt es dazu einen Algorithmus, mit der sich eine TRIANGLE_LIST in einen äquivalenten TRIANGLE_STRIP umwandeln lässt ?

    Bevor ich das Rad neu erfinde, wäre ich auch sehr dankbar, wenn jemand zufällig eine Open Source oder Freie Lösung irgendwo in den Tiefen des Netzes kennt, also eine Funktion, die als Input eine TRIANGLE_LIST (ein Array aus shorts) nimmt, und als Resultat einen äquivalenten TRIANGLE_STRIP zurückgibt bzw. in einem per Adresse übergebenen Funktionsparameter hinterlegt, soferne es (aufgrund der Geometrie) überhaupt möglich ist. Habe dazu nichts finden können, aber vielleicht hatte schon jemand zufällig ein ähnliches Problem.

    Ich stelle mir eine derartige Funktion bzw. den dazu notwendigen Algorithmus (so es ihn überhaupt gibt) jedenfalls sehr kompliziert vor.

    thx für Tipps


  • Mod

    indexed trinagle lists sollten das beste sein.
    diese lib macht die arbeit fuer dich.


Log in to reply