Chapter 6
Освещение и все, что с ним связано
6.4 Лампы и их свойства
Все параметры лампы задаются с помощью функции glLight, которая имеет
следующий прототип:
void glLight[if][v](
GLenum light,
GLenum pname,
GLfloat param)
Первый аргумент определяет номер лампы. Его можно задавать двумя способами.
Первый - явно указать GL_LIHGTi, где GL_LIGHTi предопрелено в файле gl.h
следующим образом:
/* LightName */
#define GL_LIGHT0 0x4000
#define GL_LIGHT1 0x4001
#define GL_LIGHT2 0x4002
#define GL_LIGHT3 0x4003
#define GL_LIGHT4 0x4004
#define GL_LIGHT5 0x4005
#define GL_LIGHT6 0x4006
#define GL_LIGHT7 0x4007
Второй способ - GL_LIGHT0 + i, где i номер лампы. Такой способ используется,
когда вам надо в цикле изменять параметры ламп. Второй аргумент определяет
имя параметра, а третий - его значение. Я здесь не буду перечислять всевозможные
параметры и их допустимые значения, для этого есть справочник и MSDN. Я покажу
и прокомментирую лишь небольшой пример, использующий три лампы. Для начала,
давайте разберем шаблонный пример. С помощью следующих функций разрешаем
освещение и включаем нулевую лампу.
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
Массивы pos и dir содержат координаты местоположения лампы и направления,
куда она светит. Массив dir содержит три координаты - x,y,z. Массив pos
- четыре, назначение четвертого мне не очень ясно. Если его значение отличается
от нуля, то изображение получается вполне логичное. Если же он ноль, то получается что-то
непотребное.
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
Создайте
новый проект с именем lamps. Скопируйте шаблонный файл glaux.c.
Отредактируйте функцию main:
void main()
{
float pos[4] = {3,3,3,1};
float color[4] = {1,1,1,1};
float sp[4] = {1,1,1,1};
float mat_specular[] = {1,1,1,1};
auxInitPosition( 50, 10, 400, 400);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
auxInitWindow( "Glaux Template" );
auxIdleFunc(display);
auxReshapeFunc(resize);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT3);
glEnable(GL_LIGHT5);
glEnable(GL_LIGHT6);
glLightfv(GL_LIGHT3, GL_SPECULAR, sp);
glLightfv(GL_LIGHT5, GL_SPECULAR, sp);
glLightfv(GL_LIGHT6, GL_SPECULAR, sp);
color[1]=color[2]=0;
glLightfv(GL_LIGHT3, GL_DIFFUSE, color);
color[0]=0;
color[1]=1;
glLightfv(GL_LIGHT5, GL_DIFFUSE, color);
color[1]=0;
color[2]=1;
glLightfv(GL_LIGHT6, GL_DIFFUSE, color);
glLightfv(GL_LIGHT3, GL_POSITION, pos);
pos[0] = -3;
glLightfv(GL_LIGHT5, GL_POSITION, pos);
pos[0]=0;pos[1]=-3;
glLightfv(GL_LIGHT6, GL_POSITION, pos);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, 128.0);
auxMainLoop(display);
}
Здесь надо сделать пояснения для вызовов функции glLight с параметрами
GL_DIFFUSE и GL_SPECULAR. GL_DIFFUSE определяет цвет света источника.
В данном примере у нас три лампы - с красным источником света, с зеленым
и с синим. GL_SPECULAR определяет отраженный свет, см. предыдущий пункт.
Теперь измените функцию display:
glColor3d(1,1,1);
auxSolidSphere(2);
Исходный файл смотрите здесь.
Исполняемый файл здесь.
|