OpenTK OpenGL Рисование текста - PullRequest
       0

OpenTK OpenGL Рисование текста

0 голосов
/ 25 февраля 2012

Я пытаюсь научиться работать с OpenGL с помощью OpenTK и до сих пор могу успешно рисовать полигоны, круги и треугольники, но мой следующий вопрос - как рисовать текст? Я посмотрел на пример на их домашней странице, которая была на 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()

Ответы [ 2 ]

0 голосов
/ 19 января 2014

Это хороший метод.Если вы планируете рисовать много текста или даже среднее количество, это абсолютно разрушит производительность.Что вы хотите сделать, так это заглянуть в программу под названием BMFont:

www.angelcode.com / products / bmfont /

. Это создает текстовый атлас текста и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 есть учебники на других языках, которые могут быть вам полезны.

0 голосов
/ 16 августа 2012

Вы получите белый прямоугольник, если ваша карта не поддерживает размеры текстур NPOT (не степени двух). Попробуйте выполнить тестирование, установив размер растрового изображения, например, 256x256.

...