[OpenGL] 2D-Zeichenprogramm - Auf welche Weise vertices speichern?



  • Hallo,

    Wie der Titel schon sagt will ich ein Zeichenprogramm programmieren auf Basis von OpenGL. Nun stellt sich mir die Frage, auf welche Weise ich die vertices für ein Objekt (Rechteck, Kreis, Pfad, etc.) OpenGL zur Verfügung stelen soll:

    1. Jedes Objekt erhält ein VAO, dass es selbst verwaltet
    (Wie viele VAOs sind erlaubt?)
    2. Jedes Objekt speichert seine vertices lokal als Array, das zum Zeichnen in ein VAO geladen wird
    (Höherer Overhead + komplexere Programmlogik)
    3. Wie 2. nur wird jetzt das VAO für jedes Objekt überschrieben
    (Wird die Übertragung CPU - GPU zum Flaschenhals?)

    Hoffe ihr könnt mir unnötiges programmieren und messen ersparen 🙂


  • Mod

    1. sollte die beste loesung sein. wenn die die VAO handles ausgehen bzw das deine sorge ist, dann kannst du auch ein grosses VAO erstellen und alle objekte reinlegen. mit glDrawElements kannst du dann den offset + index anzahl festlegen.



  • Ok, ich bin jetzt schlecht im schätzen, aber aufgrund der Tatsache, dass auf die Weise auch Primitiven wie ein Rechteck ein eigenes VAO erhalten würde, würde ich jetzt mal schätzen das es schon bis zu 20.000 Primitiven werden könnten.
    Kann mir OpenGL so viele VAO zur Verfügung stellen?
    (Hab jetzt auf Anhieb nichts gefunden, aber kann ich das Maximum mit glGet* abfragen?)

    P.S: Wenn ich alles in ein VAO packe, ist glMultiDrawArrayIndirect auch eine interessante Methode. So holt sich OpenGL die Uniforms automatisch nach vorher festgelegten (auch unregelmäßigen) Abständen.

    P.P.S: Da das ganze Multiwindowfähig ist, stellt sich mir die Frage ob es bei Context-Sharing bemerkbare Leistungseinbrüche gibt, oder ich deswegen die erste Methode vergessen sollte


  • Mod

    bastel dir eine wrapper klasse fuer buffer die einfach zu nutzen ist und versuch wie weit du damit kommst. du kannst nicht im voraus alle probleme loesen, denn die loesung kann von fall zu fall anders aussehen. am besten faehrst du wenn du die sache flexibel genug haelst um auf auftauchende probleme zu reagieren (denn es wird genau so auch welche geben die du nicht vorhergesehen hast).

    das was du machst klingt nicht unbedingt nach einem grenzbereich des machbaren, deswegen bring es erstmal zum laufen und schau dann woran du arbeiten moechtest. wenn du jetzt ein super system bastelst das 3mal mehr arbeit machte, aber 0% gewinn, hast du ja nichts davon, auch wenn z.b. multidraw indirect nett klingt.

    auf der anderen seite, hast du ein basis system das laeuft, kannst du die verbesserte version gegentesten und siehst, wieviel die mehrarbeit brachte.

    also: mach erstmal bis du in probleme laeufst 🙂


Log in to reply