You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:47:09