glutBitmapString()未按设置渲染颜色,首次调用异常求助
OpenGL文本颜色异常问题分析与解决
问题现象
调用自定义文本绘制函数时出现颜色异常:
- 第一个字符串使用了调用函数前绘制蓝色线条的颜色,而非函数内硬编码的红色
- 第二个字符串正常显示红色
- 若将画线代码移入自定义函数体内,文本会使用函数首次调用前的颜色,而非函数内的蓝色
相关代码
调用代码:
// Debug: draw a blue line glColor3f((GLfloat)0, (GLfloat)0, (GLfloat)1); glBegin(GL_LINES); glVertex2i(1, 1); glVertex2i(1, 10); glEnd(); // Call text renderer. write_default_bitmap_text((const unsigned char*)"TEST string 1", 100, 100); write_default_bitmap_text((const unsigned char*)"TEST string 2", 100, 120);
自定义函数实现:
void write_default_bitmap_text(const unsigned char* text, const int x, const int y, const font_x_align x_align) { if (x_align == font_x_align::Left) { glRasterPos2i(x, y); } else if (x_align == font_x_align::Center) { glRasterPos2i(x - glutBitmapLength(default_font, text)/2, y); } else { glRasterPos2i(x - glutBitmapLength(default_font, text), y); } glColor3f((GLfloat)1, (GLfloat)0, (GLfloat)0); //XXX debug glDisable(GL_TEXTURE_2D); //XXX debug glDisable(GL_LIGHTING); //XXX debug glutBitmapString(default_font, text); next_call_font_color = default_font_color; }
问题原因
核心在于**glRasterPos的工作机制**:
glRasterPos会将当前的顶点属性(包括颜色)与光栅位置绑定,这个绑定的属性会作为后续光栅化操作(比如glutBitmapString)的状态基础- 第一次调用函数时,
glRasterPos2i先执行,此时当前颜色还是之前绘制蓝色线条时设置的蓝色,因此光栅位置的颜色被固定为蓝色;之后设置的红色无法覆盖已经绑定到光栅位置的颜色,导致第一个字符串显示蓝色 - 第二次调用函数时,上一次函数最后执行了
glColor3f(红),此时当前颜色是红色,glRasterPos2i执行时会将红色绑定到光栅位置,因此第二个字符串正常显示红色
解决方案
调整代码顺序,将颜色设置、纹理/光照禁用等状态修改操作放在glRasterPos之前,确保这些状态在光栅位置确定前生效:
void write_default_bitmap_text(const unsigned char* text, const int x, const int y, const font_x_align x_align) { // 先设置绘制状态 glColor3f((GLfloat)1, (GLfloat)0, (GLfloat)0); //XXX debug glDisable(GL_TEXTURE_2D); //XXX debug glDisable(GL_LIGHTING); //XXX debug // 再确定光栅位置 if (x_align == font_x_align::Left) { glRasterPos2i(x, y); } else if (x_align == font_x_align::Center) { glRasterPos2i(x - glutBitmapLength(default_font, text)/2, y); } else { glRasterPos2i(x - glutBitmapLength(default_font, text), y); } glutBitmapString(default_font, text); next_call_font_color = default_font_color; }
这样每次调用函数时,都会先把颜色等状态设置好,再通过glRasterPos将这些状态绑定到光栅位置,glutBitmapString就能使用正确的颜色绘制文本了。
内容的提问来源于stack exchange,提问作者ScratchingTheSurface
相关产品推荐
相关产品推荐

