М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 9
Текст из файла (страница 9)
(.3. Это также пример применения СП)Т для управления устройством ввода и включения и выключения функций задержки. Здесь кнопки мыши включают и выклгочают вращение. Кадр 0 Кадр 1О Кадр 20 Кадр ЗО Кадр 40 рнс. 1.3. Вращение квадрата с использованием двойной буферизации Листинг 1.3. Программа с использованием двойной буферизации: боиЬ(е.с ага(1с Сьг)оа( зр(п = 0.0; чо)б )п)1(чо1б) ( К1С1еагСо1ог(О.В, О.О, 0.0, 0.0); В15пабеМабе1(ЬС РСАТ); чо)б б1зр1ау(чо)б) ( В)С(еаг(ОС СО(ОЯ ВОРРВК В)т); 51Ризпна1г!х(); В(ватаге((зр)п, О.о. О.О, 1.0); Х)Со(ог)(О.О. 1.О, 1.0); 51аес11(-25.0, -25.0, 25.0, 25.0); 51РоРМагг1х(); 51и(5нарви11егз(); чо1б зр)пв!зр1ау(чо~б) [ ар~о = зр~п + 2.0; продолжение р 42 Глава 1 ч Введение в Орели 1.
Листинг 1.3 (лродолжвние) (зр1п > 3 68.8) з р1 и = з р1 и — 3 б О, О; 81иСРОЗСМЕбтвр1ау(); чотб гезоаре(1пт н, 1пС П) ( 8]итеирогС(8, О, (61з(се() н, (61з(се!) П); 81натг!хМобе(61 РМОЗЕСТ!ОМ); 811оаб]бент!ту(); 810гтпо(-58.8, 58.0, -58.0, 50.0, -1.8, 1.8); 81Масг!хнобе (6С МООЕСН1ЕИ); 81Соаб1бепт!Су(); ) чотб моизе(тпс ьиссоп, зпс зсасе, 1пс х, тпс у) ( зн(СсП (Ьиттоп) сазе 6СЬТ СЕЕТ ВОТТОМ: 1! (!тате == ОСОТ ООИМ) 81иС1б1еуипс(зрзпОтзр1ау); Ьгеай; сазе ОСОТ М10ОСЕ ВОТТОМ; 1! (зСаСе == 6001 ООИМ) 81ис1б1ееипс(ЙОЕЕ); ьгеай; бе!аи11: Ьгеах; ] /т Необходим режим двойной буферизации Регистрация функции обратной связи на ввод от мыши к / 1пс шатп(1пт агвс, спаг*" агйч) 81ис1п11(вагйс, агйч); а]ит]птСОтзр]аунобе(600т ОООВСЕ ] 6!От 86В); 81иС1п(СИ(пбон51се(258, 250); 81ис1п1си!пбонРозтс!оп(100, 180); 81иССгеаСеИ(пбон(агйч[8]); 1п1С(); 81иСО!зр1аугипс(бтзр1ау)1 81итйезпареЕипс(гезпаре); 81иСМоизерипс(моизе): 81иСМа1ПСоор(); ге!игл 0; Управление состоянием и рисование геометрических объемов Прочитав эту главу, вы сможете: ° Очистить окно и закрасить его произвольным цветом ° Принудительно ускорить завершение любого незаконченного рисования ° Рисовать с использованием любых графических примитивов— точек, линий и многоугольников в двух- или трехмерном пространстве ° Переключать состояния и запрашивать значения параметров состояния ° Управлять отображением графических примитивов— например, рисовать пунктирные линии или очерченные многоугольники ° Определять векторы нормалей в соответствующих точках поверхностей закрашенных объектов ° Хранить геометрические данные в массивах вершин для уменьшения числа вызовов функций ° Сохранять и восстанавливать несколько параметров состояния одновременно 44 Глава 2 ° Управление состоянием и рисование геометрических объектов Даже самые сложные и интересные изображения, нарисованные в ОрепСЕ, состоят из небольшого числа простых графических элементов.
Это не является неожиданностью — посмотрите, какие совершенные картины создал Леонардо да Винчи только с помощью карандашей и кисти. На самом высоком уровне абстракции существует только три основных операции рисования: очистка окна, рисование геометрических объектов и рисование растровых объектов. Растровые объекты: двухмерные изображения, битовые образы и символы шрифтов — рассматриваются в главе 8. В этой главе вы узнаете, как очистить экран и нарисовать геометрические объекты: точки, прямые линии и плоские многоугольники. Вы могли подумать: «Подождите минуту. Я видел много компьютерной графики в фильмах и по телевизору, и всегда это были великолепно оттененные кривые линии и поверхности.
Как такое получается, если ОрепС1 способен рисовать только прямые линии и плоские многоугольники?» На цветном рисунке 6 есть круглый стол, а объекты на столе состоят из кривых поверхностей. Все кривые линии и поверхности, которые вы видите, получены с помощью большого числа небольших плоских многоугольников и прямых линий, почти так же, как поверхность глобуса можно представить совокупностью огромного числа прямоугольных блоков. Она не кажется гладкой тогда, когда блоки относительно велики в сравнении с глобусом, но с увеличением числа блоков ее качество улучшается. Позже в этой главе мы покажем, как образовывать кривые линии и поверхности из большого набора маленьких графических примитивов.
Эта глава состоит из следующих основных разделов: ° Основы рисования. Показывает, как очистить окно и принудительно ускорить рисование. Также дает основную информацию об управлении цветами геометрических объектов и описание системы координат. ° Описание точек, линий и многоугольников. Рассматривает задание графических примитивов и методы их рисования. ° Управление основными состояниями. Показывает, как включать и выключать некоторые состояния (режимы) и опрашивать параметры состояний.
«Отображение точек, линий и многоугольников. Рассматривает методы управления примитивами, например определение размера точки, типа линии, закраски многоугольника. ° Векторы нормали. Обсуждает методику задания векторов нормалей для геометрических объектов и кратко описывает, для чего нормали нужны. ° Массивы вершин. Показывает, как размещать большой набор геометрических данных всего лишь в нескольких массивах и как с помощью всего лишь нескольких вызовов функций формировать изображение описываемого объекта.
Сокращение числа вызовов функций может увеличить производительность отрисовки. ° Группы атрибутов. Показывает, как запрашивать текущие значения параметров состояний и как сохранять и восстанавливать одновременно несколько связанных параметров состояний. Основы рисования 45 ° Несколько советов по построению полигональиых моделей поверхностей.
Раскрывает технические тонкости, связанные с кусочно-линейной аппроксимацией поверхностей. Читая эту главу дальше, вы должны всегда помнить, что в Орепо), если не указан иной порядок действий, при вызове команды рисования рисунок изменяется всегда. Это может показатъся очевидныль однако в некоторых системах сначала оформляется список объектов и действий для рисования. Когда данный список подготовлен, аппаратуре дастся команда на рисование элементов списка. Первый вариант называется непосредсэгеенныи графическим реясииом (грифическим режимом с прямым доступом) и принят по умолчанию в ОрепСЕ.
Кроме режима с прямым доступом, вы можете сохранить некоторые команды в список (называемый списком отображения) для последующего рисования. Режим прямого доступа обычно легче для разработки программ, но списки отображения в большинстве более эффективны. Возможно, вам захочется их использовать. тогда читайте внимательно главу 7, В ОрепСЕ версии 1.1 были введены массивы вершин. В ОрепС1 версии 1.2 было добавлено масштабирование нормалей к поверхностям (Ее ке5САее моямАе), кроме того, для функции а\огэикапаее1епепгэО была добавлена поддержка массивов вершин. В ОрепСЕ версии 1.3 в ядре появилась базовая поддержка координат текстур для набора текстур. До этого мультитекстурирование было дополнительным рашпирением ОрепС1..
В ОрепСЕ версии 1.4 стало возможным хранение координат тумана и дополнительных цветов в массиве вершин, а также рисование примитивов по массиву вершин функциями к1ии1110ганАггауэ О и к1ни1110гане1евептэ О. Основы рисования В этом разделе рассматриваются методы очистки окна при подготовке к рисованию, установки цвета обьектов, которые необходимо нарисовать, и принудительного ускорения рисования. Напрямую ни один из этих методов пе изменяет геометрические объекты, но любая программа рисования геометрических объектов связана с ними. Очистка окна Рисование на экране компьютера отличается от рисования на бумаге тем, что бумага изначально белая и мы можем сразу ее использовать для дела.
На компьютере память, хранящая изображение, обычно заполнена последним нарисованным изображениель поэтому, как правило, нужно перед началом рисования очистить ее фоновым цветом. Фоновый цвет определяется программно. Для текстового процессора это, скорее всего, будет белый цвет (цвет бумаги), на котором уже будет отображен текст. Если рисуется вид из космического корабля, перед 46 Глава 2 ° Управление состоянием и рисование геометрических обьектов рисованием звезд, планет и чужих кораблей экран нужно очистить черным цветом.
Иногда очистка совсем не нужна, например, если ато изображение внутренней части комнаты и все графическое окно занима(от стены. Если рассматривать вопрос только с этой точки зрения, вы можете спросить, почему мы говорим об очистке экрана вместо того, чтобь( просто не нарисовать прямоугольник требуемого цвета размером с окно? Во-первых, специальная команда очистки окна может быть более эффективна, чем обычная команда рисования. Кроме того, как вы увиди~е из главы 3, Орепб).