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);
Исходный файл смотрите здесь.
Исполняемый файл здесь.
|