Einzelnen Beitrag anzeigen

blackfin
(Gast)

n/a Beiträge
 
#2

AW: OpenGL - Text ausgeben mit TextSuite klappt nicht

  Alt 3. Aug 2010, 20:30
Ich kenne jetzt das TextSuite-Zeugs nicht, aber normalerweise gibt man über OpenGL Text ungefähr so aus:

Delphi-Quellcode:
var
  MyFont: HFONT;
  CharLists : GLuint ;
...
..
.
{
Displaylisten für 96 Zeichen generieren (Standard-ASCII-Zeichensatz 0-128).
Wir lassen aber die ersten 0-31 aus, da das eh nur Steuerzeichen sind,
und fangen beim Leerzeichen (#32) an (siehe weiter unten)
}

CharLists := glGenLists(96);

// Schrift erzeugen
MyFont := CreateFont(-12, // Höhe der Schrift (12 Punkt)
                     0, // Keine durchschnittliche Breite, brauchen wir hier nicht
                     0, // Escapement, brauchen wir hier nicht
                     0, // Orientation brauchen wir hier nicht
                     FW_NORMAL, // Schrift-Dicke (normal, bold, bla...)
                     0, // Kursiv? 0=nein, 1=ja
                     0, // Unterstrichen? 0=nein, 1=ja
                     0, // Durchgestrichen? 0=nein, 1=ja
                     ANSI_CHARSET, // Character Set
                     OUT_TT_PRECIS, // Standard-Präzision
                     CLIP_DEFAULT_PRECIS, // Standard-Clip-Präzision
                     ANTIALIASED_QUALITY, // Render-Qualität => Antialiased
                     FF_DONTCARE or DEFAULT_PITCH, // Pitch und Schrift-Familie (Standard)
                     'Verdana'                           // Name der Schrift(-datei)
);

// Schrift dem OGL-Rendering-Context zuweisen
SelectObject(ContextID,MyFont);

{
Nun die Bitmap-Font erzeugen (OpenGL Display-Listen mit den Zeichen füllen).
Und zwar hat die erste die ID 32, da wir ja die ersten 32 Zeichen übergehen.
Die Funktion holt sich die zuvor zugewiesene Schrift aus dem Device-Context und erzeugt daraus Bitmaps mit glBitmap-Befehlen.
Diese werden dann in den Displaylisten gespeichert. Somit hat man dann eine Bitmap-Font (Ein Bitmap pro Zeichen)
}

wglUseFontBitmaps(ContextID,32,96,CharLists);
   

...
..
.
// RENDERING-LOOP BEGIN
                                                       

// Der Text, der ausgegeben werden soll
myText := 'Hallo Welt!' ;

// Farbpuffer und Tiefenpuffer zurücksetzen
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);


// View zurücksetzen (Identitätsmatrix laden)
glLoadIdentity();   

// A bissl "rauszoomen", damit man auch was sieht
glTranslatef(0.0,0.0,-1);

// Schriftfarbe setzen (dieses mal ein freundliches weiss)
glColor3f(255,255,255);

 // Text in der Mitte des Viewports ausgeben (Achtung: Koordinaten gehen von -0.5 bis 0.5!)
glRasterPos2f(0,0);

// Displaylisten-Basis setzen
glPushAttrib(GL_LIST_BIT);

{
Die Basis der Liste hat die ID 96 (höchstes Zeichen) - 32 (niedrigstes Zeichen), so sagen wir OGL die Basis-ID,
um nicht doof rumrechnen zu müssen
}

glListBase(CharLists - 32);

{
Die Displaylisten für jeden Chararakter im Text aufrufen / Text rendern (endlich!)
Für jedes Zeichen im Text wird also die zuvor erzeugte Display-Liste mit der ID des Zeichen-Ordinalwertes aufgerufen.
Da die Displaylisten Bitmaps enthalten, wird also für jedes übergebene Zeichen das entsprechende Bitmap gerendert.
Die PChar-Umwandlung kommt uns hier zu Gute, da ein PChar ja ein "Zeichen-Array" ist.
}

glCallLists(Length(myText),GL_UNSIGNED_BYTE,Pchar(myText));


// Attribute zurückpoppen (hier: Displaylisten-Basis zurücksetzen)
glPopAttrib;

// RENDERING-LOOP ENDE

...
..
.
// Irgendwann später (beim Programm-Ende?) => Listen löschen
glDeleteLists(CharLists,96);

Geändert von blackfin ( 4. Aug 2010 um 09:52 Uhr)
  Mit Zitat antworten Zitat