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

glutBitmapCharacter失效求助:如何让遗留OpenGL代码显示字符(附测试代码)

修复MacOS下FLTK+GLUT中glutBitmapCharacter不显示的问题

问题描述

修复2004年的遗留OpenGL代码时,发现glutBitmapCharacter功能失效:无报错但字符完全不显示,使用BeginDataStrip/EndDataStrip的代码仍能正常显示,仅涉及glutBitmapCharacter的内容不可见。

环境

  • MacOS 14.2.1
  • VSCode 1.98.1
  • llvm工具链

测试程序

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Gl_Window.H>
#include <FL/gl.h>
#include <GLUT/GLUT.H>

void glutWireSphere (GLdouble radius, GLint slices, GLint stacks);

class MyGlWindow : public Fl_Gl_Window {
private:
    float blue;
public:
    MyGlWindow(int x, int y, int w, int h, float bblue = 0.0f, 
                const char* l = 0) : Fl_Gl_Window(x, y, w, h, l) {
        blue = bblue;
    }

    void draw() override {
        if (!valid()) {
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glViewport(0, 0, w(), h());
            glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 5.0);
            glEnable(GL_DEPTH_TEST);
            valid(1);
        }

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        // Set up the camera
        gluLookAt(0.0, 0.0, 4.5,  // eye position
                  0.0, 0.0, 0.0,  // look-at position
                  0.0, 1.0, 0.0); // up direction

        // Draw a sphere
        glColor3f(0.5, 1.0, blue);
        glutWireSphere(0.8, 20, 20);
        // NOT WORKING:
        glRasterPos2f(0.5, 0.4);
        glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, 'A');

        glFlush();
    }
};

int main() {
    Fl_Window* window = new Fl_Window(400, 800, "FLTK Sphere Example");
    MyGlWindow* glWindow = new MyGlWindow(10, 20, window->w() - 20, 400 - 20, 0.0);
    window->resizable(window);
    window->end();
    window->show();
//    Fl_Widget * const *kids = tab1.array();
    return Fl::run();
}

修复方案

核心问题分析

glutBitmapCharacter不显示的主要原因有两个:

  1. 光栅位置被遮挡或裁剪:glRasterPos受当前模型视图/投影矩阵影响,若计算后的位置不在视锥体内,或被深度测试判定为在球体后方,字符会被直接忽略。
  2. 颜色对比度低:当前球体颜色与字符颜色过于接近,即使显示也难以分辨。

修改步骤

方案1:改用窗口坐标定位字符(推荐)

直接使用glWindowPos2f替代glRasterPos2f,跳过矩阵变换,直接基于窗口像素坐标定位,同时调整颜色并临时关闭深度测试避免遮挡:

修改draw函数中字符绘制的代码段:

// Draw a sphere
glColor3f(0.5, 1.0, blue);
glutWireSphere(0.8, 20, 20);

// 修复后的字符绘制逻辑
glColor3f(1.0, 0.0, 0.0); // 设置红色,提升对比度
glDisable(GL_DEPTH_TEST); // 临时关闭深度测试,避免被球体遮挡
glWindowPos2f(250, 220); // 直接用窗口像素坐标定位(根据窗口大小调整)
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, 'A');
glEnable(GL_DEPTH_TEST); // 恢复深度测试

glFlush();

方案2:调整光栅位置与深度测试

如果坚持使用glRasterPos,需要确保位置在可视范围内,并调整深度值让字符处于球体前方:

// Draw a sphere
glColor3f(0.5, 1.0, blue);
glutWireSphere(0.8, 20, 20);

// 修复后的字符绘制逻辑
glColor3f(1.0, 0.0, 0.0);
glRasterPos3f(0.5, 0.4, 1.0); // 设置z=1.0,让字符在球体前方(球体z范围-0.8~0.8)
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, 'A');

glFlush();

额外优化

在main函数开头添加GLUT初始化代码,确保GLUT资源正确加载:

int main(int argc, char** argv) {
    glutInit(&argc, argv); // 添加GLUT初始化
    Fl_Window* window = new Fl_Window(400, 800, "FLTK Sphere Example");
    // ... 原有代码
}

内容的提问来源于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 21:25:59