М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 11
Текст из файла (страница 11)
В этом случае было бы чрезвычайно неэффективно посылать каждую команду по сети по очереди, так как ато вызвало бы значительные задержки. Обычно клиент перед посылкой команд группирует пх в единый пакет, К сожалению, код сетевого клиента, как правило, не позволяе~ узнать, завершила ли графическая программа рисование кадра или сцены. В худшем случае он всегда будет ждать дополнительной команды рисования для заполнения пакета, и вы никогда не увидите результат рисования.
Поэтому в Орепос существует функция ц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. означают похожее, но не совсем то же. Первое отличие вытекает пз ограничений компьютерных вычислений. В любой реализации ОрспС1. все вычисления с плавающей запятой происходят с конеч- 52 Глава 2 ° Управление состоянием и рисование геометрических объектов ной точностью и имеют погрешности округления. Следовательно, координаты точек, линий и многоугольников в ОрепСБ заведомо неточны, Более существенное различие происходит из-за ограничений дисплея растрового типа.
В дисплеях минимальным отображаемым элементом является пиксел, и несмотря на то, что он может быть размером менее 1/100 дюйма, он все равно больше математического определения точки и толще математического определения линии. Когда ОрепС1. выполняет вычисления, предполагается, что точка представлена вектором чисел с плавающей запятой (вещественными числами). Однако обычно (но не всегда) точка рисуется в виде одиночного пиксела, и множество различных точек с немного различающимися координатами может быть нарисовано ОрепС(. в одном и том же пикселе. Точки Точка представляется набором вещественных чисел, называемых вершиной.
Все внутренние вычисления выполняются для трехмерных вершин. Определяемые пользователем двухмерные вершины (когда заданы только координаты х и у) также являются трехмерными, но с координатой г, равной О. ПРИМЕЧАНИЕ Орепбь работает в однородной системе координат трехмерной проекции, поэтому для внутренних вычислений все вершины представляются четырьмя координатами вещественного типа (х, у, П ьт). Если тт не равно О, зтн координаты приводятся к Евклндовым, трехмерным (х/ео у/тт, г/тх). Можно задавать координату и в командах Орепбь, но зто бывает нужно очень редко.
Если координата тх не задана, она принимается равной 1.0 (См. приложение Е для получения более подробной информации об однородной системе координат.) Линии В ОрепСБ термин линия связан с отрезком, а не с математическим термином, определяющим бесконечную линию. Сунгествует простой способ определения серии соединенных отрезков или замкнутой последовательности отрезков (рис. 2.2). Во всех случаях линии состоят из последовательности соелиненных отрезков, определяемых вершинами их концов. Рнс.
2.2. Два вида связанных линий Многоугольники Многоугольник (полигон) — площадь, ограниченная одиночным замкнутым контуром, состоящим из отрезков, определяемых вершинами пх концов. Обычно многоугольники рисуются с закрашенными внутри пикселами, но можно также их рисовать контуром или набором точек (см. раздел «Подробно о многоугольникахь).
Описание точек, линий н многоугольников 53 Обычно многоугольники бывают сложными, поэтому ОрепС1 накладывает жесткие ограничения на задание простых многоугольников. Во-первых, границы многоугольников в ОрепСЕ не могут пересекаться (в математике такие многоугольники называются простыми). Во-вторых, многоугольники в ОрепСЕ должны быть еыпук,гыни, то есть они не должны иметь «углублений». Если говорить строже, область называется выпуклой, если для любых двух точек, находящихся внутри ее, отрезок, соединяющий их, также находится внутри. На рис. 2.3 прел- ставлены примеры «правильных» и «неправильных» многоугольников.
Однако ОрепСЕ пе ограничивает число отрезков контура. Запомните, что нельзя определить многоугольники с отверстиями. Они невыпуклые, и их граница не может быть нарисована замкнутой последовательностью отрезков. Если попытаться задать невыпуклый залитый многоугольник, ожидаемого результата не получится. Это типичная ситуация — в большинстве систем, например, ничто, кроме выпуклой оболочки, нс может быть закрашено. Малравильныа Правильные Рнс.