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

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

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

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

Анимированные текстуры

Если вы хотите использовать анимированные текстуры, не используйте команду glTexImage2D чтобы обновлять образ тек­стуры. Вместо этого рекомендуется вызывать glTexSubImage2D или glTexCopyTexSubImage2D.

9.2.5. Очистка буферов

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

Используйте команду glClear с осторожностью

Очищайте все нужные буферы с помощью одной команды glClear.

Неверно:

9.2. Оптимизация вызовов OPENGL

127

g 1С1 е а г (GL_COLOR_BUFFER_BEr) ;

if (stenciling) /* очистить буфер маски? */

{

g 1С1 е а г (GL_STENCIL_BUFFER_Brr);

}

Верно:

if (stenciling) /* очистить буфер маски? */

{

g 1С1 е а г (GL_COLOR_BUFFER_BIT | STENCIL_BUFFER_BIT);

} else

{

glClear (GL_COLOR_BUFFER_Brr) ;

}

9.2.6. Разное

Проверяйте ошибки GL во время написания программ

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

^include <assert.h> #define CHECK_GL \

assert (glGetErrorQ != GL_NO_ERROR);

Использовать его можно так:

glBegin (GL_TRIANGLES); glVertex3f (1 ,1 ,1); glEnd();

128

Глава 9. Оптимизация программ

CHECK_GL;

Используйте glColorMaterial вместо glMaterial

Если в сцене материалы объектов различаются лишь одним параметром, команда glColorMaterial может быть быстрее, чем glMaterial.

Минимизируйте число изменений состояния OpenGL

Команды, изменяющие состояние OpenGL (glEnable, glDisable, glBindTexture и другие), вызывают повторные внутренние про­верки целостности, создание дополнительных структур данных и т.д., что может приводить к задержкам.

Избегайте использования команды glPolygonMode

Если вам необходимо рисовать много незакрашенных мно­гоугольников, используйте glBegin с GL_POINTS, GL_LINES, GL_LINE_LOOP или GL_LINE_STRIP вместо изменения режима рисования примитивов, так как это может быть намного быст­рее.

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

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

  1. Перечислите известные вам методы высокоуровневой опти­мизации OpenGL-приложений.

  2. Почему предпочтительнее использование связанных при­митивов?

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

129

3) Какая из двух команд выполняется OpenGL быстрее? glVertex3f (1 ,1 ,1);

или

float vet [3] = {1 ,1 ,1}; glVertex3fv ( vet );

Часть III

Создание приложений с OpenGL

131

Глава 10.

OpenGL-приложения с помощью GLUT

10.1. Структура GLUT-приложения

Далее будем рассматривать построение консольного прило­жения при помощи библиотеки GLUT. Эта библиотека обеспечи­вает единый интерфейс для работы с окнами вне зависимости от платформы, поэтому описываемая ниже структура приложения остается неизменной для операционных систем Windows, Linux и других.

Функции GLUT могут быть классифицированы на несколько групп по своему назначению:

  • инициализация;

  • начало обработки событий;

  • управление окнами;

  • управление меню;

  • регистрация функций с обратным вызовом;

133

134 Глава 10. OPENGL-приложения с помощью GLUT

  • управление индексированной палитрой цветов;

  • отображение шрифтов;

  • отображение дополнительных геометрических фигур (тор, конус и др.).

Инициализация проводится с помощью функции:

glutlnit (int *argcp , char **argv)

Переменная argcp есть указатель на стандартную перемен­ную argc, описываемую в функции main(), a argv — указатель на параметры, передаваемые программе при запуске, который опи­сывается там же. Эта функция проводит необходимые начальные действия для построения окна приложения, и только несколько функций GLUT могут быть вызваны до нее. К ним относятся:

glutlnitWindowPosition (int x, int у) glutlnitWindowSize (int width, int height) glutlnitDisplayMode (unsigned int mode)

Первые две функции задают соответственно положение и размер окна, а последняя функция определяет различные режи­мы отображения информации, которые могут совместно зада­ваться с использованием операции побитового «или» (« | »):

GLUT_RGBA Режим RGBA. Используется по умолчанию, ес­ли не указаны режимы GLUT_RGBA или GLUT_INDEX.

GLUT_RGB To же, что и GLUT_RGBA.

GLUT INDEX Режим индексированных цветов (использова­ние палитры). Отменяет GLUT_RGBA.

GLUT_SINGLE Окно с одиночным буфером. Используется по умолчанию.

GLUT_DOUBLE Окно с двойным буфером. Отменяет GLUT SINGLE.

10.1. Структура GLUT-приложения

135

GLUT_STENCIL Окно с буфером маски. GLUT_ACCUM Окно с буфером-накопителем. GLUT_DEPTH Окно с буфером глубины.

Это неполный список параметров для данной функции, од­нако для большинства случаев этого бывает достаточно.

Работа с буфером маски и буфером накопления описана в главе 7.

Функции библиотеки GLUT реализуют так называемый со-бытийно-управляемый механизм. Это означает, что есть некото­рый внутренний цикл, который запускается после соответству­ющей инициализации и обрабатывает одно за другим все собы­тия, объявленные во время инициализации. К событиям отно­сятся: щелчок мыши, закрытие окна, изменение свойств окна, передвижение курсора, нажатие клавиши и «пустое» (idle) собы­тие, когда ничего не происходит. Для проведения периодической проверки совершения того или иного события надо зарегистри­ровать функцию, которая будет его обрабатывать. Для этого ис­пользуются функции вида:

void glutDisplayFunc (void (*func) (void)) void glutReshapeFunc (void (*func) (int width,

int height)) void glutMouseFunc (void (*func) (int button,

int state , int x, int y)) void glutldleFunc (void (*func) (void)) void glutMotioiiFimc (void (* func) (int x, int y)); void glutPassiveMotionFunc (

void (*func)(int x, int y));

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

136 Глава 10. OPENGL-приложения с помощью GLUT

явного указания, что окно надо обновить, иногда удобно исполь­зовать функцию

void glutPostRedisplay (void)

Через glutReshapeFuncQ устанавливается функция обработки изменения размеров окна пользователем, которой передаются новые размеры.

glutMouseFimcQ определяет функцию-обработчик команд от мыши, a glutldleFuncQ задаст функцию, которая будет вызывать­ся каждый раз, когда нет событий от пользователя.

Функция, определяемая glutMotionFuncQ, вызывается, когда пользователь двигает указатель мыши, удерживая кнопку мы­ши. glutPassiveMotionFiinc регистрирует функцию, вызываемую, если пользователь двигает указатель мыши и не нажато ни од­ной кпопки мыши.

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

void glutMainLoop (void)

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

#include <GL/glut.h>

void Myldle(void)

{

/* Код, который меняет переменные, определяющие следующий кадр */

"};

void MyDisplay (void)

{ /* Код OpenGL, который отображает кадр */

10.2. GLUT в среде MICROSOFT VISUAL C++ 6.0 137

/* После рисования переставляем буферы */ glutSwapBuffers ();

};

void main(int argcp , char **argv)

{ /* Инициализация GLUT */ glutlnit (feargcp, argv); glutInitWindowSize(640, 480); glutlnitWindowPosition (0 , 0); /* Открытие окна */

glutCreateWindow ( "My„OpenGLw Application " ) ; /* Выбор режима: двойной буфер и RGBA цвета */ glutlnitDisplayMode (GLUT_RGBA |

GLUT_DOUBLE | GLIJT_DEFTH); /* Регистрация вызываемых функций */ glutDisplayFunc (MyDisplay ) ; glutldleFunc(Myldle) ;

/* Запуск механизма обработки событий */ glutMainLoop () ;

};

В случае , если приложение должно строить статичное изоб­ражение, можно заменить GLUT_DOUBLE на GLUT_SINGLE, так как одного буфера в этом случае будет достаточно, и убрать вызов функции glutldleFuncQ.

10.2. GLUT в среде Microsoft Visual C++ 6.0

Перед началом работы необходимо скопировать файлы glut.h, glut32.1ib glut32.dll в каталоги MSVC\Include\Gl, MSVC\Lib, Windows\System соответственно. Также в этих каталогах на­до проверить наличие файлов gl.h, glu.h, opengl32.1ib, glu32.1ib, opengl32.dll, glu32.dll, которые обычно входят в состав Visual C++ и Windows. При использовании команд из библиотеки

138 Глава 10. OPENGL-приложения с помощью GLUT

GLAUX к перечисленным файлам надо добавить подключаемые файлы библиотеки — glaux.h и glaux.lib.

Для создания приложения надо выполнить следующие дей­ствия:

  • Создание проекта: для этого надо выбрать File—>New—> Projects—^Win32 Console Application, набрать имя проекта, ОК.

  • В появившемся окне выбрать «An empty project», Finish, ОК.

  • Текст программы можно либо разместить в созданном тек­стовом файле (выбрав File—>New—>Files—>Text File), либо добавить файл с расширением *.с или *.срр в проект (вы­брав Project—)► Add To Project—s^Files).

  • Подключить к проекту библиотеки OpenGL. Для этого на­до выбрать Project—^Settings—>Link и в поле Object\library modules набрать названия нужных библиотек: opengl32.1ib, glu32.1ib, glut32.1ib и, если надо, glaux.lib.

  • Для компиляции выбрать Build—>Build program.exe, для выполнения — Build—>Execute program.exe.

  • Чтобы при запуске не появлялось текстовое окно, надо вы­брать Project—>Settings—>Link и в поле Project Options вме­сто «subsystem:console» набрать «subsystem:windows», и на­брать там же строку «/cntry:mainCRTStartup».

Когда программа готова, рекомендуется перекомпилировать ее в режиме «Release» для оптимизации по быстродействию и объему. Для этого надо выбрать Build—>Set Active Configuration и отметить «... -Win32 Release», а затем заново подключить необ­ходимые библиотеки.

10.3. GLUT в среде MICROSOFT VISUAL C++ 2005 139

10.3. GLUT в среде Microsoft Visual C++ 2005

Перед началом работы необходимо скопировать файлы glut.h, glut32.1ib и glut32.dll в каталоги MVS8\VC\PlatformSDK\Include, MVS8\VC\PlatformSDK\Lib, Windows\System соответственно. Также в этих каталогах надо проверить наличие файлов gl.h, glu.h, opengl32.1ib, glu32.1ib, opengl32.dll, glu32.dll, которые обыч­но входят в состав Visual СИ—Ь и Windows. При использовании команд из библиотеки GLAUX к перечисленным файлам надо добавить подключаемые файлы библиотеки — glaux.h и glaux.lib.

Для создания приложения надо выполнить следующие дей­ствия:

  • Создание проекта: для этого надо выбрать File—>New—> Projects—>Win32—>Win32 Console Application, набрать имя проекта, ОК.

  • В появившемся окне во вкладке Application Settings вы­брать «Console application», «An empty project», Finish.

  • Текст программы можно либо разместить в созданном текстовом файле (выбрав File—>New—>Files—>Visual C+H—> C++File ), либо добавить файл с расширением *.с или *.срр в проект (выбрав Project—>Add To Project—>Files).

  • Подключить к проекту библиотеки OpenGL. Для этого на­до выбрать Project—^Properties—^Configuration Properties—> Linker—>Input и в поле Additional dependencies набрать на­звания нужных библиотек: opengl32.1ib, glu32.1ib, glut32.1ib и, если надо, glaux.lib.

  • Для компиляции выбрать Build—> program.exe, для выпол­нения—Debug—> Start Debugging или Debug—>Start Without Debugging.

140 Глава 10. OPENGL-приложения с помощью GLUT

• Чтобы при запуске программы не появлялось консольное текстовое окно, надо выбрать Project—^Properties—» Configuration Properties—^Linker—^System и в поле SubSystem вместо «Console» выбрать «Windows». Пе­рейти в раздел Linker—> Advanced и в поле Entry Point написать «wmainCRTStartup» (без кавычек).

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

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

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

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