OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 8
Текст из файла (страница 8)
Кроме того, в отличие от команд рисования ОрепС1., которые позволяют строить только простые геометрические примитивы (точктн линии и многоугольники), СЕНТ предоставляет возможности для создания более сложных трехмерных объектов, таких как сфера, тор и чайник. Поэтому снимки экранов результатов выполнения программ представляют определенный шперес, (СЕП также имеет команды для создания некоторых трехмерных объектов, таких как сфера, цилиндр и конус.) Управление окнами Пять команд выполняют задачи, необходимые для определения окна: 36 Глава 1 ° Введение в ОрепвС ° я1ц с 1п ! С(Спс атКс, сЬаг " аг(!и) инициализирует СШТ и обрабатывает любые параметры командной строки (для Х-систем это могут быть такие параметры, как -б!эр1ау и -яеоаесгу).
Команда я1цс1п(СО должна быть вызвана до любых других команд СШТ. в я1цс1п! С0! эр1эуМобе(цпз(йпес) шС тот(е) определяет, какую цветовую модель, В.СВА или индексную, следует использовать. Также она может определять режим одиночной или двойной буферизации окна. (Если вы работаете в режиме цветовых индексов, вам необходимо загрузить какую-нибудь цветовую карту с помощью команлы х1цс5ессо1огО.) Наконец, с помощью этой команды можно определить, связано ли окно с глубиной, трафаретом, множественной выборкой и/или буфером накопления. Например, если требуется создать окно с двойной буферизацией, моделью цвета РСВА и буфером глубины, вы можете вызвать функцию следующего вида я1цс1п ! С0! эр1аумобе(6сцт 000Все ! 6СВТ Р6В ! 6СОТ 0ЕРТН). ° а1цс1п(сы!пбонРоэ)с!оп(!псх,!пс у) определяет положение левого верхнего угла окна.
° а1цс1п! Си! пбои5! Се((пс геггггл, !пс э(ге) определяет размер окна в пикселах. ° ! п С а1ц С С ге а Се)(! пбон(сЬаг 'зтппя) создает окно с содержимым ОрепС1.. Она возвращает уникальный идентификатор нового окна. ПРИМЕЧАНИЕ пока не будет вызвана функция вммэ!псоорО, окно отображено не будет! Обратная связь я1цс01эр1аугцпс(чоЫ ("/ипс)(цоЫ)) — первая и наиболее важная функция обратной связи.
Когда С!.()Т определяет, какое содержимое окна нужно перерисовать, выполняется функция обратной связи, зарегистрированная с помощью я1цс0! эр1аугопс(). Поэтому все команды для перерисовки сцены следует размешать в функции обратной связи. Если программа изменяет содержимое окна, иногда вызывают функцию я1цсРоэсРе! вр1ау (), которая заставляет функцию а1цсМа! псоор() вызвать зарегистрированную функци!о обратной связи при первом удобном случае. Запуск программы последнее, что необходимо сделать, — вызвать функцию к1цсма! псоор (цо(б).
После этого будут показаны все созданные окна вместе с их содержимым. Начнется обработка событий, и сработает привязка функции обратной связи. После того как цикл обработки начнет работать, он никогда не прекратится! Листинг 1.2 показывает, как с помощью С1Л)Т создать простую программу, показанную в листинге 1.1. Заметьте, что код был переформировап. Для улучшения производительности те операции, которые вызываСотся один раз (устацовка цвета фона и системы координат), размещены в процедуре ! и ! с () . Операции рисования (и возможной перерисовки) сцены находятся в процедуре б! эр1ау (), которая зарегистрирована как функция обратной связи СЕНТ.
Библиотеки, связанные с ОрепОС 37 Листинг 1.2. Простая программа, использующая БШТ: Пе(!О.с чотп Отзр1ау(чотб) ( /* очищаем все пикселы */ 9161еаг(6С СО(оа ВОРРЕя В)т); /' рисуем белый многоугольник (прямоугольник) с углами в (0,25, 0,25, 0,9) и (0.75, 0.75, 9.0) "/ 91Со1огзг(1.0, 1.0, 1.9): 919ейтп(6с Росчвон), 91Чегтехзг(9.25, 0.25, 9.9); 91НегСЕхзг(9.75, 0.25, 0.0); 91ЧЕГСЕХЗГ(9.75, О.75, О.О); 91ЧегтехЗГ(0.25, 9.75, 9.0); Втвпа О; не ждем(начинаем обработку буферизованных команд Орепб( "/ 91Р1цзл(); чо!б !и!С(чо!О) ( /* выбираем цвет очистки (фона) « / 91С1еагСо1ог(9.0, 0.0.
0.0, О.О); определяем значения обзора */ В)иаСгтхиобе(66 РВО)ЕСт)ОМ); 91(оаб1бепС(Су(): 91ОгСПо(О.О, 1.9, О,О, 1.О, -1.О, 1.О); ) /» Определяем размеры, полажение и режим отображения (одиночный буфер и 96ВА). Открываем окно с надпи в заголовке. Вызываем функции инициализации. Регистрируем функцию обратной связи. Входим в цикл и обрабатываем события. »/ тпС ватп(тпС агйс.
слаг'* агйч) ( 91цС1птС(аагйс, агйч); ВсцС1п! Со! зр1аунобе(6! От 5!М6! Е ! 6(цт а6В); 91ц(1пттнтпбон5!хе(250, 250); 91цС1п!СитпбонРозтттап(199, 100); 51чССгеа(ен!плон(«ие11о"); »и!с(); В)ц(отзрсаугцпс(о!яр!ау); 91отна!п(оор(); геСцгп 0; /' Стандарт 150 С требует от функции юатп возврата значения типа !пС. "/ ) окна сью "Пе11о" Обработка событий Вы можете использовать следующие функции для задания реакции на опреде- ленные события: ° 91цтйезиарейцпс (чо(с! ('/ипс)(шС м, 1п( /с)) — реакция на изменение размера окна; 38 Глава 1 ° Введение в ОрепОЬ ° д!оскеуьоагогипс (чоЫ (")ипс)(ппэ1япес( сйаг ггеу, 1пг х, 1пг у)) и д1исноозегопс (чоЫ ("/илс)(1пг биггоп, Ыг эгаге, 1пгх, 1пг у)) — позволяют обрабатывать нажатия клавиш на клавиатуре и движение мыши и нажатие ее кнопок; ° д1и тиос т опгопс (чо1с) ("/ипс)(1пг х, 1пг у)) — отклик на перемещение мыши при нажатой кнопке. Рисование трехмерных объектов С(.13Т вклгочает в себя ряд функций для построения трехмерных обьектов: 1соэадедгоп (нкосаэдр) осьтпег1гоп (октаэдр) эрЬеге (сфера) Геарог (чайннк) геггэдег1гоп (тетраэдр) Гогоэ(тор) сопе (конус) соЬе (куб) оодесадеогоп (додекаэдр) Вы можете рисовать зти объекты в виде каркасов или залитыми, оттененными, с заданием векторов нормалей.
Например, функциями для рисования куба и сфе- ры являются: чо(с( д1отй1геСиве(СЫопЫе э(ге); чо1с( д1ис5о11с1Сове(С1.с(оные яге); чо(г( д1осэ1т ге5рпеге(С(э)опЫе гаог1иж СЫпг засек, СЫпс эгасггэ); чо1с( В1пс5о1то5рпеге(Сапные гааг1иэ, Сыпь эйсеэ, СЫпс эгасйэ). Все перечисленные модели рисуются отцентрированными относительно начала координат (см. приложение Г для получения более подробной информации обо всех прототипах этих функций).
Анимация Одна из наиболее захватывающих вещей компьютерной графики — зто создание движущихся изображений. Не важно, на кого рассчитана анимация: на инженера, пытающегося рассмотреть все части разработанного механизма, или пилота, который учится летать на самолете с помощью симулятора, или на страстного поклонника компьютерных игр, ясно, что она является важнейшей частью компьютерной графики. Управление фоновым процессом Вы можете определить функцию, которая будет вызываться, когда никакие собы- тия не возникают — например, при зацикливании, с помощью команды д1нг- 1о1египс(чоЫ ("/ипс)(чо1с))), Аргументом функции является указатель на функ- цию обработки.
Для отключения обработки необходимо задать в качестве параметра значение М0сс (нуль). Анимация 39 В кинотеатре движение создается путем последовательного проецирования кадров на экран — 24 раза/с. Каждый кадр помещается под линзу, затвор открывается, и кадр показывается. Затвор моментально закрывается и остается закрытым, пока фильм движется к следующему кадру, и т. д.
Несмотря на то что вы видите 24 различных кадра каждую секунду, ваш мозг объединяет их в плавную анимацию, (Старые фильмы с1арли Чаплина снимались с частотой 16 кадров/с, и в них заметна смена кадров.) Экран в компьютерных графических системах обычно обновляется (перерисовывает изображение) примерно от 60 до 76 раз/с, а в некоторых даже около 120 раз/с.
Несомненно, что 60 раз/с плавнее, чем 30, и, конечно, 120 лучше, чем 60. Однако частота обновления больше 120 раз/с, в зависимости от восприятия, может вызвать ухудшение качества. Ключевым моментом в проецировании движения является то, что каждый кадр показывается полностью. Допустим, вы пытаетесь создать компьютерную анимацию фильма нз миллиона кадров с помощью следующей программы: ореп и(пбои(); (ог (! = 0; ! < 1008009; 1++) ( с!еаг Сье и(пбои(); бгаи (гаее(!); иа(! оп(!! а 24(П о! а аесопб !а очес О; ) Если вы добавите время, затрачиваемое вашей системой на очистку экрана и рисование типичного кадра, эта программа даст тем более плохие результаты, шм ближе время, затраченное на очистку и прорисовку, к 1/24 с.
Предположим, что прорисовка занимает около 1/24 с. Элементы, рисуемые первыми, видны в течение всей 1/24 с н представляют собой сплошное изображение на экране; алементы же, рисуемые в конце, мгновенно стираются перед выводом следующего кадра. В лучшем случае получится призрачное изображение, так как большую часть 1/24 с глаз будет видеть фон, а не элементы, которые должны были строи~ься в конце. Проблема в том, что эта програмыа показывает не законченный кадр, а его построение. Большинство реализаций ОрепОЕ обеспечивают возможности технологии двойной буферизации — аппаратной или программной, которая предоставляет два полноценных цветовых буфера.