ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.06.2020
Просмотров: 1709
Скачиваний: 4
46
параметры
,
описывающее
положение
в
пространстве
,
преобразуются
текущей
модельно
-
видовой
матрицей
в
момент
формирования
объекта
,
т
.
е
.
в
момент
вызова
соответствующих
команд
OpenGL.
Таким
образом
,
формируя
источник
света
одновременно
с
объектом
сцены
или
камерой
,
его
можно
привязать
к
этому
объекту
.
Или
,
наоборот
,
сформировать
стационарный
источник
света
,
который
будет
оставаться
на
месте
,
пока
другие
объекты
перемещаются
.
Общее
правило
такое
:
Если
положение
источника
света
задается
командой
glLight*()
перед
определением
положения
виртуальной
камеры
(
например
,
командой
glLookAt()
),
то
будет
считаться
,
что
координаты
(0,0,0)
источника
находится
в
точке
наблюдения
и
,
следовательно
,
положение
источника
света
определяется
относительно
положения
наблюдателя
.
Если
положение
устанавливается
между
определением
положения
камеры
и
преобразованиями
модельно
-
видовой
матрицы
объекта
,
то
оно
фиксируется
,
т
.
е
.
в
этом
случае
положение
источника
света
задается
в
мировых
координатах
.
Для
использования
освещения
сначала
надо
установить
соответствующий
режим
вызовом
команды
glEnable(GL_LIGHTNING)
,
а
затем
включить
нужный
источник
командой
glEnable(GL_LIGHTi)
.
Еще
раз
обратим
внимание
на
то
,
что
при
выключенном
освещении
цвет
вершины
равен
текущему
цвету
,
который
задается
командами
glColor*()
.
При
включенном
освещении
цвет
вершины
вычисляется
исходя
из
информации
о
материале
,
нормалях
и
источниках
света
.
При
выключении
освещения
визуализация
происходит
быстрее
,
однако
в
таком
случае
приложение
должно
само
рассчитывать
цвета
вершин
.
Текст
программы
,
демонстрирующей
основные
принципы
определения
материалов
и
источников
света
,
приведен
в
приложении
D.2
4.4.
Создание
эффекта
тумана
В
завершение
рассмотрим
одну
интересную
и
часто
используемую
возможность
OpenGL –
создание
эффекта
тумана
.
Легкое
затуманивание
сцены
создает
реалистичный
эффект
,
а
частенько
может
47
и
скрыть
некоторые
артефакты
,
которые
появляются
,
когда
в
сцене
присутствуют
отдаленные
объекты
.
Туман
в
OpenGL
реализуется
путем
изменения
цвета
объектов
в
сцене
в
зависимости
от
их
глубины
,
т
.
е
.
расстояния
до
точки
наблюдения
.
Изменение
цвета
происходит
либо
для
вершин
примитивов
,
либо
для
каждого
пикселя
на
этапе
растеризации
в
зависимости
от
реализации
OpenGL.
Этим
процессом
можно
частично
управлять
–
см
.
раздел
6.4.
Для
включения
эффекта
затуманивания
необходимо
вызвать
команду
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
Интенсивность
вычисляется
по
формуле
f=exp(-d*z)
GL_EXP2
Интенсивность
вычисляется
по
формуле
f=exp(-(d*z)
2
)
GL_LINEAR
Интенсивность
вычисляется
по
формуле
f=e-z/e-s
где
z –
расстояние
от
вершины
,
в
которой
вычисляется
интенсивность
тумана
,
до
точки
наблюдения
.
Коэффициенты
d,e,s
задаются
с
помощью
следующих
значений
аргумента
pname
GL_FOG_DENSITY
param
определяет
коээфициент
d
GL_FOG_START
param
определяет
коэффициент
s
GL_FOG_END
param
определяет
коэффициент
e
Цвет
тумана
задается
с
помощью
аргумента
pname
,
равного
GL_FOG_COLOR
в
этом
случае
params
–
указатель
на
массив
из
4-
х
компонент
цвета
.
48
Приведем
пример
использования
этого
эффекта
:
GLfloat FogColor[4]={0.5,0.5,0.5,1};
glEnable(GL_FOG);
glFogi(GL_FOG_MODE,GL_LINEAR);
glFogf(GL_FOG_START,20.0);
glFogf(GL_FOG_END,100.0);
glFogfv(GL_FOG_COLOR,FogColor);
Контрольные
вопросы
1.
Поясните
разницу
между
локальными
и
бесконечно
удаленными
источниками
света
.
2.
Для
чего
служит
команда
glColorMaterial?
3.
Как
задать
положение
источника
света
таким
образом
,
чтобы
он
всегда
находился
в
точке
положения
наблюдателя
?
4.
Как
задать
фиксированное
положение
источника
света
?
Можно
ли
задавать
положение
источника
относительно
локальных
координат
объекта
?
5.
Как
задать
конусный
источник
света
?
6.
Если
в
сцене
включено
освещение
,
но
нет
источников
света
,
какой
цвет
будут
иметь
объекты
?
49
Глава
5
Текстурирование
Под
текстурой
будем
понимать
некоторое
изображение
,
которое
надо
определенным
образом
нанести
на
объект
,
например
,
для
придания
иллюзии
рельефности
поверхности
.
Наложение
текстуры
на
поверхность
объектов
сцены
повышает
ее
реалистичность
,
однако
при
этом
надо
учитывать
,
что
этот
процесс
требует
вычислительных
затрат
,
особенно
если
OpenGL
не
поддерживается
аппаратно
.
Для
работы
с
текстурой
следует
выполнить
следующую
последовательность
действий
:
1.
выбрать
изображение
и
преобразовать
его
к
нужному
формату
;
2.
передать
изображение
в
OpenGL;
3.
определить
,
как
текстура
будет
наноситься
на
объект
и
как
она
будет
с
ним
взаимодействовать
;
4.
связать
текстуру
с
объектом
.
5.1.
Подготовка
текстуры
Для
использования
текстуры
необходимо
сначала
загрузить
в
память
нужное
изображение
и
передать
его
OpenGL.
Считывание
графических
данных
из
файла
и
их
преобразование
можно
проводить
вручную
.
В
приложении
D
приведен
исходный
текст
функции
для
загрузки
изображения
из
файла
в
формате
BMP.
Можно
также
воспользоваться
функцией
,
входящей
в
состав
библиотеки
GLAUX (
для
ее
использования
надо
дополнительно
подключить
glaux.lib),
которая
сама
проводит
необходимые
операции
.
Это
функция
AUX_RGBImageRec*
auxDIBImageLoad
(const char *
file
)
50
где
file
–
название
файла
с
расширением
*.bmp
или
*.dib.
Функция
возвращает
указатель
на
область
памяти
,
где
хранятся
преобразованные
данные
.
При
создании
образа
текстуры
в
памяти
следует
учитывать
следующие
требования
:
Во
-
первых
,
размеры
текстуры
,
как
по
горизонтали
,
так
и
по
вертикали
должны
представлять
собой
степени
двойки
.
Это
требование
накладывается
для
компактного
размещения
текстуры
в
текстурной
памяти
и
способствует
ее
эффективному
использованию
.
Работать
только
с
такими
текстурами
конечно
неудобно
,
поэтому
после
загрузки
их
надо
преобразовать
.
Изменение
размеров
текстуры
можно
провести
с
помощью
команды
void
gluScaleImage
(GLenum
format
, GLint
widthin
,
GL
heightin
, GLenum
typein
,
const void *
datain
,
GLint
widthout
,
GLint
heightout
, GLenum
typeout
,
void *
dataout
)
В
качестве
значения
параметра
format
обычно
используется
значение
GL_RGB
или
GL_RGBA
,
определяющее
формат
хранения
информации
.
Параметры
widthin
,
heightin
,
widhtout
,
heightout
определяют
размеры
входного
и
выходного
изображений
,
а
с
помощью
typein
и
typeout
задается
тип
элементов
массивов
,
расположенных
по
адресам
datain
и
dataout
.
Как
и
обычно
,
это
может
быть
тип
GL_UNSIGNED_BYTE, GL_SHORT, GL_INT
и
так
далее
.
Результат
своей
работы
функция
заносит
в
область
памяти
,
на
которую
указывает
параметр
dataout
.
Во
-
вторых
,
надо
предусмотреть
случай
,
когда
объект
после
растеризации
оказывается
по
размерам
значительно
меньше
наносимой
на
него
текстуры
.
Чем
меньше
объект
,
тем
меньше
должна
быть
наносимая
на
него
текстура
и
поэтому
вводится
понятие
уровней
детализации
текстуры
. (mipmap)
Каждый
уровень
детализации
задает
некоторое
изображение
,
которое
является
,
как
правило
,
уменьшенной
в
два
раза
копией
оригинала
.
Такой
подход
позволяет
улучшить
качество
нанесения
текстуры
на
объект
.
Например
,
для
изображения
размером
2
m
x2
n
можно
построить
max(m,n)+1
уменьшенных
изображений
,
соответствующих
различным
уровням
детализации
.