Название: Компьютерная графика(Е.Н. Павенко)

Жанр: Информатика

Просмотров: 1428


1. описание источников света в opengl

В системе OpenGl поддерживаются источники света четырех типов: фонового освещения (ambient lighting), точечные источники (point sources), прожекторы (spotlights), удаленные источники света (distant light).  В одной программе может использоваться до восьми источников света. Каждый источник света имеет свой набор параметров, в том числе программный код включения/выключения. Параметры, описывающие источник света, соответствуют параметрам модели Фонга. Для установки векторных параметров используется функция glLightfv(), которая имеет следующий формат обращения:

glLightfv(source, parameter,  pointer_to_array);

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

Для установки скалярных параметров в OpenGL служит функция glLightf():

glLightf(source, parameter, value);

Пусть, например, требуется включить в сцену источник GL_LIGHT0, который должен находиться в точке (1.0, 2.0, 3.0). Положение источника сохраняется в программе в виде точки в однородных координатах:

GLfloat light0_pos[]={1.0, 2.0, 3.0, 1.0};

Если четвертый компонент этой точки равен нулю, то точечный источник превращается в удаленный, для которого существенно только направление лучей:

GLfloat light0_dir[]={1.0, 2.0, 3.0, 0.0};

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

            GLfloat diffise0[]= {1.0, 0.0, 0.0, 1.0};

            GLfloat ambient0[]={1.0, 0.0, 0.0, 1.0};

            GLfloat specular0[]={1.0, 1.0, 1.0, 1.0};

            glEnable(GL_LIGHTING);

            glEnable(GL_LIGHT0);

            glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);

            glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);

            glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);

            glLightfv(GL_LIGHT0, GL_SPECULAR, specular0);

 

Функция glEnable() вызывается дважды: сначала для включения режима анализа освещения, а затем для включения в сцену конкретного источника.

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

GLfloat global_ambient[]={0.1, 0.1, 0.1, 1.0};

glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);

В модели освещения член, учитывающий расстояние до источника, имеет вид:

f(d)= 1/(a+ b*d+ c*d^2)

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

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENATION, a);

Для преобразование точечного источника в прожектор нужно задать направление луча прожектора (GL_SPOT_DIRECTION), показатель функции распределения интенсивности (GL_SPOT_EXPONENT) и угол рассеяния луча (GL_SPOT_CUTTOF). Эти параметры устанавливаются с помощью функций glLightf() и glLightfv().

Параметры, устанавливаемые для источников света по умолчанию приведены в таблице 6.1.

 

Таблица 6.1

Параметры, устанавливаемые для источников света по умолчанию

Имя параметра

Значение

Содержание

GL_AMBIENT

(0.0, 0.0, 0.0, 1.0)

ambient RGBA intensity of light

GL_DIFFUSE

(1.0, 1.0, 1.0, 1.0)

diffuse RGBA intensity of light

GL_SPECULAR

(1.0, 1.0, 1.0, 1.0)

specular RGBA intensity of light

GL_POSITION

(0.0, 0.0, 1.0, 0.0)

(x, y, z, w) position of light

GL_SPOT_DIRECTION

(0.0, 0.0, -1.0)

(x, y, z) direction of spotlight

GL_SPOT_EXPONENT

0.0

spotlight exponent

GL_SPOT_CUTOFF

180.0

spotlight cutoff angle

GL_CONSTANT_ATTENUATION

1.0

constant attenuation factor

GL_LINEAR_ATTENUATION

0.0

linear attenuation factor

GL_QUADRATIC_ATTENUATION

0.0

quadratic attenuation factor