Цвет, используемый для рисования символов с помощью glutBitmapCharacter
, устанавливается с помощью glRasterPos
. glRasterPos
принимает текущий цвет, установленный glColor
, и связывает его.
Вы должны выбрать красный цвет перед glRasterPos2f
, чтобы нарисовать красный текст.
glColor3d(1.0, 0.0, 0.0);
glRasterPos2f(-28.0, position);
Ваш текст отображается зеленым, потому что последний цвет, установленный перед вызовом glRasterPos2f
, был цветом для примитива GL_LINE_STRIP
.
Если вы хотите нарисовать текст разными цветами, вам нужно сделать несколько вызовов glRasterPos
в каждой точке, когда цвет текста меняется.
Текущее положение растра можно получить с помощью glGetFloatv
, используя параметр GL_CURRENT_RASTER_POSITION
:
float pos[4];
glGetFloatv( GL_CURRENT_RASTER_POSITION, pos );
К сожалению, вы можете не получить позицию, которую вы установили с помощью glRasterPos
, потому что координаты, которые передаются в glRasterPos
, преобразуются текущей матрицей вида модели и матрицей проекции, но когда вы читаете позицию обратно, то Вы получите преобразованные координаты, а координаты являются координатами окна, а не нормализованными координатами устройства.
Если вы хотите изменить связанный цвет, но сохранить положение растра, вам нужно прочитать текущее положение растра glGetFloatv(GL_CURRENT_RASTER_POSITION, ...)
.
Это вернет координаты окна.
Таким образом, вы должны установить ортографическую проекцию, которая преобразуется из координат окна в нормализованные координаты устройства, прежде чем снова вызвать glRasterPos
, чтобы связать новый цвет. матрица вида модели должна быть единичной матрицей.
Измените функцию escritoura
следующим образом, чтобы решить вашу проблему:
void escritoura (char *p)
{
int contcarac=0, position=posicao, selecao=0;
p++;
glRasterPos2f(-28.0f, position);
while(*p)
{
if(*p=='1' || *p=='2' || *p=='3' || *p=='4' || *p=='5' || *p=='6' || *p=='7' || *p=='8' || *p=='9' || *p=='0')
{
// get the current raster position in window coordinates
float pos[4];
glGetFloatv( GL_CURRENT_RASTER_POSITION, pos );
// push model view matrix and set identity matrix
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// push projection matrix and set transformation form window coordinates to NDC
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho( 0, 1000, 0, 700, -1, 1 ); // (1000, 700) is the window size!
// change current color
glColor3d( 1.0, 0.0, 0.0 );
// associate new color, but keep position
glRasterPos4fv( pos );
// restore (pop) model view and projection matrix
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, *p);
p++; contcarac++;
}
return;
}