Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
Скачать 0.66 Mb.
|
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. 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). Метод вычисления интенсивности тумана в вершине можно определить с помощью команд |