3 С. А. Васильев opengl компьютерная графика
Скачать 491.09 Kb.
|
GL_SPHERE_MAP • Дана функция позволяет модели- ровать эффект зеркального отраже- ния от поверхности объекта. Для ее исполнения требуются видовые ко- ординаты и задание нормалей (см. MSDN) Включение автоматического режима задания текстурных координат осуществляется командой glEnable с параметром GL_TEXTURE_GEN_S или GL_TEXTURE_GEN_P. 13.2 Работа со светом OpenGL дает богатые возможности разработчику моделировать реалистическую графику сцен, где присутствует свет. Предусмотрен механизм задания световых характеристик материала объекта, пара- метров источников света и модели освещения. Рассмотрим эти возможности. 13.2.1 Задание свойств материала объекта В OpenGL свойства материалов задаются командами 44 void glMaterial[i f] ( GLenum face, GLenum pname, GLtype param) void glMaterial[i f]v ( GLenum face, GLenum pname, GLtype *params) Здесь параметр face определяет лицевую или обратную поверхность, свойства материала которой необходимо изменить, и может принимать аргументы GL_FRONT (лицевые), GL_BACK (обратные) или GL_FRONT_AND_BACK (обе стороны). Аргумент pname определяет изменяемые параметры материала и может принимать следующие па- раметры. Параметр Описание GL_AMBIENT • ИЗМЕНЯЕТ ЦВЕТ РАССЕ- ЯННОГО ОТРАЖЕНИЯ МА- ТЕРИАЛА. ПАРАМЕТР PA- RAM ДОЛЖЕН СОДЕРЖАТЬ ЧЕТЫРЕ ЦЕЛЫХ ИЛИ ВЕ- ЩЕСТВЕННЫХ ЗНАЧЕНИЯ ЦВЕТА РАССЕЯННОГО ОТ- РАЖЕНИЯ (RGBA) МАТЕ- РИАЛА. ПО УМОЛЧАНИЮ ЗНАЧЕНИЕ ЦВЕТА РАССЕ- ЯННОГО ОТРАЖЕНИЯ РАВНО (0.2, 0.2, 0.2, 1.0) GL_DIFFUSE • Изменяет цвет диффузного от- ражения материала. Параметр param должен содержать четыре целых или вещественных значе- ния цвета диффузного отражения (RGBA) материала. По умолча- нию значение цвета диффузного отражения равно (0.8, 0.8, 0.8, 1.0) GL_SPECULAR • Изменяет цвет зеркального от- ражения материала. Параметр param должен содержать четыре целых или вещественных значе- ния цвета зеркального отражения (RGBA) материала. По умолча- нию значение цвета зеркального отражения равно (0.0, 0.0, 0.0, 1.0) GL_SHININESS • Изменяет пространственное распределение зеркального отра- жения материала. Параметр param должен содержать одно целое или вещественное значение из диапа- зона ( 0, 128). По умолчанию сте- пень зеркального отражения ра- вен 0 45 Параметр Описание GL_EMISSION • Изменяет интенсивность излу- чаемого света материала. Пара- метр param должен содержать четыре целых или вещественных значения интенсивности излучае- мого света (RGBA) материала. По умолчанию значение интенсивно- сти излучаемого света равно (0.0, 0.0, 0.0, 1.0) GL_AMBIENT_AND_DIF FUSE • Эквивалентно двум вызовам команды glMaterial*() со значе- нием pname GL_AMBIENT и GL_DIFFUSE и одинаковыми значениями params Изменять параметры материала можно и командой void glColorMaterial (GLenum face, GLenum mode) Здесь face принимает аналогичные значения, что и в команде glMaterial*(), а mode – GL_EMISSION, GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR и GL_AMBIENT_AND_DIFFUSE. По умолчанию используется GL_AMBIENT_AND_DIFFUSE.Параметры материала поверхности, за- данные аргументами face и mode, принимают значения текущего цвета (предварительно разрешив эту команду, вызвав glEnable(GL_COLOR_MATERIAL)). В такой ситуации можно изменять параметры материала для каждой вершины, используя только команду glColor*, что более удобно в некоторых случаях. ПРИМЕР ЗАДАНИЯ ПАРАМЕТРОВ МАТЕРИАЛА: … float amb[] = {0.4, 0.3, 0.4}; // Цвет рассеянного отражения float dif[]={0.7,0.4,0.7}; // Цвет диффузного отражения float spec[] = {0.5, 0.5, 0.2}; // Цвет зеркального отражения float shininess = 90; // Степень зеркально отражения … // Установка свойств материала для лицевой поверхности glMaterialfv (GL_FRONT,GL_AMBIENT, amb); // Для рассеянного света glMaterialfv (GL_FRONT,GL_DIFFUSE, dif); // Для диффузного отражения. glMaterialfv (GL_FRONT,GL_SPECULAR, spec); // Для зеркального отражения //Степень зеркального отражения glMaterialf (GL_FRONT,GL_SHININESS, shininess); … 13.2.2 Задание источников света При работе с источником света необходимо определить его и присвоить ему порядковый номер. Для этой цели существует команда void glLight[i f] ( GLenum light, GLenum pname, GLtype param) void glLight[i f]v ( GLenum light, GLenum pname, const GLtype *params) Аргумент light закрепляет номер за источником света. В качестве номера выступает символическое имя GL_LIGHTi, где i может принимать значение из диапазона 0 до GL_MAX_LIGHTS. OpenGL под- держивает восемь источников света одновременно. Для невекторной формы команды аргумент pname является символьной константой, определяющей устанавливаемый параметр: Параметр Описание 46 Параметр Описание GL_SPOT_EXPONENT • ПАРАМЕТР PARAM ДОЛЖЕН СОДЕРЖАТЬ ЦЕЛОЕ ИЛИ ВЕЩЕСТ- ВЕННОЕ ЗНАЧЕНИЕ ИЗ ДИАПАЗОНА [0, 128], КО- ТОРОЕ ЗАДАЕТ РАСПРЕ- ДЕЛЕНИЕ ИНТЕНСИВ- НОСТИ ИЗЛУЧЕНИЯ СВЕТА. ЧЕМ БОЛЬШЕ ЭТО ЗНАЧЕНИЕ, ТЕМ БОЛЕЕ СФОКУСИРОВАН ИСТОЧНИК СВЕТА. ПО УМОЛЧАНИЮ ДАННЫЙ ПАРАМЕТР УСТАНОВ- ЛЕН В ЗНАЧЕНИЕ 0, ЧТО СООТВЕТСТВУЕТ РАС- СЕЯННОМУ ОСВЕЩЕ- НИЮ GL_SPOT_CUTOFF • Параметр param должен содержать целое или вещест- венное значение из диапазона [0, 90] или 180, которое задает угол максимальный угол раз- броса излучения света. Чем больше это значение, тем больше пятно освещения бу- дет на поверхности объекта. По умолчанию данный пара- метр установлен в значение 180, что соответствует рассе- янному освещению GL_CONSTANT_ATTENUA TION, GL_LINEAR_ATTENUATIO N, GL_QUADRATIC_ATTENU ATION • Параметр param должен содержать целое или вещест- венное значение из диапазона [0, 90] или 180, которое задает один из трех факторов ослаб- ления освещения – постоян- ного, линейного или квадра- тичного. Можно использовать только положительные значе- ния. Интенсивность источни- ка света ослабевает в согласно формуле 2 1 d k d k k q l c + + , где k c , k l и k q – соответст- вую- щие коэффициенты ослабле- ния, заданные соответствую- щими параметрами констант, 47 Параметр Описание d – расстояние Продолжение табл. Параметр Описание GL_CONSTANT_ATTENUA TION, GL_LINEAR_ATTENUATIO N, GL_QUADRATIC_ATTENU ATION между источником света и освещаемой им вершиной объекта. По умолчанию фак- торы ослабления имеют зна- чения (1,0,0) Для векторной формы команды glLight[I f]v добавляются дополнительные значения параметра pname: Параметр Описание GL_AMBIENT • ОПРЕДЕЛЯЕТ ИНТЕНСИВ- НОСТЬ (ЦВЕТ) ФОНОВОГО ОС- ВЕЩЕНИЯ ОТ ДАННОГО ИС- ТОЧНИКА СВЕТА. ПАРАМЕТР PARAMS ДОЛЖЕН СОДЕРЖАТЬ ЧЕТЫРЕ ЦЕЛЫХ ИЛИ ВЕЩЕСТ- ВЕННЫХ ЧИСЛА RGBA, КОТО- РЫЕ ОПРЕДЕЛЯЮТ ЗНАЧЕНИЕ ФОНОВОГО ОСВЕЩЕНИЯ. ПО УМОЛЧАНИЮ ЗНАЧЕНИЕ ФО- НОВОГО ОСВЕЩЕНИЯ РАВНО (0.0, 0.0, 0.0, 1.0) GL_DIFFUSE • Определяет интенсивность (цвет) диффузного освещения от данного ис- точника света. Параметр params дол- жен содержать четыре целых или веще- ственных числа RGBA, которые опре- деляют значение диффузного освеще- ния. По умолчанию значение диффуз- ного освещения от нулевого источника света равно (1.0, 1.0, 1.0, 1.0), а от ос- тальных (0.0, 0.0, 0.0, 1.0) GL_SPECULAR • Определяет интенсивность (цвет) зеркального отражения от данного ис- точника света. Параметр params дол- жен содержать четыре целых или ве- щественных числа RGBA, которые оп- ределяют значение зеркального отра- жения. По умолчанию значение зер- кальное отражение от нулевого источ- 48 Параметр Описание ника света равно (1.0, 1.0, 1.0, 1.0), я от остальных (0.0, 0.0, 0.0, 1.0) Продолжение табл. Параметр Описание GL_POSITION • Определяет положение источника света в мировых координатах. Пара- метр params должен содержать четы- ре целых или вещественных значе- ния, определяющих положение ис- точника света в однородных мировых координатах. Эта позиция преобразу- ется видовой матрицей и сохраняется в видовых координатах. Если компо- нент w положения равен 0.0, то свет рассматривается как направленный источник (расположенный в беско- нечности), а диффузное и зеркальное освещение рассчитываются в зави- симости от направления на источник света, но не от его действительного положения, и ослабление заблокиро- вано. В противном случае эти пара- метры рассчитываются на основе действительного расположения ис- точника в видовых координатах и ослабление разрешено. По умолча- нию источник располагается в точке (0, 0, 1 ,0), является направленным и световой поток параллелен оси z GL_SPOT_DIRECT ION • Определяет положение источника света в однородных мировых коор- динатах. Параметр params должен содержать четыре целых или вещест- венных значения, задающих направ- ление света в однородных мировых координатах, интенсивности излу- чаемого света (RGBA) материала. По умолчанию направление источника света задается значениями (0.0, 0.0, – 1.0, 1.0). Отработка этого параметра имеет смысл, если значение GL_SPOT_CUTOFF отличное от 180 После того как установлены параметры источников света, эти ис- точники можно включать в любое время. Предварительно требуется установить режим текущей освещенности вызовом команды glEnable(GL_LIGHTNING). Для включе- ния i-го источника света используются команды glEnable с аргументами GL_LIGHTi. Выключение осу- ществляется командой glDisable с аналогичным аргументом. РАССМОТРИМ ПРИМЕР ОСВЕЩЕНИЯ СФЕРЫ ОДНИМ ИСТОЧНИКОМ СВЕТА: … 49 // Задаем исходные значения параметров материала сферы GLfloat m_specular[]={1.0,1.0,1.0,1.0}; // Зеркальный цвет GLfloat m_shininess[]={40.0}; // и его пространственное распределение // Задаем исходные значения параметров источника света GLfloat Ambient[]={0.5,0.5,0.5,1.0}; // Фоновое освещение GLfloat Diffuse[]={1.0,1.0,1.0,1.0}; // Диффузное освещение GLfloat Specular[]={1.0,1.0,1.0,1.0}; // Зеркальное отражение GLfloat Position[]={1.0,1.0,1.0,1.0}; // Позиция света … // Процедура начальной установки GLvoid Initial(GLsizei w, GLsizei h) { Resize (w, h); glClearColor(0.0,0.0,0.0,0.0); // Устанавливаем параметры материала glMaterialfv(GL_FRONT,GL_SPECULAR,m_specular); glMaterialfv(GL_FRONT,GL_SHININESS,m_shininess); // Устанавливаем параметры источника света glLightfv(GL_LIGHT0,GL_POSITION, Position); glLightfv(GL_LIGHT0,GL_AMBIENT, Ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,Diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,Specular); // Устанавливаем параметры источника света glEnable(GL_LIGHTING); // Разрешение текущей освещенности glEnable(GL_LIGHT0); // Включение GL_LIGHT0 источник света glEnable(GL_DEPTH_TEST); // Включаем тест глубины } … GLvoid DrawPrim() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); quadratic=gluNewQuadric(); gluSphere (quadratic,1 ,40 ,40);// Рисуем сферу } 13.2.3 Задание модели освещения Для задания свойств модели освещения используются команды void glLightModel[i f]( GLenum pname, GLenum param) void glLightModel[i f]v ( GLenum pname, const GLtype *params) Аргумент pname определяет изменяемый параметр модели освещения и может принимать следую- щие значения в виде символьных констант (param – конкретное значение параметра). pname Значение GL_LIGHT_MODEL_LOCAL_VI EWER • ОПРЕДЕЛЯЕТ СПОСОБ ВЫЧИСЛЕ- НИЯ ЗЕРКАЛЬНОГО ОТРАЖЕНИЯ. ЕСЛИ PARAM = GL_FALSE, ТО 50 pname Значение СЧИТАЕТСЯ ЧТО НА- БЛЮДАТЕЛЬ РАСПО- ЛОЖЕН БЕСКОНЕЧНО ДАЛЕКО И НАПРАВ- ЛЕНИЕ ОБЗОРА ПА- РАЛЛЕЛЬНО ОСИ Z. ПРИ ЭТОМ ПОЛОЖЕ- НИЕ НАБЛЮДАТЕЛЯ НЕ ЗАВИСИТ ОТ РЕАЛЬНЫХ МИРО- ВЫХ КООРДИНАТ. В ПРОТИВНОМ СЛУ- ЧАЕ, КОГДА PARAM = GL_TRUE, СЧИТАЕТ- СЯ, ЧТО НАБЛЮДА- ТЕЛЬ РАСПОЛОЖЕН В НАЧАЛЕ ВИДОВОЙ СИСТЕМЫ КООРДИНАТ. ПО УМОЛЧАНИЮ PARAM = GL_TRUE GL_LIGHT_MODEL_TWO_S IDE • Определяет односто- роннее или двухстороннее освещение. Если param = GL_FALSE, то рассчитывается осве- щение только для лице- вых граней. В противном случае, ко- гда param = GL_TRUE, задается двухстороннее освещение. Для обратных граней необходи- мо задавать свои свойст- ва материала, нормали (про- ти- воположные нормалям лицевых граней). По умолчанию param = GL_FALSE GL_LIGHT_MODEL_AMBIE NT (только для векторной формы командыglLightModel*v) • Задает RGBA интен- сивность фонового осве- щения. По умолчанию цвет фона равен (0.2, 0.2, 0.2, 1.0) 13.3 Моделирование тумана Для придания большей реалистичности в визуализации 3D сцен в OpenGL часто используют эффект тумана. Туман в OpenGL реализуется путем изменения цвета объектов в сцене в зависимости от рас- стояния до точки наблюдения. Способ вычисления интенсивности тумана можно определить с помощью команд 51 void glFog[if] ( GLenum pname, GLtype param) void glFog[if]v ( GLenum pname, const GLtype *params) Аргумент pname может принимать следующие часто используемые значения: Параметр Описание GL_FOG_MODE • ОПРЕДЕЛЯЕТ ФОРМУЛУ ПО КОТОРОЙ БУДЕТ ВЫЧИСЛЯТЬСЯ ИНТЕНСИВНОСТЬ ТУМАНА В ТОЧКЕ. АРГУМЕНТ PARAM МО- ЖЕТ ПРИНИМАТЬ ЗНАЧЕНИЯ: GL_EXP – ДЛЯ ВЫЧИСЛЕНИЯ ИН- ТЕНСИВНОСТИ ПО ФОРМУЛЕ F = EXP(– D ⋅Z); GL_EXP2 – ДЛЯ ВЫЧИСЛЕНИЯ ИНТЕНСИВНОСТИ ПО ФОРМУЛЕ F = EXP((– D ⋅Z) 2 ); GL_LINEAR – ДЛЯ ВЫЧИСЛЕНИЯ ИНТЕНСИВНОСТИ ПО ФОРМУЛЕ F = E – Z / E – S, ГДЕ Z – РАССТОЯ- НИЕ ОТ ВЕРШИНЫ, В КОТОРОЙ ВЫЧИСЛЯЕТСЯ ИНТЕНСИВ- НОСТЬ ТУМАНА, ДО ТОЧКИ НА- БЛЮДЕНИЯ. КОЭФФИЦИЕНТЫ D, S, E ЗАДА- ЮТСЯ С ПОМОЩЬЮ СЛЕДУЮЩИХ ЗНАЧЕНИЙ АРГУ- МЕНТА PNAME: GL_FOG_DENSITY, GL_FOG_START И GL_FOG_END СООТВЕТСТВЕННО GL_FOG_DENSI TY • Плотность тумана (d)для GL_EXP и GL_EXP2. param определяет значение d. По умолчанию установлено значение (1.0) GL_FOG_START • Начальное расстояние (s) от точки наблюдения после которого начинает изменяться интенсивность тумана. param определяет значение s. По умолчанию установлено значение (0.0) Продолжение табл. Параметр Описание 52 Параметр Описание GL_FOG_END • Конечное расстояние (е) от точки наблюдения до которого изменяется ин- тенсивность тумана. param определяет значение e. По умолчанию установлено значение (1.0) GL_FOG_COLO R • Определяется цвет тумана. В этом случае params – указатель на массив из 4-х компонент цвета (RGBA). По умол- чанию установлено значение (0.0, 0.0, 0.0, 0.0) РАССМОТРИМ ПРИМЕР ИСПОЛЬЗОВАНИЯ ТУМАНА: … GLfloat FogColor[4]={0.6,0.6,0.6,1.0}; // Цвет тумана … glEnable(GL_FOG); // Включаем туман glFogi(GL_FOG_MODE,GL_LINEAR); // Линейное изменение интен-сивности glFogf(GL_FOG_START,2.0); // Начало тумана glFogf(GL_FOG_END,50.0); // Окончание тумана glFogfv(GL_FOG_COLOR,FogColor); // Устанавливаем цвет тумана … 13.4 Прозрачность Реалистическая графика предполагает использование эффекта прозрачности элементов наблюдае- мой сцены, когда через одни фрагменты сцены можно видеть другие. Для этого цели введено понятие альфа–канал в характеристике цвета точки (RGBA), который и указывает на степень ее "прозрачности". При альфа равном 1.0 фрагмент считается полностью непрозрачным, а при 0.0 – полностью прозрач- ным. Тест на прозрачность разрешается и запрещается командами glEnable и glDisable с параметром GL_ALPHA_TEST. Для управления тестом по альфа-каналу используется команда void glAlphaFunc(GLenum func,GLclampf ref), где параметр ref задает сравниваемое значение для альфа-параметра. Это значение находится в диапазо- не [0,1]. По умолчанию параметр ref равен 0. Параметр func задает функцию сравнения значений альфа и может принимать следующие символьные константы: Параметр Тест завершается положительно в слу- чае |