绘制文本

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所示的文本。

Document Image
\[\]

图3-3 生成文本