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

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

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

Добавлен: 09.06.2020

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

Скачиваний: 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