AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi OpenGL - Text ausgeben mit TextSuite klappt nicht
Thema durchsuchen
Ansicht
Themen-Optionen

OpenGL - Text ausgeben mit TextSuite klappt nicht

Ein Thema von fui-tak · begonnen am 3. Aug 2010 · letzter Beitrag vom 7. Sep 2010
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz