
- •Лабораторная работа №3 Материалы и освещение
- •Модель освещения
- •Спецификация материалов
- •Описание источников света
- •Цвет материала
- •Значения rgb для источников света и материалов
- •Вектора нормали в вершинах объектов
- •Выбор модели освещения
- •Задание свойств материалов для объектов сцены
- •Местоположение и затухание
Вектора нормали в вершинах объектов
Нормали в вершинах объекта определяют его ориентацию относительно источников света. OpenGL использует нормаль вершины, чтобы вычислить, сколько света от каждого источника попадает в эту вершину. В программе 5.1 нормали для вершин явно не задаются, это делается внутри функции auxSolidSphere().
5.2 Создание, расположение и включение источников света
В программе 5.1 используется только один источник белого света. Его местоположение задается функцией glLightfv(). В данном примере для нулевого источника света (GL_LIGHT0) используется цвет по умолчанию (белый). Для изменения цвета источника надо вызвать функцию glLight*(). OpenGL позволяет включить до 8-ми источников света (у всех, кроме нулевого, по умолчанию задан черный цвет).
Эти источники можно располагать в любых местах – вблизи сцены (как настольную лампу), или бесконечно далеко (как солнце). Кроме того, можно управлять свойствами светового пучка – сделать его узким сфокусированным или широким. Необходимо помнить, что каждый источник света приводит к усложнению вычислений. Поэтому производительность программы зависит от количества включенных источников.
После задания характеристик источников света, необходимо включить каждый источник функцией glEnable(). Предварительно необходимо вызвать эту функцию с параметром GL_LIGHTING, чтобы подготовить OpenGL к выполнению расчетов освещения.
Выбор модели освещения
Функция glLightModel*() предназначена для задания параметров модели освещения. В программе 5.1 явно задается только один подобный параметр – яркое фоновое рассеянное освещение. Модель освещения также определяет, где надо располагать наблюдателя – на бесконечно большом расстоянии или близко от сцены, и не должны ли расчеты освещения выполняться по–разному для передних и задних сторон объектов сцены. В программе 5.1 используются параметры модели "по умолчанию" – бесконечно удаленный наблюдатель и одностороннее освещение. Использование локального наблюдателя существенно усложняет расчеты, т.к. OpenGL должна будет вычислять угол между точкой наблюдения и каждым объектом. Для бесконечно далекого наблюдателя этот угол не учитывается, поэтому результаты слегка теряют реалистичность. Далее, т.к. в этом примере внутренняя поверхность сферы никогда не видна, то достаточно одностороннего освещения.
Задание свойств материалов для объектов сцены
Свойства материала объекта определяют, как он будет отражать свет, и, значит, как будет выглядеть этот материал. Взаимодействие между поверхностью объекта и падающим светом – сложный физический процесс. Задать свойства материала в приближенной модели освещения OpenGL так, чтобы объект выглядел похожим на реальный, довольно сложное дело, требующее навыка. Для материала можно независимо задавать излучаемую, рассеянную, диффузную и зеркальную компоненты, а также блеск. В программе 5.1 с помощью функции glMaterialfv() задаются два свойства материала – цвет зеркальной компоненты (GL_SPECULAR) и блеск (GL_SHININESS).
Местоположение и затухание
Источник света можно расположить или бесконечно далеко, или вблизи сцены.
Источники первого типа называются направленными источниками света. Для бесконечно далекого источника (например, Солнца) можно полагать, что лучи света от него падают на объект параллельным пучком. Источники второго типа – локальные, расположенные в непосредственной близости от освещаемого объекта. От их конкретного местоположения зависит, под каким направлением свет будет падать на объекты сцены. Пример локального источника света – настольная лампа.
В программе 5.1 создается направленный источник света:
float light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
В качестве значения для свойства GL_POSITION указывается массив (x, y, z, w).
Если четвертая координата w=0, то источник света будет считаться направленным, и его направление будет задаваться вектором (x, y, z). По умолчанию GL_POSITION равно (0, 0, 1, 0), т.е. это направленный источник света, излучающий свет вдоль отрицательного направления оси z.
Если w≠0, то источник света будет считаться локальным и (x, y, z) задает местоположение источника света. Локальный источник света излучает по всем направлениям, но можно ограничить конус излучения, сделав источник "прожектором".
Интенсивность излучения реальных источников света уменьшается с расстоянием от источника. Для направленных источников говорить о затухании с расстоянием бессмысленно, т.к. они располагаются бесконечно далеко от сцены. Поэтому свойства затухания можно задавать только для локальных источников. При вычислении интенсивности локальных источников OpenGL использует коэффициент затухания:
При необходимости эти значения можно изменить, например:
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.5);