Как использовать шрифты в
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;
}