ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.06.2020
Просмотров: 1696
Скачиваний: 4
21
Команда
glClearColor
устанавливает
цвет
,
которым
будет
заполнен
буфер
кадра
.
Первые
три
параметра
команды
задают
R,G
и
B
компоненты
цвета
и
должны
принадлежать
отрезку
[0,1].
Четвертый
параметр
задает
так
называемую
альфа
компоненту
(
см
.
п
. 6.1).
Как
правило
,
он
равен
1.
По
умолчанию
цвет
–
черный
(0,0,0,1).
Команда
glClear
очищает
буферы
,
а
параметр
buf
определяет
комбинацию
констант
,
соответствующую
буферам
,
которые
нужно
очистить
(
см
.
главу
6).
Типичная
программа
вызывает
команду
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
для
очистки
буферов
цвета
и
глубины
.
Установка
положения
наблюдателя
и
преобразования
трехмерных
объектов
(
поворот
,
сдвиг
и
т
.
д
.)
контролируются
с
помощью
задания
матриц
преобразования
.
Преобразования
объектов
и
настройка
положения
виртуальной
камеры
описаны
в
главе
3.
Сейчас
сосредоточимся
на
том
,
как
передать
в
OpenGL
описания
объектов
,
находящихся
в
сцене
.
Каждый
объект
является
набором
примитивов
OpenGL.
2.2.
Вершины
и
примитивы
Вершина
является
атомарным
графическим
примитивом
OpenGL
и
определяет
точку
,
конец
отрезка
,
угол
многоугольника
и
т
.
д
.
Все
остальные
примитивы
формируются
с
помощью
задания
вершин
,
входящих
в
данный
примитив
.
Например
,
отрезок
определяется
двумя
вершинами
,
являющимися
концами
отрезка
.
С
каждой
вершиной
ассоциируются
ее
атрибуты
.
В
число
основных
атрибутов
входят
положение
вершины
в
пространстве
,
цвет
вершины
и
вектор
нормали
.
2.2.1.
Положение
вершины
в
пространстве
Положение
вершины
определяются
заданием
ее
координат
в
двух
-,
трех
-,
или
четырехмерном
пространстве
(
однородные
координаты
).
Это
реализуется
с
помощью
нескольких
вариантов
команды
glVertex*
:
void
glVertex[2 3 4][s i f d]
(type
coords
)
void
glVertex[2 3 4][s i f d]v
(type *
coords
)
22
Каждая
команда
задает
четыре
координаты
вершины
: x, y, z, w.
Команда
glVertex2
*
получает
значения
x
и
y.
Координата
z
в
таком
случае
устанавливается
по
умолчанию
равной
0,
координата
w –
равной
1.
Vertex3*
получает
координаты
x, y, z
и
заносит
в
координату
w
значение
1.
Vertex4*
позволяет
задать
все
четыре
координаты
.
Для
ассоциации
с
вершинами
цветов
,
нормалей
и
текстурных
координат
используются
текущие
значения
соответствующих
данных
,
что
отвечает
организации
OpenGL
как
конечного
автомата
.
Эти
значения
могут
быть
изменены
в
любой
момент
с
помощью
вызова
соответствующих
команд
.
2.2.2.
Цвет
вершины
Для
задания
текущего
цвета
вершины
используются
команды
:
void
glColor[3 4][b s i f]
(GLtype
components
)
void
glColor[3 4][b s i f]v
(GLtype
components
)
Первые
три
параметра
задают
R, G, B
компоненты
цвета
,
а
последний
параметр
определяет
коэффициент
непрозрачности
(
так
называемая
альфа
-
компонента
).
Если
в
названии
команды
указан
тип
‘f’
(float),
то
значения
всех
параметров
должны
принадлежать
отрезку
[0,1],
при
этом
по
умолчанию
значение
альфа
-
компоненты
устанавливается
равным
1.0,
что
соответствует
полной
непрозрачности
.
Тип
‘ub’
(unsigned byte)
подразумевает
,
что
значения
должны
лежать
в
отрезке
[0,255].
Вершинам
можно
назначать
различные
цвета
,
и
,
если
включен
соответствующий
режим
,
то
будет
проводиться
линейная
интерполяция
цветов
по
поверхности
примитива
.
Для
управления
режимом
интерполяции
используется
команда
void
glShadeModel
(GLenum
mode
)
вызов
которой
с
параметром
GL_SMOOTH
включает
интерполяцию
(
установка
по
умолчанию
),
а
с
GL_FLAT
–
отключает
.
2.2.3.
Нормаль
Определить
нормаль
в
вершине
можно
,
используя
команды
void
glNormal3[b s i f d]
(type
coords
)
void
glNormal3[b s i f d]v
(type
coords
)
23
Для
правильного
расчета
освещения
необходимо
,
чтобы
вектор
нормали
имел
единичную
длину
.
Командой
glEnable(GL_NORMALIZE)
м
ожно
включить
специальный
режим
,
при
котором
задаваемые
нормали
будут
нормироваться
автоматически
.
Режим
автоматической
нормализации
должен
быть
включен
,
если
приложение
использует
модельные
преобразования
растяжения
/
сжатия
,
так
как
в
этом
случае
длина
нормалей
изменяется
при
умножении
на
модельно
-
видовую
матрицу
.
Однако
применение
этого
режима
уменьшает
скорость
работы
механизма
визуализации
OpenGL,
так
как
нормализация
векторов
имеет
заметную
вычислительную
сложность
(
взятие
квадратного
корня
и
т
.
п
.).
Поэтому
лучше
сразу
задавать
единичные
нормали
.
Отметим
,
что
команды
void
glEnable
(GLenum
mode
)
void
glDisable
(GLenum
mode
)
производят
включение
и
отключение
того
или
иного
режима
работы
конвейера
OpenGL.
Эти
команды
применяются
достаточно
часто
,
и
их
возможные
параметры
будут
рассматриваться
в
каждом
конкретном
случае
.
2.3.
Операторные
скобки
glBegin / glEnd
Мы
рассмотрели
задание
атрибутов
одной
вершины
.
Однако
,
чтобы
задать
атрибуты
графического
примитива
,
одних
координат
вершин
недостаточно
.
Эти
вершины
надо
объединить
в
одно
целое
,
определив
необходимые
свойства
.
Для
этого
в
OpenGL
используются
так
называемые
операторные
скобки
,
являющиеся
вызовами
специальных
команд
OpenGL
Определение
примитива
или
последовательности
примитивов
происходит
между
вызовами
команд
void
glBegin
(GLenum
mode
);
void
glEnd
(void);
Параметр
mode
определяет
тип
примитива
,
который
задается
внутри
и
может
принимать
следующие
значения
:
24
GL_POINTS
каждая
вершина
задает
координаты
некоторой
точки
.
GL_LINES
каждая
отдельная
пара
вершин
определяет
отрезок
;
если
задано
нечетное
число
вершин
,
то
последняя
вершина
игнорируется
.
GL_LINE_STRIP
каждая
следующая
вершина
задает
отрезок
вместе
с
предыдущей
.
GL_LINE_LOOP
отличие
от
предыдущего
примитива
только
в
том
,
что
последний
отрезок
определяется
последней
и
первой
вершиной
,
образуя
замкнутую
ломаную
.
GL_TRIANGLES
каждые
отдельные
три
вершины
определяют
треугольник
;
если
задано
не
кратное
трем
число
вершин
,
то
последние
вершины
игнорируются
.
GL_TRIANGLE_STRIP
каждая
следующая
вершина
задает
треугольник
вместе
с
двумя
предыдущими
.
GL_TRIANGLE_FAN
треугольники
задаются
первой
вершиной
и
каждой
следующей
парой
вершин
(
пары
не
пересекаются
).
GL_QUADS
каждая
отдельная
четверка
вершин
определяет
четырехугольник
;
если
задано
не
кратное
четырем
число
вершин
,
то
последние
вершины
игнорируются
.
GL_QUAD_STRIP
четырехугольник
с
номером
n
определяется
вершинами
с
номерами
2n-1, 2n, 2n+2, 2n+1.
GL_POLYGON
последовательно
задаются
вершины
выпуклого
многоугольника
.
Например
,
чтобы
нарисовать
треугольник
с
разными
цветами
в
вершинах
,
достаточно
написать
:
GLfloat BlueCol[3] = {0,0,1};
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0); /*
красный
*/
glVertex3f(0.0, 0.0, 0.0);
glColor3ub(0,255,0); /*
зеленый
*/
25
glVertex3f(1.0, 0.0, 0.0);
glColor3fv(BlueCol); /*
синий
*/
glVertex3f(1.0, 1.0, 0.0);
glEnd();
Рис
. 3.
Примитивы
OpenGL
1
0
2 4
3
GL_POINTS
1
0
2
4
3
5
GL_LINES
1
0
2 4
3
5
GL_LINE_STRIP
1
0
2
4
3
GL_LINE_LOOP
1
0
2
3
4
5
GL_POLYGON
1
0
2
4
3
5
6
7
GL_QUADS
1
0
2
3
4
5
6
7
GL_QUAD_STRIP
1
0
2
3
4
5
6
7
8
GL_TRIANGLES
1
0
2
3
4
5
GL_TRIANGLE_STRIP
1
0
2
3
4
5
GL_TRIANGLE_FAN