整个晚上,我一直在 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
可以通过将 x 和 y 参数设置为其他值来更改它不是零,但假设你没有这样做)。光栅位置由模型 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/