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);


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