【发布时间】:2013-09-17 10:14:45
【问题描述】:
我有一个 OpenGL 项目,它使用 GLUT(不是 freeglut),我想在固定位置的视口上显示 2D 文本。我的其余对象都在 3D 世界坐标中。
This answer 对一个相关的旧问题说,
GLUT 附带的位图字体是简单的 2D 字体,不适合在 3D 环境中显示。但是,它们非常适合需要覆盖在显示窗口上的文本。
我已经尝试了接受的答案中概述的方法,但它没有给我想要的输出。下面是显示函数的一段代码sn-p:
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0, 0.0, -(dis+ddis)); //Translate the camera
glRotated(elev+delev, 1.0, 0.0, 0.0); //Rotate the camera
glRotated(azim+dazim, 0.0, 1.0, 0.0); //Rotate the camera
.
.
.
draw 3D scene
.
.
.
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0.0, win_width, 0.0, win_height);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRasterPos2i(10, 10);
string s = "Some text";
void * font = GLUT_BITMAP_9_BY_15;
for (string::iterator i = s.begin(); i != s.end(); ++i)
{
char c = *i;
glColor3d(1.0, 0.0, 0.0);
glutBitmapCharacter(font, c);
}
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glFlush();
glSwapBuffers();
}
similar question 似乎已被问及我想要什么,但作者没有接受任何答案。
一般来说,答案似乎建议使用其他库(主要是操作系统特定的)来实现覆盖。但是,没有明确的迹象表明单独使用GLUT 是否可以实现这一点。能做到吗?
【问题讨论】:
-
好吧,如果它旋转,您在
glLoadIdentity()和glutBitmapCharacter之间有一些对glRotatef或glMultMatrix的调用。您应该只渲染您的 3D 场景,然后执行您发布的第一个答案所建议的一切。 -
我已经尝试过了,但这会覆盖渲染的 3D 场景,并且只是在空白屏幕中显示文本。
-
您不应该在两者之间致电
glClear或swapBuffers。我们可以继续猜测问题是什么,或者您可以发布一个最小的代码示例来说明什么不起作用。 -
您发布的代码对我有用,您的问题似乎出在其他地方。
-
当你说它有效时,你是否在绘制 3D 场景并旋转相机时仍然得到覆盖?