Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (1124366), страница 7
Текст из файла (страница 7)
66
Глава 5. Материалы и освещение
включается вызовом команды glEnable (GL_NORMALEZE)
Для задания глобальных параметров освещения используются команды
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 должен быть булевым и задает положение наблюдателя. Если он равен GL_FALSE, то направление обзора считается параллельным оси — z вне зависимости от положения в видовых координатах. Если же он равен GL_TRUE, то наблюдатель находится в начале видовой системы координат. Это может улучшить качество освещения, но усложняет его расчет.
Значение по умолчанию: GL_FALSE.
GL_LIGHT_MODEL_TWO_SIDE — параметр param должен быть булевым и управляет режимом расчета освещенности как для лицевых, так и для обратных граней. Если он равен GL_FALSE, то освещенность рассчитывается только для лицевых граней. Если же он равен GL_TRUE, расчет проводится и для обратных граней.
Значение по умолчанию: GL_FALSE.
GL_LIGHT_MODE_AMBIENT —параметр params должен содержать четыре целых или вещественных числа, которые определяют цвет фонового освещения даже в случае отсутствия определенных источников света.
Значение по умолчанию: (0.2, 0.2, 0.2,1.0).
5.2. Спецификация материалов
67
5.2. Спецификация материалов
Для задания параметров текущего материала используются команды
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.
68
Глава 5. Материалы и освещение
GL EMISSION — параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют интенсивность излучаемого света материала.
Значение по умолчанию: (0.0, 0.0, 0.0,1.0).
GL_ AMBIENT_ ANDDIFFUSE - эквивалентно
двум вызовам команды glMaterialQ со значением pname GL_AMBIENT и GL_DIFFUSE и одинаковыми значениями params.
Из этого следует, что вызов команды glMaterial [ i f]() возможен только для установки степени зеркального отражения материала (shininess). Команда glMaterial [i f]v() используется для задания остальных параметров.
Параметр face определяет тип граней, для которых задается этот материал и может принимать значения GL_FRONT, GL_BACK или GL_FRONT_AND_BACK.
Если в сцене материалы объектов различаются лишь одним параметром, рекомендуется сначала установить нужный режим, вызвав glEnable() с параметром GL_COLOR_MATERIAL, а затем использовать команду
void glColorMaterial (GLenum face , GLenum pname)
где параметр face имеет аналогичный смысл, а параметр pname может принимать все перечисленные значения. После этого значения выбранного с помощью pname свойства материала для конкретного объекта (или вершины) устанавливаются вызовом команды glColor, что позволяет избежать вызовов более ресурсоемкой команды glMaterial и повышает эффективность программы. Другие методы оптимизации приведены в главе 9. Пример определения свойств материала:
float mat_dif[] = {0.8 ,0.8 ,0.8}; float mat_amb[] = {0.2, 0.2, 0.2}; float mat_spec[] = {0.6, 0.6, 0.6};
5.3. Описание источников света
69
float shininess = 0.7 * 128;
glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT,
mat_amb); glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE,
mat_dif); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR,
mat_spec); g 1M a t e r i a 1 f (GL_FR0NT, GL_SHININESS,
shininess);
5.3. Описание источников света
Определение свойств материала объекта имеет смысл, только если в сцене есть источники света. Иначе все объекты будут черными (или, строго говоря, иметь цвет, равный рассеянному цвету материала, умноженному на интенсивность глобального фонового освещения, см. команду glLightModel). Добавить в сцену источник света можно с помощью команд
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, которая обычно не превосходит восьми.
Параметры pname и params имеют смысл, аналогичный команде glMaterial. Рассмотрим значения параметра pname:
GL_SPOT_EXPONENT —параметр param должен содержать целое или вещественное число от 0 до 128, задающее
70
Глава 5. Материалы и освещение
распределение интенсивности света. Этот параметр описывает уровень сфокусированности источника света.
Значение по умолчанию: 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) для GL_LIGHT0 и (0.0,0.0,0.0,1.0) для остальных.
GL SPECULAR — параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют цвет зеркального отражения.
Значение по умолчанию: (1.0,1.0,1.0,1.0) для GL_LIGHT0 и (0.0,0.0,0.0,1.0) для остальных.
GL POSITION —параметр params должен содержать четыре целых или вещественных числа, которые определяют положение источника света. Если значение компоненты w равно 0.0, то источник считается бесконечно удаленным и при расчете освещенности учитывается только направление на точку (х,у, z), в противном случае считается, что источник расположен в точке (х, у, z,w). В первом случае ослабления
5.3. Описание источников света
71
света при удалении от источника не происходит, т.е. источник считается бесконечно удаленным.
Значение по умолчанию: (0.0, 0.0,1.0, 0.0).
GL_SPOT_DIRECTION —параметр params должен хранить четыре целых или вещественных числа, которые определяют направление света.
Значение по умолчанию: (0.0, 0.0, —1.0,1.0).
Эта характеристика источника имеет смысл, если значение GL_SPOT_CUTOFF отлично от 180 (которое, кстати, задано по умолчанию).
GLCONSTANTATTENUATION ,
GLLINEARATTENUATION ,
GL_QUADRATIC_ATTENUATION -параметр params задает значение одного из трех коэффициентов, определяющих ослабление интенсивности света при удалении от источника. Допускаются только неотрицательные значения. Если источник не является направленным (см. GL_POSITION), то ослабление обратно пропорционально сумме:
attconstant + attlinear * d + attquadratic * d2
где d — расстояние между источником света и осве
щаемой им вершиной; attconstant, attlinear и
attquadratic равны параметрам, заданным с по
мощью констант GL_CONSTANT_ ATTENUATION,
GL_LINEAR_ATTENUATION и
GL_QUADRATIC_ATTENUATION соответственно. По
умолчанию эти параметры задаются тройкой (1,0,0), и
фактически ослабления не происходит.
72
Глава 5. Материалы и освещение
При изменении положения источника света следует учитывать следующий факт: в OpenGL источники света являются объектами, во многом такими же, как многоугольники и точки. На них распространяется основное правило обработки координат в OpenGL — параметры, описывающее положение в пространстве, преобразуются текущей модельно-видовой матрицей в момент формирования объекта, т.е. в момент вызова соответствующих команд OpenGL. Таким образом, формируя источник света одновременно с объектом сцены или камерой, его можно привязать к этому объекту. Или, наоборот, сформировать стационарный источник света, который будет оставаться на месте, пока другие объекты перемещаются.
Общее правило такое: если положение источника света задается командой glLight перед определением положения виртуальной камеры (например, командой glLookAtQ), то будет считаться, что координаты (0,0,0) источника находится в точке наблюдения и, следовательно, положение источника света определяется относительно положения наблюдателя.
Если положение устанавливается между определением положения камеры и преобразованиями модельно-видовой матрицы объекта, то оно фиксируется, т.е. в этом случае положение источника света задается в мировых координатах. Для использования освещения сначала надо установить соответствующий режим вызовом команды glEnable(GL_LIGHTING), а затем включить нужный источник командой glEnable(GL_LIGHTi).
Еще раз обратим внимание на то, что при выключенном освещении цвет вершины равен текущему цвету, который задается командами glColor. При включенном освещении цвет вершины вычисляется исходя из информации о материале, нормалях и источниках света.
При выключении освещения визуализация происходит быстрее, однако в таком случае приложение должно само рассчитывать цвета вершин.
5.4- Создание эффекта тумана
73
Текст программы, демонстрирующей основные принципы определения материалов и источников света, приведен в приложении Б.
5.4. Создание эффекта тумана
В завершение рассмотрим одну интересную и часто используемую возможность OpenGL — создание эффекта тумана. Легкое затуманивание сцены создает реалистичный эффект, а иногда может и скрыть некоторые артефакты, которые появляются, когда в сцене присутствуют отдаленные объекты.
Туман в OpenGL реализуется путем изменения цвета объектов в сцене в зависимости от их глубины, т.е. расстояния до точки наблюдения. Изменение цвета происходит либо для вершин примитивов, либо для каждого пикселя на этапе растеризации в зависимости от реализации OpenGL. Этим процессом можно частично управлять — см. раздел 7.
Для включения эффекта затуманивания необходимо вызвать команду glEnable(GL_FOG).
Метод вычисления интенсивности тумана в вершине можно определить с помощью команд
void glFog[if] (enum pname, T param) void glFog[if]v (enum pname, T params)
Аргумент pname может принимать следующие значения:
GL FOG MODE — аргумент param определяет формулу, по которой будет вычисляться интенсивность тумана в точке.
В этом случае param может принимать следующие значения: GL_EXP —интенсивность задается формулой / = e^~d*z'; GL_EXP2 —интенсивность задается формулой / = е-^*2^ ;
74
Глава 5. Материалы и освещение