wglUseFontOutlines: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Bot: konvertiere/korrigiere HTML)
K (Quelltext: Pascal Tags eingesetzt)
Zeile 56: Zeile 56:
 
[[Bild:wglUseFontOutlines_Beispiel.png]]
 
[[Bild:wglUseFontOutlines_Beispiel.png]]
 
=== Quelltext ===
 
=== Quelltext ===
'''var'''
 
  FontLists:Cardinal;
 
  agmf:'''array''' [0..255] '''of''' GLYPHMETRICSFLOAT ;
 
<br>
 
'''procedure''' NachAktivierung;
 
'''var'''
 
  CustomFont:HFont;
 
'''begin'''
 
  FontLists := glGenLists'''('''256''')''';
 
  <font color="#000080">''(*CustomFont := GetStockObject (SYSTEM_FONT);*)//Eine Alternative zu CreateFont''</font>
 
  CustomFont := CreateFont'''('''
 
                            32,                  <font color="#000080">''// Höhe''</font>
 
                            0,                  <font color="#000080">''// Breite 0=Keine Vorgabe''</font>
 
                            0,
 
                            0,
 
                            0,                  <font color="#000080">''// Fett?''</font>
 
                            0,                  <font color="#000080">''// Kursiv?''</font>
 
                            0,                  <font color="#000080">''// Unterstrichen?''</font>
 
                            0,                  <font color="#000080">''// Durchgestrichen?''</font>
 
                            ANSI_CHARSET,
 
                            OUT_TT_PRECIS,
 
                            CLIP_DEFAULT_PRECIS,
 
                            NONANTIALIASED_QUALITY,
 
                            FF_DONTCARE '''or''' DEFAULT_PITCH,
 
                            <font color="#800000">'Times New Roman'</font>''')'''; <font color="#000080">''// Name der Schrift''</font>
 
  glEnable'''('''GL_POINT_SMOOTH''')''';
 
  SelectObject'''('''glControl1.DC, CustomFont''')''';
 
  wglUseFontOutlines'''('''glControl1.DC,
 
                      0,  <font color="#000080">''//Von Zeichen #0''</font>
 
                      255, <font color="#000080">''//Bis Zeichen #255''</font>
 
                      FontLists,
 
                      0, <font color="#000080">''//So genau wie möglich''</font>
 
                      0.2, <font color="#000080">''//0.2 LE tiefe Buchstaben''</font>
 
                      WGL_FONT_LINES,<font color="#000080">''//Linen keine Polygone''</font>
 
                      @agmf''')''';<font color="#000080">''//Speichere dort die Informationen''</font>
 
'''end''';
 
<br>
 
'''procedure''' ShowText'''('''pText:'''String)''';
 
'''begin'''
 
    glListBase'''('''FontLists''')''';<font color="#000080">''// Liste auswählen''</font>
 
    glCallLists'''('''Length<font color="#008000">'''('''</font>pText<font color="#008000">''')'''</font>, GL_UNSIGNED_BYTE, Pointer<font color="#008000">'''('''</font>pText<font color="#008000">''')'''</font>''')''';
 
'''end''';
 
<br>
 
'''procedure''' Zeichne;
 
'''begin'''
 
  glClear'''('''GL_COLOR_BUFFER_BIT '''or''' GL_DEPTH_BUFFER_BIT''')''';
 
  glLoadIdentity;
 
  glColor3f'''('''1,1,0''')''';<font color="#000080">''//Farbe Gelb''</font>
 
  glTranslatef'''('''-1,0,-2''')''';<font color="#000080">''//Position festlegen''</font>
 
  ShowText'''('''<font color="#800000">'Test'</font>''')''';
 
'''end''';
 
  
<br>
+
<pascal>
 +
var
 +
  FontLists:Cardinal;
 +
  agmf:array [0..255] of GLYPHMETRICSFLOAT ;
 +
 
 +
 
 +
procedure NachAktivierung;
 +
var
 +
  CustomFont:HFont;
 +
begin
 +
  FontLists := glGenLists(256);
 +
  (*CustomFont := GetStockObject (SYSTEM_FONT);*)//Eine Alternative zu CreateFont
 +
  CustomFont := CreateFont(
 +
                          32,                  // Höhe
 +
                          0,                  // Breite 0=Keine Vorgabe
 +
                          0,
 +
                          0,
 +
                          0,                  // Fett?
 +
                          0,                  // Kursiv?
 +
                          0,                  // Unterstrichen?
 +
                          0,                  // Durchgestrichen?
 +
                          ANSI_CHARSET,
 +
                          OUT_TT_PRECIS,
 +
                          CLIP_DEFAULT_PRECIS,
 +
                          NONANTIALIASED_QUALITY,
 +
                          FF_DONTCARE or DEFAULT_PITCH,
 +
                          'Times New Roman'); // Name der Schrift
 +
  glEnable(GL_POINT_SMOOTH);
 +
  SelectObject(glControl1.DC, CustomFont);
 +
  wglUseFontOutlines(glControl1.DC,
 +
                    0,  //Von Zeichen #0
 +
                    255, //Bis Zeichen #255
 +
                    FontLists,
 +
                    0, //So genau wie möglich
 +
                    0.2, //0.2 LE tiefe Buchstaben
 +
                    WGL_FONT_LINES,//Linen keine Polygone
 +
                    @agmf);//Speichere dort die Informationen
 +
end;
 +
 
 +
 
 +
procedure ShowText(pText:String);
 +
begin
 +
  glListBase(FontLists);// Liste auswählen
 +
  glCallLists(Length(pText), GL_UNSIGNED_BYTE, Pointer(pText));
 +
end;
 +
 
 +
 
 +
procedure Zeichne;
 +
begin
 +
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 +
  glLoadIdentity;
 +
  glColor3f(1,1,0);//Farbe Gelb
 +
  glTranslatef(-1,0,-2);//Position festlegen
 +
  ShowText('Test');
 +
end;
 +
</pascal>
 +
 
 
== Hinweise ==
 
== Hinweise ==
 
Die '''wglUseFontOutlines'''-Funktion definiert die Zeichen eines Umrissfonts mit Displaylisten im aktuellen Renderkontext. Genutzt werden können dazu jedoch nur TrueType-Fonts, alle anderen Font-Typen werden nicht unterstützt.
 
Die '''wglUseFontOutlines'''-Funktion definiert die Zeichen eines Umrissfonts mit Displaylisten im aktuellen Renderkontext. Genutzt werden können dazu jedoch nur TrueType-Fonts, alle anderen Font-Typen werden nicht unterstützt.

Version vom 3. Dezember 2005, 18:31 Uhr

wglUseFontOutlines


Name

wglUseFontOutlines - Erzeugt Displaylisten mit 3D Buchstaben.


Delphi-Spezifikation

function wglUseFontOutlines(DC: HDC; first, count, listBase: DWORD; 
                            deviation, extrusion: Single;
                            format: Integer; lpgmf : PGlyphMetricsFloat): BOOL;


Parameter

DC Ein Display Context mit entsprechenden Font-Einstellungen.
first Mit welchen Zeichen soll begonnen werden
count Anzahl der zu erzeugenden Listen/Zeichen
ListBase Der Name/Index der Liste für das erste Zeichen
deviation Gibt die maximale Abweichung zur True Schrift vor
extrusion Tiefe der Zeichen(muss positiv sein)
format Legt fest ob die Buchstaben aus Linen oder Polygonen bestehen.
lpgmf Optionaler Puffer in den zusätliche Informationen zu den Zeichen geschrieben werden.(Siehe GLYPHMETRICSFLOAT)


Beschreibung

Aus einer True Font Schrifteinstellung eines Device Contextes werden Display Listen generiert. Diese enthalten dann die gewünschten Zeichen als Polygone oder als Linen. Wobei immer ein Zeichen in einer Display Liste enthalten ist.

Falls ein Fehler auftritt wird false statt true zurückgeben und keine Display Listen erzeugt. Nähere Informationen zum aufgetretenen Fehler erhält man mit der Funktion GetLastError.


Beispiel

Bild

Datei:wglUseFontOutlines Beispiel.png

Quelltext

var
  FontLists:Cardinal;
  agmf:array [0..255] of GLYPHMETRICSFLOAT ;


procedure NachAktivierung;
var
  CustomFont:HFont;
begin
  FontLists := glGenLists(256);
  (*CustomFont := GetStockObject (SYSTEM_FONT);*)//Eine Alternative zu CreateFont
  CustomFont := CreateFont(
                           32,                  // Höhe
                           0,                   // Breite 0=Keine Vorgabe
                           0,
                           0,
                           0,                   // Fett?
                           0,                   // Kursiv?
                           0,                   // Unterstrichen?
                           0,                   // Durchgestrichen?
                           ANSI_CHARSET,
                           OUT_TT_PRECIS,
                           CLIP_DEFAULT_PRECIS,
                           NONANTIALIASED_QUALITY,
                           FF_DONTCARE or DEFAULT_PITCH,
                           'Times New Roman'); // Name der Schrift
  glEnable(GL_POINT_SMOOTH);
  SelectObject(glControl1.DC, CustomFont);
  wglUseFontOutlines(glControl1.DC,
                     0,   //Von Zeichen #0
                     255, //Bis Zeichen #255
                     FontLists,
                     0, //So genau wie möglich
                     0.2, //0.2 LE tiefe Buchstaben
                     WGL_FONT_LINES,//Linen keine Polygone
                     @agmf);//Speichere dort die Informationen
end;


procedure ShowText(pText:String);
begin
   glListBase(FontLists);// Liste auswählen
   glCallLists(Length(pText), GL_UNSIGNED_BYTE, Pointer(pText));
end;


procedure Zeichne;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity;
  glColor3f(1,1,0);//Farbe Gelb
  glTranslatef(-1,0,-2);//Position festlegen
  ShowText('Test');
end;

Hinweise

Die wglUseFontOutlines-Funktion definiert die Zeichen eines Umrissfonts mit Displaylisten im aktuellen Renderkontext. Genutzt werden können dazu jedoch nur TrueType-Fonts, alle anderen Font-Typen werden nicht unterstützt.

Jede Displayliste besteht entweder aus Liniensegementen oder Polygonen, und hat eine eindeutige Identifizierungsnummer, die bei listBase beginnt.

Die wglUseFontOutlines-Funktion nähert sich den Schriftumrissen an, indem eine quadratischs B-Spline Kurve des Umrisses in Liniensegmente unterteilt wird, und zwar solange bis die Distanz zwischen den Umrissen und dem interpolierten Mittelpunkt nahe dem in deviation angegebenen Wert ist. Dies ist dann das finale Ausgabeformat, wenn format gleich GL_FONT_LINES ist. Wenn jedoch WGL_FONT_OUTLINES als Format gewählt wird, dann enthalten die Displaylisten keinerlei Normalen, Beleuchtung wird dann also nicht funktionieren. Um korrekte Beleuchtung zu erhalten, muss man die Fonts dann mit WGL_FONT_POLYGONS erstellen und mit glPolygonMode(GL_FRONT, GL_LINE) darstellen. Wenn als Format WGL_FONT_POLYGONS angegeben wird, werden die Umrisse in Dreicke, Dreieck-Fächer, Dreieck-Anreihungen oder Rechtecke unterteilt. Mit WGL_FONT_POLYGONS erstellte Displaylisten rufen glFrontFace(GL_CW) oder glFrontFace(GL_CCW) auf, so dass die aktuelle Einstellung für Vorderseiten verändert werden kann. Um die beste Darstellung für diesen Schrifttyp zu gewährleisten, sollten die Rückseiten gecullt werden :

glCullFace(GL_BACK); 
glEnable(GL_CULL_FACE); 

Eine GLYPHMETRICSFLOAT-Struktur enthält Informationen über die Platzierung und Ausrichtung eines jeden Charakters. Der lpgmf-Parameter ist ein Zeiger auf eine Reihe von diesen Strukturen, um den kompletten Zeichensatz halten zu können. Jede Displayliste endet daher mit einer über gmfCellIncX und gmfCellIncY (Eigenschaften von GLYPHMETRICSFLOAT) angebebenen Translation.


Siehe auch

wglUseFontBitmaps, glListBase, glCallLists und glTexGen