Материалы и освещение
Материалы
и освещение
Для создания реалистических изображений необходимо определить как свойства
самого объекта, так и свойства среды, в которой он находится. Первая группа
свойств включает в себя параметры материла, из которого сделан объект, способы
нанесения текстуры на его поверхность, степень прозрачности объекта. Ко второй
группе можно отнести количество и свойства источников света, уровень
прозрачности среды. Все эти свойства можно задавать, используя соответствующие
команды OpenGL.
Свойства материала
Для задания параметров текущего материала используются команды
- void glMaterial[i f](GLenum face, GLenum pname, GLtype param)
- void glMaterial[i f]v(GLenum face, GLenum pname, GLtype *params)
С их помощью можно определить рассеянный, диффузный и зеркальный цвета
материала, а также цвет степень зеркального отражения и интенсивность излучения
света, если объект должен светиться. Какой именно параметр будет определяться
значением param, зависит от значения pname:
GL_AMBIENT параметр params должен содержать четыре целых или
вещественных значения цветов RGBA, которые определяют рассеянный цвет материала
(цвет материала в тени).
Значение по умолчанию: (0.2, 0.2, 0.2, 1.0).
GL_DIFFUSE параметр params должен содержать четыре целых или
вещественных значения цветов RGBA, которые определяют цвет диффузного отражения
материала.
Значение по умолчанию:(0.8, 0.8, 0.8, 1.0).
GL_SPECULAR параметр params должен содержать четыре целых или
вещественных значения цветов RGBA, которые определяют цвет зеркального отражения
материала.
Значение по умолчанию: (0.0, 0.0, 0.0, 1.0).
GL_SHININESS параметр params должен содержать одно целое или
вещественное значение в диапазоне от 0 до 128, которое определяет степень
зеркального отражения материала.
Значение по умолчанию: 0.
GL_EMISSION параметр params должен содержать четыре целых или
вещественных значения цветов RGBA, которые определяют интенсивность излучаемого
света материала.
Значение по умолчанию: (0.0, 0.0, 0.0, 1.0).
GL_AMBIENT_AND_DIFFUSE эквивалентно двум вызовам команды
glMaterial..() со значением pname GL_AMBIENT и GL_DIFFUSE и одинаковыми
значениями params.
Из этого следует, что вызов команды glMaterial[i f]() возможен только для
установки степени зеркального отражения материала. В большинстве моделей
учитывается диффузный и зеркальный отраженный свет; первый определяет
естественный цвет объекта, а второй – размер и форму бликов на его
поверхности.
Параметр face определяет тип граней, для которых задается этот материал и
может принимать значения GL_FRONT, GL_BACK или GL_FRONT_AND_BACK.
Если в сцене материалы объектов различаются лишь одним параметром,
рекомендуется сначала установить нужный режим, вызвав glEnable() c параметром
GL_COLOR_MATERIAL, а затем использовать команду
void glColorMaterial(GLenum face, GLenum pname)
где параметр face имеет аналогичный смысл, а параметр pname может принимать
все перечисленные значения. После этого, значения выбранного с помощью pname
свойства материала для конкретного объекта (или вершины) устанавливается вызовом
команды glColor..(), что позволяет избежать вызовов более ресурсоемкой команды
glMaterial..() и повышает эффективность программы.
Источники света
Добавить в сцену источник света можно с помощью команд
- void glLight[i f](GLenum light, GLenum pname, GLfloat param)
- void glLight[i f](GLenum light, GLenum pname, GLfloat *params)
Параметр light однозначно определяет источник,и выбирается из набора
специальных символических имен вида GL_LIGHTi, где i должно лежать в диапазоне
от 0 до GL_MAX_LIGHT, которое не превосходит восьми.
Оставшиеся два параметра имеют аналогичный смысл, что и в команде
glMaterial..(). Рассмотрим их назначение (вначале описываются параметры для
первой команды, затем для второй):
GL_SPOT_EXPONENT параметр param должен содержать целое или
вещественное число от 0 до 128, задающее распределение интенсивности света. Этот
параметр описывает уровень сфокусированности источника света.
Значение по умолчанию: 0 (рассеянный свет).
GL_SPOT_CUTOFF параметр param должен содержать целое или вещественное
число между 0 и 90 или равное 180, которое определяет максимальный угол разброса
света. Значение этого параметра есть половина угла в вершине конусовидного
светового потока, создаваемого источником.
Значение по умолчанию: 180 (рассеянный свет).
GL_AMBIENT параметр params должен содержать четыре целых или
вещественных значения цветов RGBA, которые определяют цвет фонового
освещения.
Значение по умолчанию: (0.0, 0.0, 0.0, 1.0).
GL_DIFFUSE параметр params должен содержать четыре целых или
вещественных значения цветов RGBA, которые определяют цвет диффузного
освещения.
Значение по умолчанию: (1.0, 1.0, 1.0, 1.0)для LIGHT0 и (0.0, 0.0, 0.0, 1.0)
для остальных.
GL_SPECULAR параметр params должен содержать четыре целых или
вещественных значения цветов RGBA, которые определяют цвет зеркального
отражения.
Значение по умолчанию: (1.0, 1.0, 1.0, 1.0)для LIGHT0 и (0.0, 0.0, 0.0, 1.0)
для остальных.
GL_POSITION параметр params должен содержать четыре целых или
вещественных, которые определяют положение источника света. Если значение
компоненты w равно 0.0, то источник считается бесконечно удаленным и при расчете
освещенности учитывается только направление на точку (x,y,z), в противном случае
считается, что источник расположен в точке (x,y,z,w).
Значение по умолчанию: (0.0, 0.0, 1.0, 0.0).
GL_SPOT_DIRECTION параметр params должен содержать четыре целых или
вещественных числа, которые определяют направление света.
Значение по умолчанию: (0.0, 0.0, -1.0, 1.0).
При изменении положения источника света следует учитывать следующие факты:
если положение задается командой glLight..() перед определением ориентации
взгляда (командой glLookAt() ), то будет считаться, что источник находится в
точке наблюдения. Если положение устанавливается между заданием ориентации и
преобразованиями видовой матрицы, то оно фиксируется и не зависит от видовых
преобразований. В последнем случае, когда положение задано после ориентации и
видовой матрицы, его положение можно менять, устанавливая как новую ориентацию
наблюдателя, так и меняя видовую матрицу.
Для использования освещения сначала надо установить соответствующий режим
вызовом команды glEnable (GL_LIGHTNING), а затем включить нужный источник
командой glEnable(GL_LIGHTn).
Модель освещения
В OpenGL используется модель освещения Фонга, в соответствии с которой цвет
точки определяется несколькими факторами: свойствами материала и текстуры,
величиной нормали в этой точке, а также положением источника света и
наблюдателя. Для корректного расчета освещенности в точке надо использовать
единичные нормали, однако команды типа glScale..(), могут изменять длину
нормалей. Чтобы это учитывать, используется уже упоминавшийся режим нормализации
нормалей, который включается вызовом команды glEnable(GL_NORMALIZE).
Для задания глобальных параметров освещения используются команды
- void glLightModel[i f](GLenum pname, GLenum param)
- void glLightModel[i f]v(GLenum pname, const GLtype *params)
Аргумент pname определяет, какой параметр модели освещения будет
настраиваться и может принимать следующие значения:
GL_LIGHT_MODEL_LOCAL_VIEWER параметр param должен быть булевским и
задает положение наблюдателя. Если он равен FALSE, то направление обзора
считается параллельным оси –z, вне зависимости от положения в видовыx
координатах. Если же он равен TRUE, то наблюдатель находится в начале видовой
системы координат. Это может улучшить качество освещения, но усложняет его
расчет.
Значение по умолчанию: FALSE.
GL_LIGHT_MODEL_TWO_SIDE параметр param должен быть булевским и
управляет режимом расчета освещенности как для лицевых, так и для обратных
граней. Если он равен FALSE, то освещенность рассчитывается только для лицевых
граней. Если же он равен TRUE, расчет проводится и для обратных граней. Значение
по умолчанию: FALSE .
GL_LIGHT_MODEL_AMBIENT параметр params должен содержать четыре целых
или вещественных числа, которые определяют цвет фонового освещения даже в случае
отсутствия определенных источников света.
Значение по умолчанию:(0.2, 0.2, 0.2,1.0).