Использование GLUT для простой печати текста

Всю ночь я искал в Интернете, как stackoverflow, так и в других местах, чтобы найти что-то, что скажет, как печатать текст на GLUT. В то время как я нашел места, которые говорят, как, ни один не объяснил это хорошо, говоря, какие части функции являются необходимыми, а какие нет. Я также пытался скопировать часть кода, наиболее близкого к успеху, — это то, что сделало весь мой экран белым, за исключением некоторых синих пикселей. Так что я сдался, и я надеюсь, что это прояснит путаницу для меня и многих смущенных людей, таких как я.

Итак, я нашел этот код:

glColor3f(1.0f, 0.0f, 0.0f);
glRasterPos2f(1280, 720);
int len = menu.length();
for (int i = 0; i < len; i++) {
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10, menu[i]);
}

и я поместил его в мой код:

void drawScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(-_cameraAngle, 0.0f, 1.0f, 0.0f);
glTranslatef(0.0f, 0.0f, -9.0f + zoom);

glTranslatef(0.0f, -1.0f, 0.0f);

string menu = "Hello!";

glColor3f(1.0f, 0.0f, 0.0f);
glRasterPos2f(1280, 720);
int len = menu.length();
for (int i = 0; i < len; i++) {
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10, menu[i]);
} /*if I need to post the rest of drawScene(), which is the function delegated
as the Display Func, tell me. I don't want to because it's long

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

2

Решение

Вы не говорите, что конкретно не так, но я подозреваю, что ваш текст не отображается. Вероятно, причина заключается в том, что растровая позиция обрезается, и это приводит к тому, что ваш текст не отображается.

Положение растра — это «точка привязки», в которой будет отображаться растровое изображение. Обычно это нижний левый угол растрового изображения ( glBitmap можно изменить это с помощью установки Икс а также Y параметры к чему-то отличному от нуля, но предположим, что вы этого не делаете). Положение растра преобразуется матрицей вида модели, как вершина в геометрическом примитиве. И точно так же, как вершина, если преобразованная позиция растра находится вне области просмотра, она обрезается и ничего не отображается. Здесь важно знать, что любой рендеринг растрового изображения — независимо от его размера — основывается на положении растра внутри области просмотра.

В вашем примере вы не показываете используемый вами видовой экран и преобразование проекции (матрица на GL_PROJECTION стек), но вы устанавливаете растровую позицию на (1280, 720), которая вполне может находиться за пределами области просмотра.

Допустим, вы хотите визуализировать ваш текст в левом нижнем углу окна (и в качестве аргумента, скажем, ваше окно имеет размер 1280 x 1024). Когда пришло время визуализировать ваш текст, добавьте следующее в вашу процедуру рендеринга:

glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();
gluOrtho2D( 0, 1280, 0, 1024 );

glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glLoadIdentity();
glRasterPos2i( 10, 1014 );  // move in 10 pixels from the left and bottom edges
for ( int i = 0; i < len; ++i ) {
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10, menu[i]);
}
glPopMatrix();

glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );

В зависимости от того, какую версию OpenGL вы используете, вы можете использовать более простую процедуру glWindowPos2i() ( 2i может быть заменен другими парами типа измерения, такими как другие функции OpenGL), что позволяет обойти преобразование положения растра с помощью матриц вида модели и проекции и работает непосредственно в координатах окна. В этом случае вы бы написали приведенный выше код как:

glWindowPos2i( 10, 1014 );  // move in 10 pixels from the left and bottom edges
for ( int i = 0; i < len; ++i ) {
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10, menu[i]);
}
3

Другие решения

#ifdef __APPLE_CC__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

void init2D(float r, float g, float b)
{
glClearColor(r, g, b, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 600.0, 0.0, 600.0);
}

void rectangle()
{
glBegin(GL_POLYGON);
glColor3f(0.4,0,0.8);
glVertex3f(150.0f, 200.0f, 0.0f);
glColor3f(0.4,0,0.8);
glVertex3f(450.0f, 200.0f, 0.0f);
glColor3f(0.6,0,0.6);
glVertex3f(450.0f, 400.0f, 0.0f);
glColor3f(0.6,0,0.6);
glVertex3f(150.0f, 400.0f, 0.0f);
glEnd();
}

void text()
{
char menu[80];
strcpy(menu,"Have courage and be kind");
int len;
len = strlen(menu);

glColor3f(1,1,1);

glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();

gluOrtho2D( 0, 600, 0, 600 );

glMatrixMode( GL_MODELVIEW );
glPushMatrix();

glLoadIdentity();

glRasterPos2i(190, 300);for ( int i = 0; i < len; ++i )
{
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, menu[i]);
}

glPopMatrix();

glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
}

void display()
{

glClear(GL_COLOR_BUFFER_BIT);

rectangle();
text();

glFlush();
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

glutInitWindowPosition(0, 0);
glutInitWindowSize(600, 600);
glutCreateWindow("Assignment 1 Question 2");
init2D(0.0f, 0.0f, 0.0f);
glutDisplayFunc(display);

glutMainLoop();
}

Ну вот.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector