Главная страница

3 С. А. Васильев opengl компьютерная графика


Скачать 491.09 Kb.
Название3 С. А. Васильев opengl компьютерная графика
Дата23.03.2018
Размер491.09 Kb.
Формат файлаpdf
Имя файлаvasilev.pdf
ТипУчебное пособие
#39231
страница7 из 9
1   2   3   4   5   6   7   8   9
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 задает функцию сравнения значений альфа и может принимать следующие символьные константы:
Параметр
Тест завершается положительно в слу- чае
1   2   3   4   5   6   7   8   9


написать администратору сайта