0

我正在尝试学习如何使用 OpenTK 进行 OpenGL,到目前为止我可以成功绘制多边形、圆形和三角形,但我的下一个问题是如何绘制文本?我查看了他们主页上的 C# 示例,并将其翻译为 VB .NET。

它目前只绘制一个白色矩形,所以我希望有人能在我的代码中发现错误或建议另一种绘制文本的方法。我只会列出我的绘画事件。

绘画事件:

    GL.Clear(ClearBufferMask.ColorBufferBit)
    GL.Clear(ClearBufferMask.DepthBufferBit)






    Dim text_bmp As Bitmap
    Dim text_texture As Integer

    text_bmp = New Bitmap(ClientSize.Width, ClientSize.Height)
    text_texture = GL.GenTexture()

    GL.BindTexture(TextureTarget.Texture2D, text_texture)
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, All.Linear)
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, All.Linear)

    GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, text_bmp.Width, text_bmp.Height, 0 _
    , PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero)



    Dim gfx As Graphics



    gfx = Graphics.FromImage(text_bmp)

    gfx.DrawString("TEST", Me.Font, Brushes.Red, 0, 0)





    Dim data As Imaging.BitmapData
    data = text_bmp.LockBits(New Rectangle(0, 0, text_bmp.Width, text_bmp.Height), Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb)


    GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Width, Height, 0, PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0)

    text_bmp.UnlockBits(data)


    GL.MatrixMode(MatrixMode.Projection)
    GL.LoadIdentity()
    GL.Ortho(0, width, Height, 0, -1, 1)

    GL.Enable(EnableCap.Texture2D)
    GL.Enable(EnableCap.Blend)
    GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcAlpha)

    GL.Begin(BeginMode.Quads)

    GL.TexCoord2(0.0F, 1.0F)
    GL.Vertex2(0.0F, 0.0F)

    GL.TexCoord2(1.0F, 1.0F)
    GL.Vertex2(1.0F, 0.0F)

    GL.TexCoord2(1.0F, 0.0F)
    GL.Vertex2(1.0F, 1.0F)

    GL.TexCoord2(0.0F, 0.0F)
    GL.Vertex2(0.0F, 1.0F)



    GL.End()



    GlControl1.SwapBuffers()
4

2 回答 2

0

如果您的卡不支持 NPOT(非二次幂)纹理尺寸,您将获得一个白色矩形。尝试通过将位图大小设置为例如 256x256 来进行测试。

于 2012-08-16T14:25:34.973 回答
0

这是一个好的方法。如果您打算绘制大量文本甚至中等数量,那绝对会破坏性能。您要做的是查看一个名为 BMFont 的程序:

www.angelcode.com/products/bmfont/‎</p>

它的作用是创建一个文本纹理图集,以及一个包含每个字母的位置、宽度和高度以及偏移量的 xml 文件。您首先读取该 xml 文件,然后将每个字符加载到具有各种值的类中。然后,您只需创建一个函数,传递一个绑定图集的字符串,而不是根据字符串中的字母,绘制一个四边形,其纹理坐标因 xml 数据而异。所以你可以做一个:

for each _char in string 
    create quad according to xml size
    assign texture coordinates relative to xml position
    increase position so letters don't draw on top of each other

BMFont 网站上有其他语言的教程可能会有所帮助。

于 2014-01-18T23:31:44.343 回答