Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
семинар 4.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
503.81 Кб
Скачать

Изучение реализации рассеянного освещения

Теперь переходим ко второй, – основной части нашего семинара. В ее ходе мы с помощью созданной программы займемся изучением свойств модели освещения, реализованной в OpenGL.

Запустите созданную программу. Если вы все сделали правильно, и у вас нужным образом отрегулирована яркость монитора, то вы увидите на черном фоне слабо выраженный темно-серый квадрат. Откуда взялся этот свет, если мы не включали ни одного источника, и почему он был отражен поверхностью объекта, если мы не задавали ее свойств? Как мы уже говорили, большинство переменных состояния конвейера OpenGL имеет значения по умолчанию. Включив режим расчета освещения, и не определив необходимых параметров, мы заставили библиотеку использовать эти значения. По умолчанию поверхности объектов отражают диффузный и рассеянный (фоновый) свет с коэффициентами отражения (0.8, 0.8, 0.8, 1.0) и (0.2, 0.2, 0.2, 1.0), соответственно. Диффузный и зеркально отражаемый свет может испускать только включенный источник, а рассеянный свет может быть определен независимо от источника, т.к. не связан с направлением. В OpenGL фоновое освещение (рассеянное) может быть определено на уровне модели изменением параметра GL_LIGHT_MODEL_AMBIENT командой glLightModel. Чтобы убедиться в правильности наших рассуждений перекроем значения по умолчанию, задав нулевую интенсивность фонового освещения.

Procedure DrawImage;

Var vect:array[0..3] of glFloat;

Begin

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

vect[0]:=0; vect[1]:=0; vect[2]:=0; vect [3]:=0;

glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@vect);

DrawScene;

glFlush;

SwapglBuffers;

End;

Наш квадрат теперь не освещен и поэтому не отличим от фона. Таким образом, опираясь на значения по умолчанию, установленные в библиотеке, мы можем разрабатывать и отлаживать приложение поэтапно. Нет необходимости определять все требуемые параметры для того, чтобы изображение могло быть отображено на экране. Мы можем поочередно изменять значения свойств и наблюдать их влияние на формируемое изображение. Этим подходом мы и воспользуемся для изучения свойств источников света и начнем его с диффузного освещения.

Изучение реализации диффузной составляющей освещения

Для упрощения работы с источниками света, реализованными в OpenGL, обычно используют три метафоры: лампочка, прожектор (фонарь) и солнце.

Метафора лампочки используется для позиционного источника, равномерно испускающего свет по всем направлениям. В нашем приложении по умолчанию источник позиционный, направление освещения совпадает с отрицательной полуосью Z, а угол светового конуса равен 180 градусам, т.е. свет равномерно испускается во всех направлениях. Остается просто включить диффузную составляющую светового потока.

Изменяя значения координат X и Z источника, проследите за изменением характера освещения сцены. Основное внимание уделите освещению прямоугольной площадки. Расположенная в правом окне схема освещения поможет вам отслеживать величины ключевых углов. Напомним, что наблюдатель расположен в начале координатной системы, вектора которой показаны на схеме отрезками (начало координат, соответствует точке пересечения отрезков).

Затем включите режим учета положения наблюдателя и перемещайте сцену относительно позиции наблюдателя (такое перемещение эквивалентно перемещению наблюдателя относительно сцены). Проследите за изменениями. К каким выводам вы пришли? Давайте сверим выводы.

Основной характеристикой определяющей освещение сцены при использовании позиционного всенаправленного источника (лампочки) является его положение относительно сцены. Расположите источник так, чтобы он находился примерно на половине расстояния между площадкой и наблюдателем, ближе к правому краю площадки (Z=2.5, X=5). Наиболее интенсивно площадка освещена напротив источника. По мере удаления от этой точки интенсивность освещения падает. Перенесем наше внимание на схему сцены. Как мы знаем из лекции, угол падения света определяется нормалью к поверхности и направлением на источник. Нормаль к площадке (к любой ее точке) совпадает с осью Z. Для определения направления освещения, мысленно, соединяем линией освещаемую точку и источник. Для точки поверхности, расположенной напротив источника, угол падения равен 0, а по мере удаления от источника он возрастает. Другим фактором способным оказать влияние на освещение является ослабление интенсивности при возрастании расстояния до источника. Однако, в нашем приложении мы его не определяли, а по умолчанию задано постоянное ослабление с единичным коэффициентом то есть, ослабление отсутствует. Последним параметром способным оказать влияние на процесс является угол отражения, определяемый межу нормалью и направлением на наблюдателя. Этот угол можно получить по аналогии с углом падения, мысленно соединив освещаемую точку с центром сцены (где расположен наблюдатель). Перемещая сцену, относительно наблюдателя, вы изменяли углы отражения для всех точек сцены, изменения освещения при этом не наблюдалось. Следовательно, данный параметр не оказывает влияния на диффузное освещение. Подводя итог, можно сделать вывод о том, что диффузное освещение зависит только от угла падения света и ослабления (если оно включено). Эти величины определяются положением источника относительно сцены.

Под метафорой «фонарь» скрывается тот же позиционный источник света, имеющий ограничения по направлению освещения – световой конус. Для него используются три дополнительные характеристики: угол светового конуса, направление освещения и распределение светового потока внутри конуса. Органы управления значениями этих характеристик реализованы в нашей программе. Перезапустите программу, чтобы восстановить значения по умолчанию. Включите диффузную составляющую источника и уменьшайте угол светового конуса до появления на площадке признаков ограничения светового потока. Обратите внимание на то, что интенсивность света внутри светового круга постоянна. Это вызвано тем, что по умолчанию коэффициент, отвечающий за распределение света внутри светового конуса равен 0, что соответствует равномерному распределению. Изменяя значение этого параметра, пронаблюдайте за изменением распределения света. Наше приложение не предусматривает полного управления направлением освещения, однако мы можем направить свет на центр сцены при любом положении источника. Включите этот режим и восстановите равномерное распределение света внутри конуса. Расположите источник возле правого угла площадки, сдвинув его по осям X и Z (X=5,5 и Z=-4,8). При таком положении площадка пересекает световой конус под небольшим углом к его оси и по сечению хорошо видно, что это действительно конус. Изменяя угол светового конуса и распределение света, проследите за изменение освещения. Если световой конус плохо видно, отведите источник от площадки (в сторону положительной полуоси Z). Форма конуса при этом исказится, но это не важно.

Последняя метафора – “солнце” предполагает направленный источник. Перезапустите программу, включите диффузное освещение и соответствующий режим. Наша площадка осталась не освещенной (а точнее освещенной только фоновой составляющей). Почему нет диффузного освещения? Направление освещения не определено. Оно определяется вектором, соединяющим тройку координат, задаваемых как позиция источника и начало координат. У нас по умолчанию позиция источника совпадает с началом координат и, следовательно, вектор не определен. Сместив положение источника в сторону положительной полуоси Z, мы получаем вектор, направленный в сторону прямоугольной площадки, в результате чего она оказывается освещенной. Изменяя свойства направленного источника, убедитесь в следующем:

1. у направленного источника отсутствует световой конус (испускаемые лучи параллельны);

2. положение наблюдателя не оказывает влияние на диффузную составляющую освещения;

3. основное влияние на интенсивность диффузного освещения оказывает величина угла падения света.