2012-02-24 2 views
0

Я пытаюсь научиться делать OpenGL с помощью OpenTK, и я могу успешно рисовать полигоны, круги и треугольники, но мой следующий вопрос - как рисовать текст? Я посмотрел пример на своей домашней странице, который был на C#, и я перевел его на VB .NET.OpenTK OpenGL Текст чертежа

В настоящее время он просто рисует белый прямоугольник, поэтому я надеялся, что кто-то обнаружит ошибку в моем коде или предложит другой способ рисования текста. Я просто перечислил событие рисования.

Краска событие:

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() 

ответ

0

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

0

Это метод ok. Если вы планируете нарисовать много текста или даже среднее количество, это полностью разрушит производительность. То, что вы хотите сделать, это посмотреть в программу под названием 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, которые могут быть полезны.

Смежные вопросы