Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

10.06.2015, 23:02

Font rendering in OpenGL

Hallo zusammen,

ich versuche momentan in OpenGL einen Text auf einen rotierenden Würfel zu schreiben.

Meine erste Überlegung den Text als Textur mittels Shader auf den Cube zulegen.
Dazu habe ich versucht mittels eine *.png Datei in der alle Buchstaben enthalten sind, eine Textur zusammen zusetzen.

Ich habe mich an diesem Bsp. orientiert:
http://stackoverflow.com/questions/22080…pengl-with-glsl

Diese Beispiel funktioniert aber gar nicht, nicht mal für einen einzelnen Buchstaben. Hier wird trotz richtiger Position im Bild ein völlig anderer Bildausschnitt gezeigt.

Evtl. hat noch eine andere Marschrichtung wie ich das hinbekomme Text auf einen Cube zu rendern.

2

11.06.2015, 00:42

http://zfx.info/viewtopic.php?f=11&t=3557

Um es dann auf den Würfel zu kriegen müsstest du halt ein Framebuffer-Objekt benutzen, um den Text in eine Textur zu rendern. Kannst ja nochmal nachfragen, wenn es damit dann Probleme gibt.
Lieber dumm fragen, als dumm bleiben!

3

17.06.2015, 02:23

Sorry ich hab selbst nach einer Lösung gesucht.
Was ich momentan tue. Ich habe eine Jpg/png-Datei aus dem ich die einzelnen Buchstaben rausschneide

Einzelne Buchstaben kann ich Problem los auf einem Face rendern.
Momentan sieht es bei mir so aus:

+--+
| a |
+--+


Ich möchte aber wenn ich einen Text "ab" so anzeigen:

+---+
| ab |
+---+


(Das soll jeweils nur ein Face des Würfels darstellen).
Ich poste einfach mal wie die Shader bei mir aussieht:


Vertex Shader:

C-/C++-Quelltext

1
2
3
4
 texC = (charCoords.xy + charCoords.zw * vec2(texCoord.x, 1. - texCoord.y)) / texSize; // charCoords sind Koordinaten des aktuellen Buchstabens, texCoor die komplette Textur in welche der Buchstabe ist.


    gl_Position = matrix * (vert);


Fragment Shader:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#version 130// default130.frag: a simple fragment shader

varying vec4 col;
varying vec2 texC;
varying vec4 charPos;
uniform sampler2D texture;
void main(){ 
    vec4 t0 = texture2D(texture, texC);

    gl_FragColor = t0;

}



Ich müsste ja irgendwie die Größe der Textur halbieren und die andere daneben packen.
Ich hab aber irgendwie einen Knoten im Hirn und weiß nicht wie ich das bewerkstelligen soll

4

17.06.2015, 10:01

Nun, was relativ gut geht, ist für jeden Buchstaben ein Quad mit passender Größe zu erstellen und die Texturkoordinaten so zu setzen, dass er genau den Buchstaben anzeigt, den du gerne hättest (wenn deine Font-Textur sämtliche Buchstaben enthält, die du benutzen möchtest).

Aber mein Vorschlag ist nach wie vor, meinem vorherigen Link zu folgen. Textrendering ist nicht trivial, vor allen Dingen wenn es hübsch aussehen soll und schnell sein soll. Und früher oder später wird man vermutlich verschiedene Schriftarten benutzen wollen, dann ist es sehr net, wenn man beliebige .ttf-Dateien laden kann und nicht auf selber zusammen gefrickelte Texturatlanten zurückgreifen muss.
Lieber dumm fragen, als dumm bleiben!

5

17.06.2015, 11:46

Nun, was relativ gut geht, ist für jeden Buchstaben ein Quad mit passender Größe zu erstellen und die Texturkoordinaten so zu setzen, dass er genau den Buchstaben anzeigt, den du gerne hättest (wenn deine Font-Textur sämtliche Buchstaben enthält, die du benutzen möchtest).
Das habe ich ja bereits. Für einzelne Buchstaben klappt das auch, ich möchte aber mehrere Texturen anzeigen. Ästhetik und andere Schriftarten ist im Moment nicht mein Ziel. Ich schätze deinen Vorschlag mit Freetype sehr, nur ist das nicht der Anspruch meines Lerneffekts. ;)

Mein Ziel ist momentan Auf einem Face des Würfels zwei(oder mehr) Texturen nebeneinander anzuzeigen.

6

17.06.2015, 19:30

Für jeden Buchstaben eine eigene Textur zu benutzen, ist keine gute Idee. Bei jedem Texturwechsel wird deine CPU und Grafikkarte belastet, und wenn du das tausend mal machst, nur um einen Absatz anzuzeigen, wirst du das vermutlich merken (-> es ruckelt).

In dem von mir verlinkten Text, siehst du ein Bild, wo Zeichen in verschiedenen Schriftgrößen möglichst platzsparend zu einer einzigen Textur zusammengefasst wurden. Natürlich kann man es sich auch eine Nummer einfacher machen und sagen, dass jedes Zeichen gleich groß ist und dafür dann einen rechteckigen Bereich reservieren.
Wie auch immer, sobald du diese Textur hast, und eine Tabelle, in der die Texturkoordinaten für jedes Zeichen drin stehen, kannst du dir einen Vertex-Buffer bauen, der für jedes Zeichen ein Quad enthält. Mit diesem Buffer kannst du dann deinen gesamten Text auf einmal rendern, was ziemlich effizient ist.
Lieber dumm fragen, als dumm bleiben!

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

17.06.2015, 19:58

Ich habe da eine relativ simple Lösung für Texture Mapped Fonts entwickelt. Du gibst an wie groß ein Feld ist, z.B. 64x64 Pixel und er sucht sich anhand der Texturdaten selbst die Texturkoordinaten.

Das Ergebnis sieht dann so aus:


(Link)

Werbeanzeige