ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.06.2020
Просмотров: 1712
Скачиваний: 4
56
void
glTexGen[i f d]v
(GLenum
coord
, GLenum
pname
,
const GLtype *
params
)
Параметр
coord
определяет
,
для
какой
координаты
задается
формула
,
и
может
принимать
значение
GL_S,GL_T
;
pname
может
быть
равен
одному
из
следующих
значений
:
GL_TEXTURE_GEN_MODE
определяет
функцию
для
наложения
текстуры
.
В
этом
случае
аргумент
param
принимает
значения
:
GL_OBJECT_LINEAR
значение
соответствующей
текстурной
координаты
определяется
расстоянием
до
плоскости
,
задаваемой
с
помощью
значения
pname
GL_OBJECT_PLANE
(
см
.
ниже
).
Формула
выглядит
следующим
образом
:
g=x*xp+y*yp+z*zp+w*wp,
где
g–
соответвующая
текстурная
координата
(s
или
p), x, y, z, w –
координаты
соответствующей
точки
. xp, yp, zp, wp –
коэффициенты
уравнения
плоскости
.
В
формуле
используются
координаты
объекта
.
GL_EYE_LINEAR
аналогично
предыдущему
значению
,
только
в
формуле
используются
видовые
координаты
.
Т
.
е
.
координаты
текстуры
объекта
в
этом
случае
зависят
от
положения
этого
объекта
.
GL_SPHERE_MAP
позволяет
эмулировать
отражение
от
поверхности
объекта
.
Текстура
как
бы
"
оборачивается
"
вокруг
объекта
.
Для
данного
метода
используются
видовые
координаты
и
необходимо
задание
нормалей
.
GL_OBJECT_PLANE
позволяет
задать
плоскость
,
расстояние
до
которой
будет
использоваться
при
генерации
координат
,
если
установлен
режим
GL_OBJECT_LINEAR
.
В
этом
случае
параметр
params
является
указателем
на
массив
из
четырех
коэффициентов
уравнения
плоскости
.
57
GL_EYE_PLANE
аналогично
предыдущему
значению
.
Позволяет
задать
плоскость
для
режима
GL_EYE_LINEAR
Для
установки
автоматического
режима
задания
текстурных
координат
необходимо
вызвать
команду
glEnable
с
параметром
GL_TEXTURE_GEN_S
или
GL_TEXTURE_GEN_P
.
Программа
,
использующая
наложение
текстуры
и
анимацию
,
приведена
в
приложении
D.3
Контрольные
вопросы
1.
Что
такое
текстура
и
для
чего
используются
текстуры
?
2.
Что
такое
текстурные
координаты
и
как
задать
их
для
объекта
?
3.
Какой
метод
взаимодействия
с
материалом
(GL_MODULATE,
GL_REPLACE)
нужно
использовать
,
если
текстура
представляет
собой
картину
,
висящую
на
стене
?
4.
Перечислите
известные
вам
методы
генерации
текстурных
координат
в
OpenGL.
5.
Для
чего
используются
уровни
детализации
текстуры
(mip-
mapping)?
6.
Что
такое
режимы
фильтрации
текстуры
и
как
задать
их
в
OpenGL?
58
Глава
6
Операции
с
пикселями
После
проведения
всех
операций
по
преобразованию
координат
вершин
,
вычисления
цвета
и
т
.
п
., OpenGL
переходит
к
этапу
растеризации
,
на
котором
происходит
растеризация
всех
примитивов
,
наложение
текстуры
,
наложение
эффекта
тумана
.
Для
каждого
примитива
результатом
этого
процесса
является
занимаемая
им
в
буфере
кадра
область
,
каждому
пикселю
этой
области
приписывается
цвет
и
значение
глубины
.
OpenGL
использует
эту
информацию
,
чтобы
записать
обновленные
данные
в
буфер
кадра
.
Для
этого
OpenGL
имеет
не
только
отдельный
конвейер
обработки
пикселей
,
но
и
несколько
дополнительных
буферов
различного
назначения
.
Это
позволяет
программисту
гибко
контролировать
процесс
визуализации
на
самом
низком
уровне
.
Графическая
библиотека
OpenGL
поддерживает
работу
со
следующими
буферами
:
несколько
буферов
цвета
буфер
глубины
буфер
-
накопитель
(
аккумулятор
)
буфер
маски
Группа
буферов
цвета
включает
буфер
кадра
,
но
таких
буферов
может
быть
несколько
.
При
использовании
двойной
буферизации
говорят
о
рабочем
(front)
и
фоновом
(back)
буферах
.
Как
правило
,
в
фоновом
буфере
программа
создает
изображение
,
которое
затем
разом
копируется
в
рабочий
буфер
.
На
экране
может
появиться
информация
только
из
буферов
цвета
.
Буфер
глубины
используется
для
удаления
невидимых
поверхностей
и
прямая
работа
с
ним
требуется
крайне
редко
.
Буфер
-
накопитель
можно
применять
для
различных
операций
.
Более
подробно
работа
с
ним
описана
в
разделе
6.2.
59
Буфер
маски
используется
для
формирования
пиксельных
масок
(
трафаретов
),
служащих
для
вырезания
из
общего
массива
тех
пикселей
,
которые
следует
вывести
на
экран
.
Буфер
маски
и
работа
с
ним
более
подробно
рассмотрены
в
разделах
6.3, 7.2
и
7.3.
6.1.
Смешивание
изображений
.
Прозрачность
Разнообразные
прозрачные
объекты
–
стекла
,
прозрачная
посуда
и
т
.
д
.
часто
встречаются
в
реальности
,
поэтому
важно
уметь
создавать
такие
объекты
в
интерактивной
графике
. OpenGL
предоставляет
программисту
механизм
работы
с
полупрозрачными
объектами
,
который
и
будет
кратко
описан
в
этом
разделе
.
Прозрачность
реализуется
с
помощью
специального
режима
смешения
цветов
(blending).
Алгоритм
смешения
комбинирует
цвета
так
называемых
входящих
пикселей
(
т
.
е
. «
кандидатов
»
на
помещение
в
буфер
кадра
)
с
цветами
соответствующих
пикселей
,
уже
хранящихся
в
буфере
.
Для
смешения
используется
четвертая
компонента
цвета
–
альфа
-
компонента
,
поэтому
этот
режим
называют
еще
альфа
-
смешиванием
.
Программа
может
управлять
интенсивностью
альфа
-
компоненты
точно
так
же
,
как
и
интенсивностью
основных
цветов
,
т
.
е
.
задавать
значение
интенсивности
для
каждого
пикселя
или
каждой
вершины
примитива
.
Режим
включается
с
помощью
команды
glEnable(GL_BLEND)
.
Определить
параметры
смешения
можно
с
помощью
команды
:
void
glBlendFunc
(enum
src
,enum
dst
)
Параметр
src
определяет
,
как
получить
коэффициент
k
1
исходного
цвета
пикселя
, a
dst
задает
способ
получения
коэффициента
k
2
для
цвета
в
буфере
кадра
.
Для
получения
результирующего
цвета
используется
следующая
формула
: res=
с
src
*k
1
+c
dst
*k
2
,
где
с
src
–
цвет
исходного
пикселя
, c
dst
–
цвет
пикселя
в
буфере
кадра
(res, k
1
, k
1
,
с
src,
c
dst
–
четырехкомпонентные
RGBA-
векторы
).
Приведем
наиболее
часто
используемые
значения
агрументов
src
и
ds
t.
GL_SRC_ALPHA
k=(A
s
,A
s
,A
s
,A
s
)
GL_SRC_ONE_MINUS_ALPHA
k=(1,1,1,1)-(A
s
,A
s
,A
s
,A
s
)
GL_DST_COLOR
k=(R
d
,G
d
,B
d
)
60
GL_ONE_MINUS_DST_COLOR
k
=
(1,1,1,1)- (R
d
,G
d
,B
d
,
А
d
)
GL_DST_ALPHA
k=(A
d
,A
d
,A
d
,A
d
)
GL_DST_ONE_MINUS_ALPHA
k=(1,1,1,1)-(A
d
,A
d
,A
d
,A
d
)
GL_SRC_COLOR
k=(R
s
,G
s
,B
s
)
GL_ONE_MINUS_SRC_COLOR
k
=
(1,1,1,1)- (R
s
,G
s
,B
s
,A
s
)
Пример
:
Предположим
,
мы
хотим
реализовать
вывод
прозрачных
объектов
.
Коэффициент
прозрачности
задается
альфа
-
компонентой
цвета
.
Пусть
1
–
непрозрачный
объект
; 0 –
абсолютно
прозрачный
,
т
.
е
.
невидимый
.
Для
реализации
служит
следующий
код
:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_SRC_ONE_MINUS_ALPHA);
Например
,
полупрозрачный
треугольник
можно
задать
следующим
образом
:
glColor3f(1.0, 0.0, 0.0, 0.5);
glBegin(GL_TRIANGLES);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
glVertex3f(1.0, 1.0, 0.0);
glEnd();
Если
в
сцене
есть
несколько
прозрачных
объектов
,
которые
могут
перекрывать
друг
друга
,
корректный
вывод
можно
гарантировать
только
в
случае
выполнения
следующих
условий
:
Все
прозрачные
объекты
выводятся
после
непрозрачных
.
При
выводе
объекты
с
прозрачностью
должны
быть
упорядочены
по
уменьшению
глубины
,
т
.
е
.
выводиться
,
начиная
с
наиболее
отдаленных
от
наблюдателя
.
В
OpenGL
команды
обрабатываются
в
порядке
их
поступления
,
поэтому
для
реализации
перечисленных
требований
достаточно
расставить
в
соответствующем
порядке
вызовы
команд
glVertex*(),
но
и
это
в
общем
случае
нетривиально
.