Главная » Просмотр файлов » Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC)

Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (1124366), страница 4

Файл №1124366 Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC)) 4 страницаЮ.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (1124366) страница 42019-05-11СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 4)

Контроль всех событий и вызов нужных функций происходит внутри бесконечного цикла в функции glutMainLoopQ.

Заметим, что библиотека GLUT не входит в состав OpenGL, а является лишь переносимой прослойкой между OpenGL и оконной подсистемой, предоставляя минимальный интерфейс. OpenGL-приложение для конкретной платформы может быть написано с использованием специфических для платформы API (Win32, X Window и т.д.), которые как правило предоставляют более широкие возможности. Более подробно работа с библиоте­кой GLUT описана в главе 10.

36

Глава 2. Введение в OPENGL

Все вызовы команд OpenGL происходят в обработчиках со­бытий. Более подробно они будут рассмотрены в следующих гла­вах. Сейчас обратим внимание на функцию Display, в которой сосредоточен код, непосредственно отвечающий за рисование на экране.

Следующая последовательность команд из функции Display():

glClearColor (0, 0, 0, 1); glClear (GL_COLOR_BUFFER_BrT);

glColor3ub (255 ,0 ,0); glBegin(GL_QUADS);

glVertex2f (left , bottom ) ;

glVertex2f (left , top );

glVertex2f( right , top );

glVertex2f( right , bottom ) ; glEnd();

очищает окно и выводит на экран квадрат, задавая координаты четырех угловых вершин и цвет.

В приложении Б приведен еще один пример несложной про­граммы, при нажатии кнопку мыши рисующей на экране разно­цветные случайные прямоугольники.

2.6. Контрольные вопросы

  1. В чем, по вашему мнению, заключается необходимость со­здания стандартной графической библиотеки?

  2. Кратко опишите архитектуру библиотек OpenGL и органи­зацию конвейера.

  3. В чем заключаются функции библиотек, подобных GLUT или GLX? Почему они формально не входят в OpenGL?

  4. Назовите категории команд (функций) библиотеки.

2.6. Контрольные вопросы

37

  1. Почему организацию OpenGL часто сравнивают с конеч­ным автоматом?

  2. Зачем нужны различные варианты команд OpenGL, отли­чающиеся только типами параметров?

7)

Что можно сказать о количестве и типе параметров коман­ды glColor4ub()? glVertex3fv()?

Глава 3.

Рисование геометрических объектов

3.1. Процесс обновления изображения

Как правило, задачей программы, использующей OpcnGL, является обработка трехмерной сцены и интерактивное отобра­жение в буфере кадра. Сцена состоит из набора трехмерных объ­ектов, источников света и виртуальной камеры, определяющей текущее положение наблюдателя.

Обычно приложение OpenGL в бесконечном цикле вызывает функцию обновления изображения в окне. В этой функции и сосредоточены вызовы основных команд OpenGL. Если исполь­зуется библиотека GLUT, то это будет функция с обратным вы­зовом, зарегистрированная с помощью вызова glutDisplayFuncQ. GLUT вызывает эту функцию, когда операционная система ин­формирует приложение о том, что содержимое окна необходимо перерисовать (например, если окно было перекрыто другим). Создаваемое изображение может быть как статичным, так и анимированным, т.е. зависеть от каких-либо параметров, изме­няющихся со временем. В этом случае лучше вызывать функ-

39

40

Глава 3. Рисование геометрических объектов

цию обновления самостоятельно. Например, с помощью коман­ды glutPostRedisplay(). За более подробной информацией можно обратиться к главе 10.

Приступим, наконец, к тому, чем занимается типичная функ­ция обновления изображения. Как правило, она состоит из трех шагов:

  • очистка буферов OpenGL;

  • установка положения наблюдателя;

  • преобразование и рисование геометрических объектов.

Очистка буферов производится с помощью команды:

void glClearColor ( clampf r, clampf g, clampf b,

clampf a ) void glClear ( bitfield buf)

Команда glClearColor устанавливает цвет, которым будет за­полнен буфер кадра. Первые три параметра команды задают R,G и В компоненты цвета и должны принадлежать отрезку [0,1]. Четвертый параметр задает так называемую альфа ком­поненту (см. п. 7.1). Как правило, он равен 1. По умолчанию цвет —черный (0,0,0,1).

Команда glClear очищает буферы, а параметр buf определя­ет комбинацию констант, соответствующую буферам, которые нужно очистить (см. главу 7). Типичная программа вызывает команду

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_B]T)

для очистки буферов цвета и глубины.

Установка положения наблюдателя и преобразования трех­мерных объектов (поворот, сдвиг и т.д.) контролируются с помо­щью задания матриц преобразования. Преобразования объектов и настройка положения виртуальной камеры описаны в главе 4.

3.2. Вершины и примитивы

41

Сейчас сосредоточимся на том, как передать в OpenGL опи­сания объектов, находящихся в сцене. Каждый объект является набором примитивов OpenGL.

3.2. Вершины и примитивы

В OpenGL вершина (vertex) является атомарным графиче­ским примитивом и определяет точку, конец отрезка, угол мно­гоугольника и т.д. Все остальные примитивы формируются с помощью задания вершин, входящих в данный примитив. На­пример, отрезок определяется двумя вершинами, являющимися концами отрезка.

С каждой вершиной ассоциируются ее атрибуты. В число основных атрибутов входят положение вершины в пространстве, цвет вершины и вектор нормали.

3.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)

Каждая команда задает четыре координаты вершины: х, у, z, w. Команда glVertex2* получает значения х и у. Координата z в таком случае устанавливается по умолчанию равной 0, ко­ордината w — равной 1. glVertex3* получает координаты х, у, z и заносит в координату w значение 1. glVertex4* позволяет задать все четыре координаты.

Для ассоциации с вершинами цветов, нормалей и текстур­ных координат используются текущие значения соответствую­щих данных, что отвечает организации OpenGL как конечного

42 Глава 3. Рисование геометрических объектов

автомата. Эти значения могут быть изменены в любой момент с помощью вызова соответствующих команд.

3.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, В компоненты цвета, а последний параметр определяет коэффициент непрозрачности (так называемая альфа-компонента). Если в названии команды указан тип «f» (float), то значения всех параметров должны при­надлежать отрезку [0,1], при этом по умолчанию значение аль­фа-компоненты устанавливается равным 1.0, что соответствует полной непрозрачности. Тип «ub» (unsigned byte) подразумевает, что значения должны лежать в отрезке [0,255].

Вершинам можно назначать различные цвета, и, если вклю­чен соответствующий режим, то будет проводиться линейная ин­терполяция цветов по поверхности примитива.

Для управления режимом интерполяции используется ко­манда

void glShadeModel (GLenum mode)

вызов которой с параметром GL_SMOOTH включает интерполя­цию (установка по умолчанию), а с GL_FLAT — отключает.

3.2.3. Нормаль

Определить нормаль в вершине можно, используя команды

void glNormal3[b s i f d] (type coords) void glNorma!3[b s i f d]v (type coords)

3.3. Операторные скобки GLBEGIN / GLEND

43

Для правильного расчета освещения необходимо, чтобы век­тор нормали имел единичную длину. В OpenGL существует специальный режим, при котором задаваемые нормали будут нормироваться автоматически. Его можно включить командой glEnable(GL_NORMALIZE).

Режим автоматической нормализации должен быть включен, если приложение использует модельные преобразования растя­жения/сжатия, так как в этом случае длина нормалей изменя­ется при умножении на модельно-видовую матрицу.

Однако применение этого режима уменьшает скорость ра­боты механизма визуализации OpenGL, так как нормализация векторов имеет заметную вычислительную сложность (взятие квадратного корня). Поэтому лучше сразу задавать единичные нормали.

Отмстим, что команды

void glEnable (GLenum mode) void glDisable (GLenum mode)

производят включение и отключение того или иного режима ра­боты конвейера OpenGL. Эти команды применяются достаточно часто, и их возможные параметры будут рассматриваться в каж­дом конкретном случае.

3.3. Операторные скобки glBegin / glEnd

Мы рассмотрели задание атрибутов одной вершины. Однако чтобы задать атрибуты графического примитива, одних коорди­нат вершин недостаточно. Эти вершины надо объединить в одно целое, определив необходимые свойства. Для этого в OpenGL используются так называемые операторные скобки, являющи­еся вызовами специальных команд OpenGL. Определение при­митива или последовательности примитивов происходит между вызовами команд

44 Глава 3. Рисование геометрических объектов

void glBegin (GLenum mode) void glEnd (void)

Параметр mode определяет тип примитива, который задается внутри и может принимать следующие значения:

GL POINTS —каждая вершина задает координаты некото­рой точки.

GL LINES —каждая отдельная пара вершин определяет от­резок; если задано нечетное число вершин, то последняя вершина игнорируется.

GL LINE STRIP — каждая следующая вершина задает от­резок вместе с предыдущей.

GL LINE LOOP —отличие от предыдущего примитива толь­ко в том, что последний отрезок определяется последней и первой вершиной, образуя замкнутую ломаную.

GL TRIANGLES — каждые отдельные три вершины опреде­ляют треугольник; если задано не кратное трем число вер­шин, то последние вершины игнорируются.

GL_TRIANGLE_STRIP —каждая следующая вершина за­даст треугольник вместе с двумя предыдущими.

GL_TRIANGLE_FAN — треугольники задаются первой вер­шиной и каждой следующей парой вершин (пары не пере­секаются) .

GL QUADS —каждая отдельная четверка вершин определя­ет четырехугольник; если задано не кратное четырем число вершин, то последние вершины игнорируются.

GL QUAD STRIP —четырехугольник с номером п опреде­ляется вершинами с номерами 2п — 1, 2п, 2п + 2, 2п + 1.

GL POLYGON —последовательно задаются вершины вы­пуклого многоугольника.

3.3. Операторные скобки GLBEGIN / GLEND

45

Например, чтобы нарисовать треугольник с разными цветами в вершинах, достаточно написать:

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); /* зеленый */

glVertex3f (1.0 , 0.0, 0.0);

glColor3fv (BlueCol) ; /* синий */

glVertex3f (1.0 , 1.0, 0.0);

glEnd();

Как правило, разные типы примитивов имеют различную скорость визуализации на разных платформах. Для увеличения производительности предпочтительнее использовать примити­вы, требующие меньшее количество информации для передачи на сервер, такие как GL_TRIANGLE_STRIP, GL_QUAD_STRIP, GL_TRIAGLE_FAN.

Кроме задания самих многоугольников, можно определить метод их отображения на экране. Однако сначала надо опреде­лить понятие лицевых и обратных граней.

Под гранью понимается одна из сторон многоугольника, и по умолчанию лицевой считается та сторона, вершины которой обходятся против часовой стрелки. Направление обхода вершин лицевых граней можно изменить вызовом команды

void glFrontFace (GLenum mode)

со значением параметра mode равным GL_CW (clockwise), а вер­нуть значение по умолчанию можно, указав GL_CCW (counter­clockwise).

Чтобы изменить метод отображения многоугольника исполь­зуется команда

void glPolygonMode (GLenum face , Glenum mode)

46

Глава 3. Рисование геометрических объектов

Параметр mode определяет как будут отображаться много­угольники, а параметр face устанавливает тип многоугольников, к которым будет применяться эта команда и может принимать следующие значения:

GL FRONT —для лицевых граней;

GL BACK —для обратных граней;

GL_FRONT_AND_BACK —для всех граней.

Параметр mode может быть равен:

GL POINT —отображение только вершин многоугольников;

GL LINE — многоугольники будут представляться набором отрезков;

GL FILL — многоугольники будут закрашиваться текущим цветом с учетом освещения, и этот режим установлен по умолчанию.

Характеристики

Тип файла
Документ
Размер
3,41 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6551
Авторов
на СтудИзбе
299
Средний доход
с одного платного файла
Обучение Подробнее