是否可以在不使用OpenGL中的Matrix的情况下使用glColor3f更改颜色?

时间:2017-05-20 17:16:38

标签: c++ opengl

我想在HUD中写一些东西,我想交替使用两种颜色的单词。我不能用很多Matrixes(我的意思是写在许多单独的glPushMatrix和glPopMatrix中),因为我想保存我用glRasterPos2f启动的文本位置。我的意思是我不能正确地移动文本的位置而不计算每个字母显示已经文本的宽度是因为我觉得有点粘。所以我想留在一个矩阵中,只需在找到空格时更改颜色。

EDIT
好吧,例如,如果我希望用红色写出第一个单词,用绿色写出其他单词:

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();

1 个答案:

答案 0 :(得分:2)

glutBitmapCharacter通过致电glBitmap来吸引角色,而GL_CURRENT_RASTER_COLOR则使用glRasterPos。后者是通过在通话时拨打glWindowPosGL_CURRENT_COLORglColor来设置的。 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 ...

{{1}}

HOWEVER ,我强烈建议您取消所有操作并切换到现代OpenGL。