Как использовать шрифты в GLUT?

Как нарисовать текст в OpenGL? Путей конечно много, но не стоит изобретать самому, особенно если вы новичок. GLUT предоставляет вам без труда использовать текст в вашей OpenGL программе.

Для того чтобы изобразить текст в GLUT имеется 2 команды:

void glutBitmapCharacter(void *font, int character);
void glutStrokeCharacter(void *font, int character);

Первая из них рисует так называемый Bitmap текст, а вторая Stroke текст. Различие между Bitmap и Stroke состоит в том, что Stroke текст можно как угодно маштабировать и изменять, а также поворачивать, и т.д., но он немножко похуже выглядит на экране, чем Bitmap текст. Bitmap текст в отличие от Stroke нельзя маштабировать, так как он определён в виде растровых букв, зато он красивее на экране и у него более богатый выбор разнообразных шрифтов. И ещё, Bitmap текст выводится на экран медленнее чем Stroke текст.

Как же можно нарисовать текст? Я приведу 2 функции, которые соответственно рисуют Bitmap и Stroke текст:

void draw_string_bitmap(void *font, const char* string) 
{
  while (*string)
    glutBitmapCharacter(font, *string++);
}
 
void draw_string_stroke(void *font, const char* string) 
{
  while (*string)
    glutStrokeCharacter(font, *string++);
}
 
 

Вот примеры вызова этих функций: draw_string_bitmap(GLUT_BITMAP_HELVETICA_18, "Hello");
или draw_string(GLUT_STROKE_ROMAN, "Hello");

Осталось рассмотреть, какие шрифты имеютя в GLUT? (т.е. параметр font).

Для Stroke текста параметр font может принимать значения:

Для Bitmap определено большее число шрифтов(из за невозможности видоизменяться)

Не бойтесь эксперементировать и смотрите, что у вас получится и выбирайте то, что больше всего понравится.

Напоследок приведу полностью работающую программу для работы со шрифтами (С++, Windows).

#include <afxwin.h>
#include <GL/glut.h>
 
int windh, windw; // window height and width
 
void draw_string(void *font, const char* string) 
{
  while(*string)
    glutStrokeCharacter(font, *string++);
}
 
void draw_string_bitmap(void *font, const char* string) 
{
  while (*string)
    glutBitmapCharacter(font, *string++);
}
 
void reshape(int wid, int ht)
{
  glViewport(0, 0, wid, ht);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(-wid/2, wid/2, -ht/2, ht/2);
  glMatrixMode(GL_MODELVIEW);
  windw = wid;
  windh = ht;
}
 
void redraw(void)
{
  glClear(GL_COLOR_BUFFER_BIT); 
  glLineWidth(1.0f);
 
  glPushMatrix();
  glTranslatef(-windw/2, 100, 0);
  glScalef(0.5f, 0.5f, 1.0f);
  draw_string(GLUT_STROKE_ROMAN, "Hello!");
  glPopMatrix();
  glPushMatrix();
  glTranslatef(-windw/2, 50, 0);
  glScalef(0.3f, 0.3f, 1.0f);
  draw_string(GLUT_STROKE_ROMAN, "Hello!");
  glPopMatrix();
  glPushMatrix();
  glTranslatef(-windw/2, -100, 0);
  glScalef(1.0f, 1.0f, 1.0f);
  draw_string(GLUT_STROKE_ROMAN, "Hello!");
  glPopMatrix();
  glRasterPos2f(0, 0);
  draw_string_bitmap(GLUT_BITMAP_HELVETICA_18, "Hello!");
  glFinish();
  glutSwapBuffers();   
}
 
void KeyFunc(unsigned char key, int x, int y)
{
  if (key == 27)
    exit(0);
}
 
int main(int argc, char* argv[])
{
  windw = 400;
  windh = 300;
 
  glutInit(&argc, argv);
  glutInitWindowSize(windw, windh);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  (void)glutCreateWindow("LK");
  glutReshapeFunc(reshape);
  glutDisplayFunc(redraw);
  glutKeyboardFunc(KeyFunc);
  glClearColor(0, 0, 0, 1.0f);
  glutMainLoop();
  return 0;
}

 

Hosted by uCoz