OpenGL中有位图字体、轮廓字体和纹理字体等多种字体,这里简单介绍前面两种字体。
位图字体
使用wglUseFontBitmaps()函数绘制位图字体:
code.vb.net
' 生成位图字体显示列表
base = glGenLists(256)
wglUseFontBitmaps(hDC, 0, 255, base)
轮廓字体
使用wglUseFontOutlines()函数绘制轮廓字体:
code.vb.net
' 生成轮廓字体显示列表
base = glGenLists(256)
Dim gmf(255) As GLYPHMETRICSFLOAT
wglUseFontOutlines(hDC, 0, 255, base, deviation, extrusion, WGL_FONT_LINES, gmf)
绘制文本示例
本例生成位图字体的中英文文本,代码如下所示:
code.vb.net
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
Dim s As String = "Abc-文本测试"
Dim listNum As Integer
Dim hfont As Integer
hfont = Gdi.CreateFont(-30, 0, 0, 0, Gdi.FW_BOLD, 0, 0, 0, Gdi.ANSI_CHARSET, Gdi.OUT_TT_PRECIS, _
Gdi.CLIP_DEFAULT_PRECIS, Gdi.ANTIALIASED_QUALITY, Gdi.FF_DONTCARE Or Gdi.DEFAULT_PITCH, "黑体")
SelectObject(User.GetDC(SimpleOpenGlControl1.Handle), hfont)
Gl.glPushMatrix()
Gl.glColor3d(1.0#, 0.0#, 0.0#)
'此函数不能放在着色函数前面,否则出错
Gl.glRasterPos3f(0, 0, 0)
Dim b As Boolean
If Len(s) > 0 Then
listNum = Gl.glGenLists(1)
For i = 1 To Len(s)
b = Wgl.wglUseFontBitmapsW(User.GetDC(SimpleOpenGlControl1.Handle), Convert.ToInt32(s(i - 1)), 1, listNum)
If b = False Then
i = i - 1
Else
Gl.glCallList(listNum)
End If
Next i
Gl.glDeleteLists(listNum, 1)
End If
Gl.glPopMatrix()
Gl.glFinish()
SimpleOpenGlControl1.SwapBuffers()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Dispose()
End Sub
运行代码,生成图3-3所示的文本。
\[\]
图3-3 生成文本