Каждый пиксел на экране имеет 3 составляющих - R, G, B .
Информация о пикселах может быть записана в 2 режимах - RGBA mode или
color-index mode , в котором цвет представлен единственным числом .
Таблица со значениями индексов называется color map . Изменять значения
в этой таблице во время работы приложения нельзя , во всяком случае
с использованием GLUT .
Каждый пиксел занимает определенное количество памяти для хранения
информации о его цвете . Память для хранения пикселов называется
color buffer . 8-битовый буффер отводит на каждый пиксел по 8 бит -
это 256 цветов .
Команды для определения цвета просты :
glColor3f (1.0, 0.0, 0.0);
glBegin (GL_POINTS);
glVertex3fv (point_array);
glEnd ();
После того , как дисплей установлен в один из режимов RGBA mode или
color-index , в дальнейшем он не может быть изменен .
Для того , чтобы каждый обьект был нарисован своим цветом , использцйте примерно
такую схему :
set_color(RED);
draw_item(A);
draw_item(B);
set_color(GREEN);
set_color(BLUE);
draw_item(C);
Цвет устанавливается командой glColor() , которая указывает численные значения для
цветовых составляющих или указывает на цветовой массив :
void glColor3 (TYPEr, TYPEg, TYPEb);
void glColor4 (TYPEr, TYPEg, TYPEb, TYPEa);
void glColor3 (const TYPE*v);
void glColor4 (const TYPE*v);
Полигон может быть нарисован единственным цветом (flat shading) или с оттенками
(smooth shading или Gouraud shading). Шадинг устанавливается командой glShadeModel()
с параметром . По умолчанию стоит параметр GL_SMOOTH .
При шадинге цвет каждой вершины индивидуален , при прорисовке линии цвет
интерполируется между вершинами .
Следующий пример рисует smooth-shaded треугольник (GLUT) :
#include < GL/gl.h >
#include < GL/glut.h >
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
}
void triangle(void)
{
glBegin (GL_TRIANGLES);
glColor3f (1.0, 0.0, 0.0);
glVertex2f (5.0, 5.0);
glColor3f (0.0, 1.0, 0.0);
glVertex2f (25.0, 5.0);
glColor3f (0.0, 0.0, 1.0);
glVertex2f (5.0, 25.0);
glEnd();
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT);
triangle ();
glFlush ();
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
if (w <= h)
gluOrtho2D (0.0, 30.0, 0.0, 30.0*(GLfloat) h/(GLfloat) w);
else
gluOrtho2D (0.0, 30.0*(GLfloat) w/(GLfloat) h, 0.0, 30.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
|