整个晚上,我一直在寻找互联网,包括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
我想知道的是我做错了什么,为了取得好成绩,我的职位未来需要做些什么。
答案 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();
}
你走了。