ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.06.2020
Просмотров: 1704
Скачиваний: 4
86
текстуры
.
Вместо
этого
используйте
glTexSubImage2D
или
glTexCopyTexSubImage2D
.
8.2.5.
Очистка
буферов
Очистка
буферов
цвета
,
глубины
,
маски
и
буфера
-
накопителя
может
требовать
много
времени
,
особенно
в
программных
реализациях
OpenGL.
В
этом
разделе
описаны
некоторые
приемы
,
которые
могут
помочь
оптимизировать
эту
операцию
.
Используйте
команду
glClear
с
осторожностью
[
все
]
Очищайте
все
нужные
буферы
с
помощью
одной
команды
glClear
.
Неверно
:
glClear(GL_COLOR_BUFFER_BIT);
if (stenciling) /*
очистить
буфер
маски
? */
{
glClear(GL_STENCIL_BUFFER_BIT);
}
Верно
:
if (stenciling) /*
очистить
буфер
маски
? */
{
glClear(GL_COLOR_BUFFER_BIT |
STENCIL_BUFFER_BIT);
}
else
{
glClear(GL_COLOR_BUFFER_BIT);
}
Отключайте
размывание
(dithering)
Отключайте
размывание
перед
очисткой
буфера
.
Обычно
различие
между
очистками
с
включенным
размыванием
и
без
него
незаметно
. [
П
]
Используйте
ножницы
(scissors)
для
очистки
меньшей
области
Если
вы
не
хотите
очищать
весь
буфер
,
используйте
glScissor()
для
ограничения
очистки
по
заданной
области
[
все
].
Не
очищайте
буфер
цвета
полностью
87
Если
ваша
сцена
занимает
только
часть
окна
,
нет
необходимости
очищать
весь
буфер
цвета
. [
П
]
Избегайте
команды
glClearDepth(d
),
где
d!=1.0
Некоторые
программные
реализации
оптимизированы
для
очистки
буфера
с
глубиной
1.0. [
П
]
8.2.6.
Разное
Проверяйте
ошибки
GL
во
время
написания
программ
.
[
все
]
Вызывайте
команду
glGetError()
для
проверки
,
не
произошла
ли
ошибки
во
время
вызова
одной
из
функций
OpenGL.
Как
правило
,
ошибки
возникают
из
-
за
неверных
параметров
команд
OpenGL
или
неверной
последовательности
команд
.
Для
финальных
версий
кода
отключайте
эти
проверки
,
так
как
они
могут
существенно
замедлить
работу
.
Для
проверки
можно
использовать
,
например
,
такой
макрос
:
#include <assert.h>
#define CHECK_GL \
assert(glGetError() != GL_NO_ERROR);
Использовать
его
можно
так
:
glBegin(GL_TRIANGLES);
glVertex3f(1,1,1);
glEnd();
CHECK_GL
Используйте
glColorMaterial
вместо
glMaterial
Если
в
сцене
материалы
объектов
различаются
лишь
одним
параметром
,
команда
glColorMaterial
может
быть
быстрее
,
чем
glMaterial
[
все
]
Минимизируйте
число
изменений
состояния
OpenGL
Команды
,
изменяющие
состояние
OpenGL
(
glEnable/glDisable/glBindT
exture
и
другие
),
вызывают
повторные
внутренние
проверки
целостности
,
создание
дополнительных
структур
данных
и
т
.
д
.,
что
может
приводить
к
задержкам
[
все
]
Избегайте
использования
команды
glPolygonMode
88
Если
вам
необходимо
рисовать
много
незакрашенных
многоугольников
,
используйте
glBegin
с
GL_POINTS
,
GL_LINES
,
GL_LINE_LOOP
или
GL_LINE_STRIP
вместо
изменения
режима
рисования
примитивов
,
так
как
это
может
быть
намного
быстрее
[
все
]
Конечно
,
эти
рекомендации
охватывают
лишь
малую
часть
возможностей
по
оптимизации
OpenGL-
приложений
.
Тем
не
менее
,
при
их
правильном
использовании
можно
достичь
существенного
ускорения
работы
ваших
программ
.
Контрольные
вопросы
1.
Перечислите
известные
вам
методы
высокоуровневой
оптимизации
OpenGL-
приложений
2.
Почему
предпочтительнее
использование
связанных
примитивов
?
3.
Какая
из
двух
команд
выполняется
OpenGL
быстрее
?
glVertex3f(1,1,1)
или
float vct[3] = {1,1,1};
glVertex3fv(vct)
89
Приложение
A.
Структура
GLUT-
приложения
Далее
будем
рассматривать
построение
консольного
приложения
при
помощи
библиотеки
GLUT.
Эта
библиотека
обеспечивает
единый
интерфейс
для
работы
с
окнами
вне
зависимости
от
платформы
,
поэтому
описываемая
ниже
структура
приложения
остается
неизменной
для
операционных
систем
Windows, Linux
и
других
.
Функции
GLUT
могут
быть
классифицированы
на
несколько
групп
по
своему
назначению
:
Инициализация
Начало
обработки
событий
Управление
окнами
Управление
меню
Регистрация
функций
с
обратным
вызовом
Управление
индексированной
палитрой
цветов
Отображение
шрифтов
Отображение
дополнительных
геометрических
фигур
(
тор
,
конус
и
др
.)
Инициализация
проводится
с
помощью
функции
:
glutInit
(int *
argcp
, char **
argv
)
Переменная
argcp
есть
указатель
на
стандартную
переменную
argc
описываемую
в
функции
main(),
а
argv
–
указатель
на
параметры
,
передаваемые
программе
при
запуске
,
который
описывается
там
же
.
Эта
функция
проводит
необходимые
начальные
действия
для
построения
90
окна
приложения
,
и
только
несколько
функций
GLUT
могут
быть
вызваны
до
нее
.
К
ним
относятся
:
glutInitWindowPosition
(int
x
, int
y
)
glutInitWindowSize
(int
width
, int
height
)
glutInitDisplayMode
(unsigned int
mode
)
Первые
две
функции
задают
соответственно
положение
и
размер
окна
,
а
последняя
функция
определяет
различные
режимы
отображения
информации
,
которые
могут
совместно
задаваться
с
использованием
операции
побитового
“
или
” ( “ | “ ) :
GLUT_RGBA
Режим
RGBA.
Используется
по
умолчанию
,
если
не
указаны
явно
режимы
GLUT_RGBA
или
GLUT_INDEX
.
GLUT_RGB
То
же
,
что
и
GLUT_RGBA
.
GLUT_INDEX
Режим
индексированных
цветов
(
использование
палитры
).
Отменяет
GLUT_RGBA
.
GLUT_SINGLE
Окно
с
одиночным
буфером
.
Используется
по
умолчанию
.
GLUT_DOUBLE
Окно
с
двойным
буфером
.
Отменяет
GLUT_SINGLE
.
GLUT_STENCIL
Окно
с
буфером
маски
.
GLUT_ACCUM
Окно
с
буфером
-
накопителем
.
GLUT_DEPTH
Окно
с
буфером
глубины
.
Это
неполный
список
параметров
для
данной
функции
,
однако
для
большинства
случаев
этого
бывает
достаточно
.
Работа
с
буфером
маски
и
буфером
накопления
описана
в
главе
6.
Функции
библиотеки
GLUT
реализуют
так
называемый
событийно
-
управляемый
механизм
.
Это
означает
,
что
есть
некоторый
внутренний
цикл
,
который
запускается
после
соответствующей
инициализации
и
обрабатывает
одно
за
другим
все
события
,
объявленные
во
время
инициализации
.
К
событиям
относятся
:
щелчок
мыши
,
закрытие
окна
,
изменение
свойств
окна
,
передвижение
курсора
,
нажатие
клавиши
,
и
"
пустое
" (idle)
событие
,
когда
ничего
не
происходит
.
Для
проведения