shademode flat / smooth !!!



  • Hi,

    Ich habe hier ein kleines Problem - habe zwar eine Lösung, würde mir von euch jedoch gerne absichern lassen, dass ich da keinen viel einfacheren Weg übersehe. Das Problem ist folgendes:
    Ich lasse OpenGL sehr große statische Meshes zeichnen, die man sich bei interaktiven(!!!) Framerates ansehen kann. Und das sowohl flat als auch smooth geshaded. Bisher habe ich für das smoothshading indizierte Trianglelists benutzt, was recht performant war. Beim Flatshading erhalte ich damit aber natürlich falsche Resultate. Um das zu umgehen habe ich das ganze mal in nicht indizierte Trianglelists gepackt und zwei Sätze an Normalen zur Verfügung gestellt -> Performance Einbruch - klar.
    Die einzige Idee die ich jetzt noch habe um mehr Geschwindigkeit raus zu holen ist es den Mesh in TriangleStrips zu zerlegen (wieder mit zwei Normalensätzen). Dann hätte auch der ShadeMode FLAT wieder einen Sinn. Ist aber natürlich recht aufwändig.
    Übersehe ich da irgendwas??
    (Ich benutze VertexBuffer zum zeichnen)

    Danke fürs durchlesen!



  • Was sind denn interaktive Framerates ? 😕
    Führst du irgendeinen Culling-Algo aus, oder wieso bekommst du so krasse Performance Unterschiede zwischen indizierter Tri-List und nicht-indizierter ?
    Wenn du eh alles renderst dürfte das kaum einen Geschwindigkeits-Unterschied ausmachen.


  • Mod

    von was für einem performanceeinbruch reden wir? und wieviel triangles werden per frame dargestellt?



  • Ich benutze eine Arcball-Steuerung mit der man sich das Objekt wie in einem normalen Modeller ansehen kann. Die Framerates sollten so hoch sein, dass man einigermaßen navigieren kann (>10 FPS). Die Modelle können > 1 Mio Dreiecke haben. Der Performance einbruch dürfte so von 20 auf 5 FPS (grob geschätzt bei Modell mit 300-400k Dreiecken) gewesen sein. Auf jeden Fall sehr deutlich spürbar. Ich erkläre mir das durch den Cache-Miss von 100% bei nicht indizierten Dreieckslisten (noch dazu kommt die höhere Anzahl an Vertices, die transformiert werden müssen).

    Danke!


  • Mod

    1millone ist schon ne ganze menge, man wird wohl nur ein bruchteil davon sehen können, du solltest solche objekte in kleinere zerstückeln von maximal 65536vertices (und mit 16bit indices indizieren). du hast ja geschrieben, dass es statische meshes sind, da würde ich dir ein PVS vorschlagen, das kann sehr viel bringen.

    ich kenne deine scenen nicht, aber ich könnte mir vorstellen, dass viele dreiecke complanare flächen bilden, sodass du dort auch was an performance mittels indizierung bekommen könntest (mögliche cachehits).

    ich denke mir aber auch dass zwei datensets das beste sind solange du nicht speicherlimitiert bist, weil die topologie sich ja aufgrund der normalenänderung ändert (was die indizierung angeht).

    du mußt auch noch bedenken dass 1million vertices auch ne ganz schön große datenmenge sein können, da lohnt es sich die daten möglichst kompakt zu halten, falls du ein VertexProgramm benutzt, kannst du die normalen in ein colordword packen, die position manchmal auch. zudem ist das vertex-allignment wichtig, 4, 8,16,24,32,48,64 sind akzeptable vertexgrößen.



  • Der Trick mit dem 16 Bit Index scheint ja echt was zu bringen. Habe letztens in einem Whitepaper von nVidia zum Thema VBOs gelesen, das es bis zu 2x Leistung bringen kann 😮
    Werd das glaub ich auch mal ausprobieren.



  • Danke für die schnellen Antworten!

    Danke rapso!
    Klare Sache!
    Wenn man eine Vertex-Liste bastelt in der zunächst für jedes Dreieck ein Vertex liegt, das neben seiner Position auch die Normale des Dreiecks enthält und die Punkte, die noch übrig sind hinten dran hängt kann man Flat-Shading und Indizierung sinnvoll miteinander kombinieren (ja - so langsam fügt sich das Bild).
    Manchmal hängt man einfach ein bischen!
    Die Liste wird dadurch ein bischen größer - kann man nichts machen (schätze ich).

    Zusammen mit den anderen Tips dürfte das wohl nett Performance bringen.
    Abschließend nochmal zu den TriStrips. Hältst du/ihr die für sinnvoll - Performance Technisch??

    Danke auf jeden Fall schon mal für die bisherigen Antworten!


  • Mod

    tristrips können performance gegenüber normalen triangles geben wenn man nicht indiziert.

    bei indizierten vertices sind tristrips und trilists relativ gleich von der performance. tristrips generieren weniger indices zumeist, haben dafür aber wegen den degenerierten tris die zwei strips zusammenhalten ein bissle overhead.

    am besten http://developer.nvidia.com/object/nvtristrip_library.html verwenden und beides testen (man muss die cachesize richtig einstellen!! bei geforce karten ab gf3 auf 24, bei allen anderen auf 16).


Log in to reply