Для создания реалистических изображений необходимо определить как
свойства самого объекта, так и свойства среды, в которой он
находится. Первая группа свойств включает в себя параметры материла,
из которого сделан объект, способы нанесения текстуры на его
поверхность, степень прозрачности объекта. Ко второй группе можно
отнести количество и свойства источников света, уровень прозрачности
среды. Все эти свойства можно задавать, используя соответствующие
команды 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).
|