我想在HUD中写一些东西,我想在单词上交替使用两种颜色。我无法使用很多矩阵(我的意思是写在许多单独的glPushMatrix和glPopMatrix中),因为我想保存用glRasterPos2f初始化的文本位置。我的意思是我无法正确移动文本的位置,而不能计算已经显示的文本中每个字母的宽度,因为我认为这有点粘。因此,我想保留在一个矩阵中,并在找到空间时简单地更改颜色。

编辑
好的,例如,如果我希望用红色写第一个单词,而用绿色写其他单词:

glPushMatrix();
    glColor3f(1, 0, 0);
    glRasterPos2f(10, 10);
    void * font = GLUT_BITMAP_HELVETICA_18;
    string label = "first second";
    int i = 0;
    for (; i < label.length(); i++)
    {
        char c = label[i];
        if (c == ' ')
        {
            i++;
            break;
        }
        glutBitmapCharacter(font, c);
    }
    glColor3f(0, 1, 0);
    for (; i < label.length(); i++)
    {
        char c = label[i];
        glutBitmapCharacter(font, c);
    }
glPopMatrix();

最佳答案

glutBitmapCharacter通过调用glBitmap来绘制字符,后者又使用GL_CURRENT_RASTER_COLOR。后者是通过在调用时对glRasterPos的调用和对glWindowPosGL_CURRENT_COLOR的调用来设置的。 glColor仅更新GL_CURRENT_COLOR:

glColor3f(1,0,0);
glRasterPos(...); // GL_CURRENT_RASTER_COLOR = 1,0,0
glBitmap(...); // draws in red
glColor3f(0,1,0);
glBitmap(...); // still draws in red
glRasterPos(...); // GL_CURRENT_RASTER_COLOR = 0,1,0
glBitmap(...); // now draws in green

因此,唯一的解决方案是在单词之间调用glRasterPos/glWindowPos来拾取更新的颜色。为此,您可以按以下方式检索GL_CURRENT_RASTER_POSITION:
// ... draw first word ...

float pos[4] = {};
glGetFloatv(GL_CURRENT_RASTER_POSITION, pos);
glColor3f(0,1,0);
glWindowPos3fv(pos);

// ... draw second word ...

但是,我强烈建议您放弃所有操作并切换到现代OpenGL。

10-04 13:33