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

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

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

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

Добавлен: 09.06.2020

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

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

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

 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()

 

для

 

ограничения

 

очистки

 

по

 

заданной

 

области

 

[

все

].  

Не

 

очищайте

 

буфер

 

цвета

 

полностью

  


background image

 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

  


background image

 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) 


background image

 89

 

Приложение

 A.  

 

Структура

 GLUT-

приложения

 

Далее

 

будем

 

рассматривать

 

построение

 

консольного

 

приложения

  

при

 

помощи

 

библиотеки

 GLUT. 

Эта

 

библиотека

 

обеспечивает

 

единый

 

интерфейс

 

для

 

работы

 

с

 

окнами

 

вне

 

зависимости

 

от

 

платформы

поэтому

 

описываемая

 

ниже

 

структура

 

приложения

 

остается

 

неизменной

 

для

 

операционных

 

систем

 Windows, Linux  

и

 

других

 

Функции

 GLUT 

могут

 

быть

 

классифицированы

 

на

 

несколько

 

групп

 

по

 

своему

 

назначению

:   

 

Инициализация

  

 

Начало

 

обработки

 

событий

   

 

Управление

 

окнами

   

 

Управление

 

меню

   

 

Регистрация

 

функций

 

с

 

обратным

 

вызовом

  

 

Управление

 

индексированной

 

палитрой

 

цветов

  

 

Отображение

 

шрифтов

  

 

Отображение

 

дополнительных

 

геометрических

 

фигур

    (

тор

конус

 

и

 

др

.) 

 

Инициализация

 

проводится

 

с

 

помощью

 

функции

 

glutInit 

(int *

argcp

, char **

argv

 

Переменная

 

argcp

 

есть

 

указатель

 

на

 

стандартную

 

переменную

 argc 

описываемую

 

в

 

функции

 main(), 

а

 

argv

 – 

указатель

 

на

 

параметры

передаваемые

 

программе

 

при

 

запуске

который

 

описывается

 

там

 

же

Эта

 

функция

 

проводит

 

необходимые

 

начальные

 

действия

 

для

 

построения

 


background image

 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) 

событие

когда

 

ничего

 

не

 

происходит

Для

 

проведения