Text in OpenGL. Mal wieder?



  • Heyho,

    ich möchte gerne Text in OpenGL ausgeben. Ja, die Frage gab es bestimmt schon 100 mal, aber ich möchte etwas spezielles wissen. Das Ziel ist es, dabei auch Plattformunabhängig zu bleiben. Ich habe mir also ein Bild gebastelt auf dem der ASCII Zeichensatz abgebildet ist. Dazu noch einen Shader, der einen vec2 als Vertex und einen vec2 als Texturkoordinate nimmt.

    Meine Fragen:
    - Wie füttere ich diesen Shader jetzt? Mir ist schon klar wie ich die Koordinaten berechnen kann, aber wie bekomme ich die am besten in den Shader? Sind VBOs mittlerweile nicht schon pflicht? Aber das wäre irgendwie doof, ich müsste den Inhalt ja dauernd ändern. Gibt's da Tricks? (Google will mir nur uralt Lösungen andrehen.)

    - Wie kann ich garantieren, dass der Text nicht mehr überschrieben wird, also zumindest nicht von einem Objekt? (Also mit anderem Text kann ich ihn natürlich überschreiben, aber da sollte jetzt kein Schwert über den Text ragen. :D)
    Meine einzige Lösung wäre es, den DEPTH-TEST zu deaktivieren und alles ganz am Ende zu rendern. Das ist aber doof. Gibt es eine Möglichkeit, mit der ich den Text dann trotzdem zu einem beliebigen Zeitpunkt rendern kann?

    Danke für eure Hilfe. :xmas1:



  • Ich mache das immer mit SDL-ttf, packe den Text erst auf eine SDL-Surface, das ich dann in eine Textur umwandle.

    Das würde aber nur Sinn machen, wenn man sowieso bereits SDL verwendet.



  • Ja.. keine Frameworks plz, thx. :xmas2:



  • iKartoffel schrieb:

    - Wie füttere ich diesen Shader jetzt? Mir ist schon klar wie ich die Koordinaten berechnen kann, aber wie bekomme ich die am besten in den Shader?

    Na indem du entsprechende Dreiecke renderst!?

    iKartoffel schrieb:

    Sind VBOs mittlerweile nicht schon pflicht? Aber das wäre irgendwie doof, ich müsste den Inhalt ja dauernd ändern. Gibt's da Tricks? (Google will mir nur uralt Lösungen andrehen.)

    Dynamisches VBO machen (GL_STREAM_DRAW). Im Prinzip is das nix andres als ein Sprite Batch Renderer.

    iKartoffel schrieb:

    Meine einzige Lösung wäre es, den DEPTH-TEST zu deaktivieren und alles ganz am Ende zu rendern. Das ist aber doof.

    Wieso? Depth-Test und Depth-Write aus und alles zum Schluss rendern. So macht man das eben!?

    iKartoffel schrieb:

    Gibt es eine Möglichkeit, mit der ich den Text dann trotzdem zu einem beliebigen Zeitpunkt rendern kann?

    Warum musst du den Text zu einem beliebigen Zeitpunkt rendern können?



  • Ich rendere wohl doch zum Schluss. Eigentlich spricht wirklich nichts dagegen. (Und falls ich das doch mal brauchen sollte habe ich da eine Idee: In eine Textur rendern und die dann am Ende auf den Bildschirm kleben.)

    dot schrieb:

    Dynamisches VBO machen (GL_STREAM_DRAW). Im Prinzip is das nix andres als ein Sprite Batch Renderer.

    Ok, dann mache ich also ein VBO mit fester Größe (so dass z.B. 1024 Zeichen rein passen) und mehr kann man dann auf einmal halt nicht rendern? Oder geht das noch dynamisch?



  • iKartoffel schrieb:

    dot schrieb:

    Dynamisches VBO machen (GL_STREAM_DRAW). Im Prinzip is das nix andres als ein Sprite Batch Renderer.

    Ok, dann mache ich also ein VBO mit fester Größe (so dass z.B. 1024 Zeichen rein passen) und mehr kann man dann auf einmal halt nicht rendern? Oder geht das noch dynamisch?

    Du kannst ja 1024 Zeichen rendern und dann eben den Buffer überschreiben und die nächsten 1024 Zeichen rendern...glBufferData(0) dazwischen nicht vergessen...



  • iKartoffel schrieb:

    (Und falls ich das doch mal brauchen sollte habe ich da eine Idee: In eine Textur rendern und die dann am Ende auf den Bildschirm kleben.)

    👍 Mache ich mit statischem Text genauso. Nur bei dynamischen Text, wie als bsp. FPS oder Score rendere ich einzelne Sprites.



  • So, ich habe jetzt mal alles implementiert und es funktioniert soweit. Zumindest solange die Schrift groß ist. Mache ich sie kleiner, verwischt die leider sehr mit dem Hintergrund, bis man den Text kaum noch lesen kann. (Die Schrift ist dann in etwa so groß wie hier im Forum.)
    Irgendwelche Tipps hier? Automatische Mipmaps? Mehr Texturen? Andere Einstellungen? Tricks im Shader?

    PS:
    Ich prüfe im fragment Shader den alpha Wert und "discart;"e dann bei entsprechendem Wert. Ist das eine gute Vorgehensweise? Weil wenn ich das nicht mache, wird das einfach schwarz gerendert.



  • Wie wärs damit: Ne kleinere Schriftart verwenden statt die Textur zu verzerren 😉

    iKartoffel schrieb:

    Ich prüfe im fragment Shader den alpha Wert und "discart;"e dann bei entsprechendem Wert. Ist das eine gute Vorgehensweise? Weil wenn ich das nicht mache, wird das einfach schwarz gerendert.

    Das discard; fällt vermutlich nicht wirklich ins Gewicht. Aber wieso nicht einfach nur Alphablending und gut ist?



  • dot schrieb:

    Wie wärs damit: Ne kleinere Schriftart verwenden statt die Textur zu verzerren 😉

    Weil ich dann die gleiche Schriftart in x Größen mitliefern muss.. kann ich nicht eine große Textur benutzen und das dann runter rechnen? (Also halbwegs komfortabel)

    dot schrieb:

    Das discard; fällt vermutlich nicht wirklich ins Gewicht. Aber wieso nicht einfach nur Alphablending und gut ist?

    Ich bin auf das gestoßen und habe dem Typen erst mal blind vertraut. Keine Ahnung was ich jetzt davon verwenden werde, ist ja erst mal wohl auch unwichtig, wenn ich Performanceprobleme habe teste ich das mal. Wichtiger ist: Die obrige Frage. 😃 Ich will doch nicht ernsthaft für x Schriftgrößen die Bilder mitliefern?



  • iKartoffel schrieb:

    Ich will doch nicht ernsthaft für x Schriftgrößen die Bilder mitliefern?

    Warum nicht? Mehr als 2-3 Texturen brauchst nicht und wieviel ist das? 1MB pro Bild wenn überhaupt?
    Ich verwende btw BMFont von AngelCode. Solltest dir mal ansehen. Ein wirklich netter Generator für sowas mit nem einfachen Dateiformat.



  • iKartoffel schrieb:

    kann ich nicht eine große Textur benutzen und das dann runter rechnen? (Also halbwegs komfortabel)

    Tust du doch schon, wie das aussieht siehst du ja...natürlich kannst du dich nach nem besseren Filter umschaun...

    iKartoffel schrieb:

    dot schrieb:

    Das discard; fällt vermutlich nicht wirklich ins Gewicht. Aber wieso nicht einfach nur Alphablending und gut ist?

    Ich bin auf das gestoßen und habe dem Typen erst mal blind vertraut. Keine Ahnung was ich jetzt davon verwenden werde, ist ja erst mal wohl auch unwichtig, wenn ich Performanceprobleme habe teste ich das mal.

    Ich seh halt keinen Grund für das discard, einfaches Blending liefert in deinem Anwendungsfall genau das gleiche Ergebnis...

    iKartoffel schrieb:

    Wichtiger ist: Die obrige Frage. 😃 Ich will doch nicht ernsthaft für x Schriftgrößen die Bilder mitliefern?

    Und wieso willst du das nicht?



  • kann ich nicht eine große Textur benutzen und das dann runter rechnen? (Also halbwegs komfortabel)

    Dazu noch kurz:
    Du würdest jedes mal die gleiche Rechenoperation durchführen, die du dir mit einer kleinen Textur die du mitlieferst, sparen könntest.
    Meiner Meinung nach wäre das eine größere Verschwendung.



  • Die Rechenoperationen sind vermutlich nicht das Problem. Viel eher die Tatsache dass es nicht so gut aussieht...



  • dot schrieb:

    Die Rechenoperationen sind vermutlich nicht das Problem. Viel eher die Tatsache dass es nicht so gut aussieht...

    Sicher sind sie kein Problem, aber ich finde man sollte sich solche wiederkehrenden Rechenoperationen sparen, wenn möglich. Und hier ist es das.
    Auch wenn es möglich wäre es so runterzurechnen, dass es ordentlich ausssieht.



  • dot schrieb:

    iKartoffel schrieb:

    Wichtiger ist: Die obrige Frage. 😃 Ich will doch nicht ernsthaft für x Schriftgrößen die Bilder mitliefern?

    Und wieso willst du das nicht?

    Es ist undynamisch. Und ein echter Programmierer mag nicht undynamisch. 🤡
    (Allerdings sieht das momentan so doof aus, dass ich mich wohl besser mal von euch überzeugen lasse..)

    Scorcher24: Jo, danke für den Tipp.

    Dein Programm hat mich aber gleich zur nächsten Frage gebracht.. wie zum Henker soll man mit nicht-block-Schriftarten umgehen? Gibt es da schon Formate die für jeden Buchstaben speichern wie breit er ist? 😮



  • Scorcher24 schrieb:

    dot schrieb:

    Die Rechenoperationen sind vermutlich nicht das Problem. Viel eher die Tatsache dass es nicht so gut aussieht...

    Sicher sind sie kein Problem, aber ich finde man sollte sich solche wiederkehrenden Rechenoperationen sparen, wenn möglich.

    Natürlich. Aber ein Texturelookup ist generell eher wesentlich langsamer als ein bisschen Arithmetik 😉



  • Das Dateiformat von BMFont speichert die Maße für jeden Glyphen.

    edit: Dot du hast dazwischengepostet... 👎 🕶

    edit2:
    Hier "mein" Parser für das BMFont-Format. Die Hälfte des Codes gehört wem anders :P. Aber ich hab die Erlaubnis das zu nutzen. Wurde eh noch angepasst etc, aber vllt hilfts.
    http://code.google.com/p/nightlight2d/source/browse/NightLightDLL/NLFont.cpp



  • @iKartoffel: http://www.angelcode.com/products/bmfont/ 😉

    Edit: 😃

    Natürlich kannst du das ganze auch komplett dynamisch machen. Wird z.B. mal einen Blick auf DirectWrite oder freetype...



  • Ehem.. das ist mir jetzt etwas peinlich... aber ich finde den "export" Button nicht? Ich kann zwar die export Optionen einstellen, aber nichts exportieren? Die "speichern" Funktion speichert zwar eine Beschreibung, aber kein Bild 😕


Anmelden zum Antworten