Drawing Three-Dimensional Text in OpenGL ApplicationsID: Q131024
|
GDI operations, such as TextOut, can be performed on an OpenGL window only
if the window is single-buffered. The Windows NT implementation of OpenGL
does not support GDI graphics in a double-buffered window. Therefore, you
cannot use GDI functions to draw text in a double-buffered window, for
example. To draw text in a double-buffered window, an application can use
the wglUseFontBitmaps and wglUseFontOutlines functions to create display
lists for characters in a font, and then draw the characters in the font
with the glCallLists function.
The wglUseFontOutlines function is new to Windows NT 3.51 and can be used to draw 3-D characters of TrueType fonts. These characters can be rotated, scaled, transformed, and viewed like any other OpenGL 3-D image. This function is designed to work with TrueType fonts.
The GLFONT sample shows how to use the wglUseFontOutlines function to create display lists for characters in a TrueType font and how to draw,
scale, and rotate the glyphs in the font by using glCallLists to draw
the characters and other OpenGL functions to rotate and scale them. You
need the Win32 SDK for Windows NT 3.51 to compile this sample, and you need
to incorporate wglUseFontOutlines in your own application. You also need Windows NT 3.51 to execute the application.
The following file is available for download from the Microsoft Software Library:
~ GLFONT.EXEFor more information about downloading files from the Microsoft Software Library, please see the following article in the Microsoft Knowledge Base:
Q119591 How to Obtain Microsoft Support Files from Online Services
LOGFONT lf;
HFONT hFont, hOldFont;
GLYPHMETRICSFLOAT agmf[256];
// An hDC and an hRC have already been created.
wglMakeCurrent( hDC, hRC );
// Let's create a TrueType font to display.
memset(&lf,0,sizeof(LOGFONT));
lf.lfHeight = -20 ;
lf.lfWeight = FW_NORMAL ;
lf.lfCharSet = ANSI_CHARSET ;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS ;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS ;
lf.lfQuality = DEFAULT_QUALITY ;
lf.lfPitchAndFamily = FF_DONTCARE|DEFAULT_PITCH;
lstrcpy (lf.lfFaceName, "Arial") ;
hFont = CreateFontIndirect(&lf);
hOldFont = SelectObject(hDC,hFont);
// Create a set of display lists based on the TT font we selected
if (!(wglUseFontOutlines(hDC, 0, 255, GLF_START_LIST, 0.0f, 0.15f,
WGL_FONT_POLYGONS, agmf)))
MessageBox(hWnd,"wglUseFontOutlines failed!","GLFont",MB_OK);
DeleteObject(SelectObject(hDC,hOldFont));
. . . .
. . . .
. . . .
. . . .
To display these 3-D characters in a string, use the following code:
// Display string with display lists created by wglUseFontOutlines()
glListBase(GLF_START_LIST); // indicate start of display lists
// Draw the characters
glCallLists(6, GL_UNSIGNED_BYTE, "OpenGL");
Additional query words: graphics kbfile
Keywords : kbfile kbNTOS350 kbNTOS351 kbNTOS400 kbSDKWin32 kbWinOS95 kbWinOS98
Version : winnt:3.51,4.0
Platform : winnt
Issue type : kbinfo
Last Reviewed: June 15, 1999