OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 11
Текст из файла (страница 11)
Команда в четвертой строке, устанавливающая текущий цвет зеленым, — лишняя. Окрашивание, освещение и затенение — отдельные темы для целой главы или большого раздела. Для рисования видимых графических примитивов достаточно только сведений об установке текущего цвета. Эта информация содержится в нескольких следующих абзацах. (См. главы 4 и 5 для получения дополнительной информации.) Для установки цвета используется команда 91СО1огЗГ О. У нее три аргумента, все вещественного типа с плавающей запятой, принимающие значения от 0,0 до 1,0.
Эти параметры по порядку задают интенсивность красного, зеленого и синего компонентов цвета. Их можно считать спецификацией смешивания цветов: 0,0 означает полное отсутствие данного компонента, а 1,0 — максимальную интенсивность данного цвета. Таким образом, код 9(со)огз((1.8, 0.8, О,О>; задает ярчайший красный цвет, который может отобразить система, без примесей зеленого или синего. Все нули определяют черный цвет, а все единицы — белый. Установка всех трех составляющих в 0,5 даст серый тон (средний между белым и черным). Ниже приведены восемь команд с описанием цвета, который они залают: 91СЬ1ог3((8.8, 0.0, 8.0); черный 91со1огзт(1.8, 8.0, 0.0); красный 91Со1аг3((8.8, 1.0, 8.0); зеленый 9>Со>огзт(1.9.
1,0, 0.0); желтый 91СЬ1ог3((8.9, 0.0, 1.0); синий 91СЬ1огзт(1.8, 0.8. 1.0); маджента 91СЬ1ог3((8.8. 1.8, 1.8>; миан 91СЬ1огзт( 1.9, 1.0, 1.8); белый Основы рисования 49 Видно, что первые три аргумента команды для задания цвета очистки к1С1еэгСо1ог() совпадают с аргументами функции х1Со1ог31(). Четвертый — это значение альфа-составляющей, описываемой в разделе «Смешивание» главы 6. Будем полагать, что значение четвертого аргумента функции а1С1еагСо1ог() равно 0,0, оно является значением по умолчанию.
Ускорение завершения рисования Как было показано в разделе «Конвейер рисования Орепбь» главы 1, современные графические системы можно представить в ниде сборочного конвейера. Центральный процессор (СР()) обрабатывает команды рисования. Возможно, другое оборудование выполняет геометрические преобразования. Выполняется отсечение, затем затенение и/или текстурирование. Наконец, значения записываются в битовые плоскости для отображения. В высокопроизводительных архитектурах за каждую из этих операций отвечает отдельный блок, специально оптимизированный для ее максимально быстрого выполнения.
В такой архитектуре СР() ие ждет окончания выполнения команды рисования для того, чтобы выполнить следующую. Пока СР() отправляет вершины далыпе по конвейеру, оборудование для преобразований выполняет преобразования предыдущего набора, выполняется отсечение набора, введенного перед предыдущим, и т. д, В системах, где СР() ждет результатов обработки команды, задержки перед обработкой следующей команды значительно снижают общую скорость конвейера.
Кроме того, приложения могут выполняться больше чем на одной машине. Например, предположим, что основная программа выполняется где-то в другом месте (на компьютере, называемом клиентом), а результат рисования отображается на вашей рабочей станции или терминале (сервере), который соединен с клиентом через сеть. В этом случае было бы чрезвычайно неэффективно посылать каждую команду по сети по очереди, так как ато вызвало бы значительные задержки. Обычно клиент перед посылкой команд группирует пх в единый пакет, К сожалению, код сетевого клиента, как правило, не позволяе~ узнать, завершила ли графическая программа рисование кадра или сцены.
В худшем случае он всегда будет ждать дополнительной команды рисования для заполнения пакета, и вы никогда не увидите результат рисования. Поэтому в Орепос существует функция ц1Г(озв(), которая заставляет клиент отправить пакет, даже если тот не полон. Если сеть отсутствует и все команды выполняются на сервере, функция ц1Г1иэв() может не оказывать никакого эффекта. Тем не менее, если вы пишете программу, которая должна работать и в сети и без сети, включите вызов а1г1изп() в конец каждого кадра или сцены. Запомните, что а1Г1изв() не ждет окончания рисования — она влечет немедленную отрисовку и, таким образом, гарантирует вызов всех ранее отложенных команд за ограниченное время, даже если больше команд рисования не поступит. Есть ряд других ситуаций, когда используется ц1Г1изп().
° В случае программной визуализации, когда изображения строятся в системной памяти и вы не хотите постоянно обновлять экран, БО Глава 2 ° Управление состоянием и рисование геометрических объектов ° Реализации, которые собирают набор команд отрисовки для компенсации начальных затрат. Приведенный выше пример сетевой передачи — олин из вариантов такого подхода. чоЫ Р1Е1изп(чоЫ); Инициирует выполнение предыдущего набора команд Орепо), гарантируя их завершение за конечный промежуток времени. Некоторые команды, например команды обмена буферами в режиме лвойной буферизации, автоматически запускают ожидающие команды по сети перед выполнением. Если к1Е1цзп() вам недостаточно, используйте к1Есп1зп(), Действие этой команды аналогично действию к1Е1изп(), но, кроме того, она ожидает извещения от графического оборудования или сигнала по сети о том, что рисование в видеобуфере закончено.
Функция к1Е!п1зПО используется, если нужно синхронизировать задачи, например быть уверенным, что трехмерное изображение уже на экране, перед использованием вывода на экран текстовой информации поверх рисунка (Пвр!ау Роз(5сг!рс). В качестве другого прнмера можно привести организацию пользовательского ввода после вывода изображения на экран. После выполнения команды к1Е1п!зп() графический процессор блокируется до получения сообщения от графического оборудования о завершении рисования. Запомните, что злоупотребление к! Есп1зп О может привести к снижению производительности приложения, особенно прн работе по сети, так как требует дополнительных подтверждений. Если для вас лостаточно функции к1Е1изп(), используйте ее, а не к1Е! п(зП ().
чоЖ к)Е! и! 5П(чо!(с); Инициирует выполнение всех прелыдуших команд ОрепС(.. Команда не возвращает управление до тех пор, пока все запрограммированное в предыдущих командах не будет выполнено. Управление системой координат Всякий раз при начальном открытии окна или послелующем его перемещении или изменении размера система управления окнами посылает соответствующие увеломления. При использовании С(.ПТ процесс увеломлений автоматизирован: вызывается функция, зарегистрированная с помощью функ![ни Р1исРезпарееипс(). Зарегистрированная функция обратной связи должна: ° восстанавливать прямоугольную область, служащую холстом лля рисования; ° определять координатную систему для рисования объектов. В главе 3 будет показано, как определить трехмерную систему координат, а сейчас мы определим простую, двухмерную систему координат, в которой можно рисовать несколько объектов.
Вызовем Р1осРезпареЕопс(гезпэре),где гезпаре()— функция, приведенная ниже в листинге 2.1. Листинг 2.1. Функция обработки изменения размеров окна чо1О геэпэре(1пС и, !пС П) ( к1Ч!еирогС(В, О, (Огэ1се)) и, (ОГэ!се!) П); Описание точек, линий и многоугольников 51 01нагг(хиосе(01 РКО)ЕСТ!ом); 01(ваи1септ~~у(); к)иОгго)0(0.0, (6гиоиЫе) ч, 0.0, (0(иоив(е) В); С1()Т передает этой функции два аргумента: ширину и высоту в пикселах нового, перемещенного н с измененным размером окна.
Функция 5101еирогС() настраивает пиксельпый прямоугольник для рисования в новом окне. Следующие три функции определяют систему координат для рисования с левым нижним углом в точке (О, О) и правым верхним углом в точке (нл Ь) (рис. 2.1). (О, О) Рис. 2.1. Система координат с уи = 50 и М = 50 Другими словами, представьте лист миллиметровой бумаги. Параметры м и Ь в процедуры геэпаре() определяют число квадратов по строкам и столбцам на этой бумаге. Затем поместим на этот лист оси координат. Функция 5100гспо20() помещает начало координат (О, О) в нижний, самый левый квадрат и назначает каждому квадрату единичный размер. Теперь нри построении точек, линий и многоугольников они появятся на этой бумаге в легко предсказуемых для нас местах. (Считаем все объекты двумерными.) Описание точек, линий и многоугольников В этом разделе описывается создание графических примитивов в Орепо)..
Все графические примитивы в конечном счете задаются с помощью вершин (оегггсеэ)— координат, определяющих точки, концы сегментов линий и углы многоугольников. Следуюп(ий раздел рассматривает отображение этих примитивов и методы управления пмп. Что такое точки, линии и многоугольники? Возможно. вы знаете математическое определение терминов точка, линия и гчногоугольлик. Данные понятия в ОрепС1. означают похожее, но не совсем то же. Первое отличие вытекает пз ограничений компьютерных вычислений.