Простой текст в OpenGL (без GLUT) - PullRequest
       0

Простой текст в OpenGL (без GLUT)

6 голосов
/ 21 августа 2011

Я делаю простой 2D-платформер с C ++, SDL и OpenGL , и теперь я бы хотел отобразить текст на экране, например, очки, таймер, простые сообщения.

На разных сайтах я читал, что растровые шрифты, вероятно, будут подходить для этого, но кто-то может дать мне простой и понятный пример того, как использовать их в OpenGL для вывода тестового сообщения экран?

РЕДАКТИРОВАТЬ: Я нашел что-то интересное, FTGL . Пример кода в руководстве (2-я ссылка) выглядит очень просто. Не удалось заставить его работать в банкомате, но вернусь к нему позже.

FTGL - это бесплатная кроссплатформенная библиотека с открытым исходным кодом C ++, которая использует Freetype2 для упрощения рендеринга шрифтов в приложениях OpenGL. FTGL поддерживает растровые изображения, растровые изображения, карты текстур, контуры, полигональную сетку и режимы рендеринга полигонального вытеснения.

  1. http://sourceforge.net/projects/ftgl/
  2. http://ftgl.sourceforge.net/docs/html/ftgl-tutorial.html
  3. http://nehe.gamedev.net/tutorial/freetype_fonts_in_opengl/24001/

Ответы [ 4 ]

2 голосов
/ 22 августа 2011

Вы можете использовать SDL_gfx , он может выводить текст с использованием растровых шрифтов, например так:

#include <SDL/SDL_gfxPrimitives.h>
#include <SDL/SDL_gfxPrimitives_font.h>

const char *text = "text to render";
stringColor(sdlSurface, x, y, text, 0xff0000ff);
1 голос
/ 22 августа 2011

Когда вы уже используете SDL, почему бы не добавить SDL_ttf ?

SDL_ttf - это библиотека рендеринга шрифтов TrueType, которая используется с SDL библиотека и почти как переносная. Это зависит от freetype2 для обработки Данные шрифта TrueType. Это позволяет программисту использовать несколько TrueType шрифты без необходимости самостоятельно кодировать процедуру рендеринга шрифтов. С сила контурных шрифтов и сглаживания, высокое качество вывода текста можно получить без особых усилий.

0 голосов
/ 21 августа 2011

Я использовал растровые шрифты, доступные в GLUT.Соответствующие вызовы в JOGL (Java + OpenGL):

GLU glu = new GLU();
GLUT glut = new GLUT();
GL gl = drawable.getGL();
gl.glRasterPos3f(x, y, z); // move to (x, y, z) for the next text output
glut.glutBitmapString(GLUT.BITMAP_HELVETICA_12, "Message");
gl.glRasterPos3f (x2, y2, z2);
glut.glutBitmapCharacter (GLUT.BITMAP_HELVETICA_18, 'X');

Это, безусловно, можно легко адаптировать к OpenGL + C ++.

0 голосов
/ 21 августа 2011

Вы должны создать растровое изображение, содержащее все символы, которые вы хотите использовать. Самый простой способ - с помощью шрифта фиксированной ширины. Затем для каждой буквы вы привязываете эту часть текстуры. Я написал такой код в Pascal / OpenGL несколько лет назад, поищу его и напишу

Отредактируйте здесь код

procedure DisplayString(str: string; l: integer; active: integer; align: integer);
var i,n: integer;
s: string;
begin
  glPushMatrix;
  glTranslatef(0,-l,0);
  if align=1 then glTranslatef(-15,0,0); //left alignment
  if align=3 then glTranslatef(15,0,0);//right aligment
  s:=uppercase(str); // the font is uppercase only
  for i:=1 to length(str)-4 do begin
   n:=ord(s[i]); // get the ASCII code of letter
   glTranslatef(1,0,0);
   if n=32 then continue; //space
   if (n>=48) and (n<=58) then n:=n-47; // translate ascii code to the
   if (n>=65) and (n<=90) then n:=n-53; // corresponding position in the bitmap
      if active=0 then glBindTexture(GL_TEXTURE_2D, font2) // two different font files used
    else glBindTexture(GL_TEXTURE_2D, font);
    glBegin(GL_QUADS); // 1850 is the total width of the bitmap image, 50 is one character
     glTexCoord2f(((n-1)*50/1850)-1, 0.0); glVertex3f(0.0, 0.0,  1.0);
     glTexCoord2f((n*50/1850)-1, 0.0); glVertex3f(1.0, 0.0,  1.0);
     glTexCoord2f((n*50/1850)-1, 1.0); glVertex3f(1.0, 1.0,  1.0);
     glTexCoord2f(((n-1)*50/1850)-1, 1.0); glVertex3f(0.0, 1.0,  1.0);
    glEnd();
    end;
   glPopMatrix;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...