c++ - 使用 GLUT 简单地打印文本

标签 c++ glut

整个晚上,我一直在 Internet 上四处寻找,包括 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

我想知道的是我做错了什么,以及处于我这个位置的 future 读者需要做什么才能获得好的结果。

最佳答案

你没有说具体有什么问题,但我怀疑你的文字没有显示出来。原因很可能是光栅位置被剪裁,这导致您的文本无法呈现。

光栅位置是绘制位图的“ anchor ”。通常,这是位图的左下角(glBitmap 可以通过将 xy 参数设置为其他值来更改它不是零,但假设你没有这样做)。光栅位置由模型 View 矩阵转换,就像几何图元中的顶点一样。就像顶点一样,如果转换后的光栅位置位于视口(viewport)之外,则会被裁剪,并且不会渲染任何内容。此处需要了解的重要一点是,位图的任何渲染 - 无论其大小 - 都基于视口(viewport)内的光栅位置。

在您的示例中,您没有显示正在使用的视口(viewport),也没有显示投影变换(GL_PROJECTION 堆栈上的矩阵),但您将光栅位置设置为 (1280, 720 ),这很可能在视口(viewport)之外。

假设您要在窗口的左下角呈现文本(为了便于讨论,假设您的窗口是 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 可以替换为其他维度- type pairs like other OpenGL functions),它绕过模型 View 和投影矩阵转换光栅位置,直接在窗口坐标中工作。在这种情况下,您可以将上面的代码编写为:

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]);
}

关于c++ - 使用 GLUT 简单地打印文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20866508/

相关文章:

c++ - OpenGL XUbuntu 14.04 glShaderSource、glCompileShader、glCreateProgram 函数未声明

c++ - 如何将 glut 库嵌入到 C++ 项目中?

c++ - 不同的片段着色器颜色

c++ - 在 C++ 中包装 stdint 变量的基础和继承对象

android - 如何在 Android 的 native 代码中使用 GLUt?

c - GLFW3 中是否有 glutDisplayFunc 等效项?

c++ - OpenGL - 光值和位置

c++ - 如何使用带有引用的函数指针创建 std::thread ?

c++ - 具有特定语言本地化的 SHBrowseForFolder

c++ - glOrtho 不工作