Chapter 6
Освещение и все, что с ним связано

6.3  Материал

     Материал может рассеивать, отражать и излучать свет. Свойства материала устанавливаются при помощи функции

glMaterialfv(GLenum face, GLenum pname, GLtype* params) 

     Первый параметр определяет грань, для которой устанавливаются свойства. Он может принимать одно из следующих значений:

  
GL_BACK             задняя грань
GL_FONT             передняя грань
GL_FRONT_AND_BACK   обе грани

     Второй парметр функции glMaterialfv определяет свойство материала, которое будет установлено, и может принимать следующие значения:

GL_AMBIENT  рассеянный свет
GL_DIFFUSE  тоже рассеянный свет, пояснения смотри ниже
GL_SPECULAR отраженный свет
GL_EMISSION излучаемый свет
GL_SHININESS степень отраженного света
GL_AMBIENT_AND_DIFFUSE оба рассеянных света

     Ambient и diffuse переводятся на русский как "рассеянный". Разница между ними не очень понятна. Я использую только GL_DIFFUSE. Третий параметр определяет цвет соответствующего света, кроме случая GL_SHININESS. Цвет задается в виде массива из четырех элементов - RGBA. В случае GL_SHININESS params указывает на число типа float, которое должно быть в диапазоне от 0 до 128. Я написал простенький пример с цилиндром и раскрасил его грани в разные цвета. Вам надо всего лишь модифицировать функцию display.

void CALLBACK display(void)
{
GLUquadricObj *quadObj; 
GLfloat front_color[] = {0,1,0,1};
GLfloat back_color[] = {0,0,1,1};

quadObj = gluNewQuadric(); 

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glMaterialfv(GL_FRONT, GL_DIFFUSE, front_color);
glMaterialfv(GL_BACK, GL_DIFFUSE, back_color);


glPushMatrix();
 glRotated(110, -1,1,0);
 gluCylinder(quadObj, 1, 0.5, 2, 10, 10); 
glPopMatrix();

gluDeleteQuadric(quadObj);
auxSwapBuffers();
}
И вы должны разрешить режим освещенности для двух граней. По умолчанию он запрещен. Добавьте в функцию main следующую строчку.
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);


Исходный файл смотрите здесь. Исполняемый файл здесь.