Файл: графическая библиотека opengl.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.06.2020

Просмотров: 1696

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 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

 


background image

 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


background image

 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

 

определяет

 

тип

 

примитива

который

 

задается

 

внутри

 

и

 

может

 

принимать

 

следующие

 

значения

 


background image

 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); /* 

зеленый

 */ 


background image

 25

glVertex3f(1.0, 0.0, 0.0);  
glColor3fv(BlueCol); /* 

синий

 */ 

glVertex3f(1.0, 1.0, 0.0);  

glEnd(); 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис

. 3. 

Примитивы

 OpenGL 

2 4 

GL_POINTS 

GL_LINES 

2 4 

GL_LINE_STRIP 

GL_LINE_LOOP 

GL_POLYGON 

5

6

7

GL_QUADS 

GL_QUAD_STRIP 

GL_TRIANGLES 

GL_TRIANGLE_STRIP 

GL_TRIANGLE_FAN