OpenGL文本显示异常求2024年最新解决方案
OpenGL中glutBitmapCharacter无法显示文本的问题与解决
问题描述
我正尝试在OpenGL中以任意方式显示文本。为从基础入手,我采用了GeeksForGeeks上的示例代码,该代码可正常运行并显示绿色圆形。随后我查阅了包括StackOverflow某高赞回答在内的多个文本绘制示例,将其中通用的实现策略编写在代码的40-42行,但字母'A'始终无法显示。
观察gluOrtho2D投影设置,(0, 0)坐标应处于窗口中间位置,理应可见,是否确实如此?
我能找到的相关问答均为10年前的旧内容,是否有关键变更导致该方法失效?若有,恳请提供2024年的更新方案,或其他可成功显示字母'A'的实现策略。
原始代码
// C program to demonstrate // drawing a circle using // OpenGL #define GL_SILENCE_DEPRECATION #include<stdio.h> #include<math.h> #include<GLUT/glut.h> #define pi 3.142857 // function to initialize void myInit (void) { glClearColor(0.0, 0.0, 0.0, 1.0); glColor3f(0.0, 1.0, 0.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-780, 780, -420, 420); } void display (void) { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POINTS); float x, y, i; // iterate y up to 2*pi, i.e., 360 degree // with small increment in angle as // glVertex2i just draws a point on specified co-ordinate for ( i = 0; i < (2 * pi); i += 0.001) { // let 200 is radius of circle and as, // circle is defined as x=r*cos(i) and y=r*sin(i) x = 200 * cos(i); y = 200 * sin(i); glVertex2i(x, y); } glEnd(); // NOT WORKING: glColor3f (1.0, 0.0, 0.0); glRasterPos2f(0.0, 0.0); glutBitmapCharacter(GLUT_BITMAP_8_BY_13, 'A'); glFlush(); } int main (int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(1366, 768); glutInitWindowPosition(0, 0); glutCreateWindow("Circle Drawing"); myInit(); glutDisplayFunc(display); glutMainLoop(); }
问题原因
- 矩阵状态混乱:绘制圆形时未明确设置模型视图矩阵状态,导致后续
glRasterPos2f的坐标转换出错,光栅位置可能被裁剪到视口外。 - 字符原点特性:
glutBitmapCharacter的绘制原点是字符的左下角,(0,0)位置的字符底部刚好和窗口中心线重合,视觉上容易被忽略,并非完全不显示。
修复方案(2024年可用)
修改display函数即可解决,无需更换API:
void display (void) { glClear(GL_COLOR_BUFFER_BIT); // 显式设置模型视图矩阵为单位矩阵,确保坐标转换正确 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glBegin(GL_POINTS); float x, y, i; for ( i = 0; i < (2 * pi); i += 0.001) { x = 200 * cos(i); y = 200 * sin(i); glVertex2i(x, y); } glEnd(); // 绘制文本 glColor3f (1.0, 0.0, 0.0); // 微调位置,让字符完全显示在窗口中心 glRasterPos2f(-5.0, -5.0); glutBitmapCharacter(GLUT_BITMAP_8_BY_13, 'A'); glFlush(); }
补充说明
glutBitmapCharacter并未过时,2024年在GLUT环境下依然有效,问题出在矩阵状态管理而非API废弃。gluOrtho2D(-780, 780, -420, 420)确实将(0,0)设为窗口中心,微调位置是为了让字符整体处于视觉中心,避免部分被遮挡。
内容的提问来源于stack exchange,提问作者Joymaker
相关产品推荐
相关产品推荐

