使用GLUT简单地打印文本

时间:2014-01-01 07:27:27

标签: c++ 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 个答案:

答案 0 :(得分:3)

你没有说出什么是错误的,但我怀疑你的文字没有出现。原因很可能是光栅位置被剪裁,这导致文本无法渲染。

栅格位置是绘制位图的“锚点”。通常,这是位图的左下角(glBitmap可以通过将 x 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]);
}

答案 1 :(得分:0)

#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();
}

你走了。