Terrain Performance Frage



  • Hallo,
    Ich bin gerade dabei ein Terrain mit OpenGl zu laden und zu rendern, wobei ich auf einige Fragen
    gestoßen bin.

    Es geht um ein Terrain Mesh, welches entweder über eine Heightmap oder einen Modelloader
    geladen wird. Bei der Betrachtung der Szene wird ein größerer Teil (etwa maximal 1/4 des Terrains)
    dargestellt.

    Ich dachte daran, einen Octree zu verwenden, per FrustumCulling zu testen welche Nodes
    im Sichtbarkeitsbereich liegen und diese dann zu rendern.
    Das Problem dabei ist, dass ich nicht weiß welche die beste (eine gute) Möglichkeit
    wäre die einzelnen Blöcke zu rendern.

    DrawCalls sind ja recht teuer, weshalb ich die Szene natürlich am Liebsten mit einem Einzigen
    rendern wollen würde.

    Ich dachte daran die Vertices/TexturKoordinaten/Normals der einzelnen Blöcke zur Laufzeit,
    abhängig davon welche Blöcke gerade sichtbar sind, in jeweils einem großen Array(Vert,Tex,Norm)
    für die sichtbare Szene zusammenzubauen und es dann mit einem Aufruf zu rendern.

    Meine Frage ist nun ob es da nicht eine bessere Möglichkeit gibt, denn das Zusammenbauen dieser drei
    Arrays(also mehrere mal (Anzahl der sichtbaren Blöcke) kopieren von std::vector) wäre natürlich aufwändig.
    Meine bisherige Methode des Renderns ist das komplette Mesh anfangs in einen VBO zu laden und dann zu zeichnen,
    was aber einen massiven FPS Verlust bedeutet, da das Mesh mitunter recht groß ist.

    Könnte man das irgendwie dynamisch über einen oder mehrere VBOs machen?
    Ist das CPU seitige zusammenfassen der sichtbaren Daten per Frame üblich?
    Gibt es da eine best practice?

    MfG



  • Ich denke du könntest das per Index-Array machen, das du bestimmte Vertices auslässt. Dadurch müsste sich das Kopieren vermeiden lassen.



  • - Schlecht gelesen.



  • cooky451 schrieb:

    - Schlecht gelesen.

    Ich? Oder wer?



  • pyhax schrieb:

    cooky451 schrieb:

    - Schlecht gelesen.

    Ich? Oder wer?

    Nein, ich. Ich dachte, er wollte viele gleiche Objekte rendern und würde Instancing suchen.



  • Draw calls sind aber immer noch _viel_ billiger als auf der CPU rumzukopieren. Unterteil das Terrain in chunks a 64x64, pack jeden Chunk in VBOs, lade alle VBOs auf die Karte und zeichne zu Laufzeit die 100 Chunks, die du gerade siehst. Dabei noch auf eine cachefreundliche stripification der einzelnen Index VBOs achten und dann läuft es schnell

    Gruss, Gast


Anmelden zum Antworten