Основы освещения в OpenGL
Часть 1. ПодготовкаДля изучения освещения необходимы:
- OpenGL;
- glut;
- IDE, хотя можно воспользоваться gedit или CodeBlocks;
- компилятор, например, gcc для Linux и mingw для Windows;
Рассмотрим пример программы, в которой используется освещение.
Код:
|
Часть 3. Разбор кода в примере
Комментарии даны через символ // - "слэш".
Код:
|
Здесь инициализируется освещение
Код:
|
Здесь происходит вся прорисовка.
Код:
|
Часть 4. Изучаем освещение
Сначала включим расчет освещения командой glEnable(GL_LIGHTING). Затем надо разблокировать источник света командой glEnable(GL_LIGHT). GL_LIGHT может принимать только 8 значений (по крайней мере в OpenGL 2.1), то есть GL_LIGHT0..GL_LIGHT7.
Теперь надо создать источник света. У каждого источника света есть свои параметры по умолчанию, например, если вы просто разблокируете 2 источника света GL_LIGHT0 и GL_LIGHT1, то будет виден только 0, так как в нем параметры по умолчанию отличаються от остальных (у всех остальных они идентичны).
Источники света имеют несколько параметров, а именно: цвет, позиция и направление.
Команда, используемая для указания всех параметров света – это glLight*(). Она принимает три аргумента: идентификатор источника света, имя свойства и желаемое для него значение.
Код:
|
GLenum light - это выбор источника, например, GL_LIGHT0.
GLenum pname - это параметры источника света (далее будут приведены все ее параметры).
TYPE param - это значение, которое принимает GLenum pname.
Если у вас стоит void glLight{if}v (GLenum light, GLenum pname, TYPE *param), значит используется векторная версия команды; param представляет собой вектор величин.
Например:
Код:
|
Если нет, то тогда это единственное значение.
Например:
Код:
|
Вот листинг значений GLenum pname.
Читается так: первая строчка - это название параметра, вторая - это значение поумолчанию, а третья - пояснение. Если вы видите что-то типа (1.0,1.0,1.0,1.0) или (0.0,0.0,0.0,1.0), то это значит, что первая скобка - это значение по умолчанию для нулевого источника, а вторая скобка - для остальных:
Код:
|
Пример использования освещения:
Код:
|
Часть 5. Изучаем параметры света
1. Цвет
Diffuse
Параметр GL_DIFFUSE, наверное, наиболее точно совпадает с тем, что вы привыкли называть «цветом света». Он определяет RGBA-цвет диффузного света, который отдельный источник света добавляет к сцене.
Ambient
Параметр GL_AMBIENT влияет на цвет зеркального блика на объекте. В реальном мире на объектах вроде стеклянной бутылки имеется зеркальный блик соответствующего освещению цвета (часто белого).
Specular
Параметр GL_SPECULAR влияет на интенсивность зеркального блика на объектах.
2. Позиция
Параметр GL_POSITION (x, y, z, w) имеет 3 значения положения и одно, указывающее на то, какой источник света будет использоваться.
Первые 3 (x, y, z) параметра понятны, а 4-й (w) параметр указывает, будет ли использоваться бесконечно удаленный свет или точечный. Если значение w = 0, то источник света бесконечно удаленный (что-то вроде солнца). Если w = 1, то этот источник света точечный (что-то вроде лампочки).
Если w = 0, то первые 3 параметра - это вектор от центра системы координат (0,0,0).
3. Прожектор
GL_SPOT_DIRECTION - направление света прожектора.
GL_SPOT_EXPONENT - концентрация светового луча.
GL_SPOT_CUTOFF - угловая ширина светового луча.
Единственное, что нужно уточнить - позиция должна быть w = 1.
4. Ослабление
Если вам нужно ослаблять интенсивность света от центра (то есть чем дальше от центра, тем тускнее), то вам надо настроить параметры: GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION.
Но так не очень удобно, поэтому можно воспользоваться формулой:
Код:
|
В формуле используются следующие значения:
d - расстояние между позицией источника света и точкой.
Kc - GL_CONSTANT_ATTENUATION, постоянный фактор ослабления.
Kl - GL_LINEAR_ATTENUATION, линейный фактор ослабления.
Kq - GL_QUADRATIC_ATTENUATION, квадратичный фактор ослабления.
Если вы не совсем поняли, как это применить, обратите внимание на эту заготовку:
Код:
|
Радиус задается от центра до конца.
Если вам надо уменьшить общую интенсивность, вы можете изменить параметр att.
Часть 6. Выбор модели освещения
OpenGL-понятие модели освещения разделяется на 4 компонента:
- интенсивность глобального фонового света;
- считается ли положение точки наблюдения локальным к сцене или бесконечно удаленным;
- должен ли расчет освещенности производиться по-разному для лицевых и обратных граней объектов;
- должен ли зеркальный цвет отделяться от фонового и диффузного и накладываться на объект после операций текстурирования.
Код:
|
Устанавливаемая характеристика модели освещения определяется аргументом pname; param задает величину, в которую устанавливается pname.
Код:
|
Теперь вы можете создавать отличные источники света.