我想在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
的调用和对glWindowPos
的GL_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。