М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 12
Текст из файла (страница 12)
2.3. <Правильные» н «неправильные» многоугольники Причина, по которой ОрепСЕ вводит ограничения на правильность многоугольников, — простота создания оборудования для быстрой заливки многоугольников данного вида. Простые многоугольники могут быть закрашены со скоростью, соответствующей их простоте. А вот что трудно и не быстро — это опрелелить (для увеличения производительности), является ли многоугольник простым. Многие поверхности в реальном мире содержат непростые многоуголы|ики, не- выпуклые многоугольники или многоугольники с отверстиями.
Так как все такие многоугольники могут быть созданы путем объединения простых выпуклых многоугольников, библиотека СП1 прелоставляет возможности для построения более сложных объектов. Эти команды получают комплексное описание и разбивают объекты па группы простых многоугольников, которые могут быть нарисованы ОрспС1..
(См. раздел «Мозаичное представление многоугольников» в главе 11 для получения более подробной информации о командах разбивки.) Так как вершины в ОрепС1 всегда трехмерны, точки, задающие границы одиночных многоугольников, не нужно непременно располагать в одной пространственной плоскости. (1(онечно, ато происходит во многих случаях — например, если все координаты г нулевые или если многоугольник — треугольник,) Если вершины многоугольника не лежат в одной плоскости, после различных пространственных вращений, изменений точек обзора и проецирования на экран точки могут перестать образовывать простой многоугольник. Например, изобразим четырехугольник, вершины которого немного выходят за пределы плоскости и выглядят так, как будто они принадлежат одной плоскости.
Из него можно получить непростой многоугольник, похожий на бабочку (рис. 2.4.), который не 54 Глава 2 ° Управление состоянием н рисование геометрических обьектов гарантирует корректное отображение. Эта ситуация отражает не все проблемы, которые могут возникнуть, если вы приближаете кривую поверхность к прямоугольнику, точки которого лежат в одной плоскости. Можно решить даннукз проблему, если использовать треугольники, так как любые три точки всегда лезкат в одной плоскости. Рнс. 2.4.
Преобразование пространственного многоугольника в поверхность (сложный многоугольник] Прямоугольники Так как прямоугольники часто используются в графических приложениях, ОрепСЕ предоставляет примитив для рисования закрашенного прямоугольника, к)йес с' () . Можно рисовать прямоугольник как многоугольник, как зто описано в разделе «Рисование графических примитивов в ОрепСЕ», по функция в с йес с * () в вашей реализации ОрепС), скорее всего, оптимизирована для рисования прямоугольников. уоЫ й)йес с (згЫКТУРЕ х1, ТУРЕ у1, ТУРЕ х2, ТУРЕу2); уоЫ йсйесс(з)1г))н(ТУРЕ "в1, ТУРЕ "о2); Рисует прямоугольник, задаваемый координатами углов (х1, у1) н (х2, у2). Прямоугольник располагается в плоскости г = 0 н имеет стороны, параллельные осям.г и у. В векторной форме функпин углов задаются двумя указателями на массивы, каждый из которых содержит ~~ару (х, у).
Запоьппсте, что прямоугольник располагается в определенном месте трехмерного пространства (в плоскости ху и параллельно осям), но это можно изменить ну~ем врашения и других преобразований. (См. главу 3 для получения более |юдробной информации.) Кривые линии и кривые поверхности Любую гладкую кривую линию или поверхность можно представить — с любой степенью точности — в виде набора коротких отрезков или маленьких многоугольников.
Иозтому разбиение кривых и поверхностей на достаточное число частей с последующим представлением их отрезками или плоскими многоугольниками позволяет создавать кривые (рис. 2.5). Если у вас есть сомнения по поводу этого метола, представьте разбиение, выполняемое до тех пор, пока каждый отрезок или многоугольник не станет мснынс пиксела.
Описание точек, линий и многоугольников 55 Рис. 2.$. Аппроксимирующие кривые Так как кривые не являются графическими примитивами, ОрепО1 напрямую поддерживает их разбиение н рисование. (См, главу 12 для получения более подробной информации о рисовании кривых и поверхностей.) Задание вершин В ОрепОЕ любой геометрический объект в конечном счете описывается набором вершин. Для их определения предназначена функция я1>уеггех «О. чоЫ 81ЧегСех[234)[51(г()[у1(ТУРЕ соопЬ); Определяет вершины, используемые для описания геометрических объектов. Соответствуюшие версии функции поддерживают от двух (х, у) ло четырех координат (х, у, г, ш) на одну вер>гшну.
Если применяется версия, не используюшая координату г или ш, подразумевается, что 2 равна О, а ю равна 1. Вызов функции в1(>еггех' () имеет смысл только между операторными скобками 818ек(п() и 81Епв(). Пример использования 81чегтек «О приведен в листинге 2.2. Листинг 2.2. Правильное использование 9(Чег(ех«О 8)чеггек25(2, 3); 81уеггекЗС(в.в, 0.0, 3.1415928535898); 81уеггек4((2.3, 1.0, -2.2, 2.0); бсеочше очес((3) = (5.0, 9,0, 1992.0); 81НЕГГЕХЗВЧ(ПЧЕС1): Первый пример определяет вершину с трехмерными координатами (2, 3, О). (Помните, что если координата г не задана, то она равна О.) Координаты во втором примере — (0.0, 0.0, 3.1415926535898) (вешествецное число с двойной точностьк>). Третий пример залает вершину тремя координатами (1.15, 0.5, -1.1) в однородной системе координат. (Помните, что значения координат х, у и з делятся на значение координаты ю.) И наконец, в последнем примере, г(ьвст — указатель па массив трех вещественных чисел с двойной точностью.
На некоторых компьютерах векторная форма к1Чегтех«О более эффективна, так как графической подсистеме нужно обработать только один параметр. Специальное аппаратное обеспечение позволяет отправлять весь набор координат за один раз. Если ваш компьютер способен на такое, в ваших интересах скомпоновать ланцые, то есть упорядочить координаты вершин в памяти. В этом случае возможен выигрыш в произволительности. (См.
раздел «Массивы вершины) 56 Глава 2 ° Управление состоянием и рисование геометрических объектов Рисование графических примитивов в ОрепЯ Теперь, когда вы умеете определять вершины, вам нужно знать, как приказать ОрепбЕ интерпретировать этот набор в виде точек, линий или многоугольника. Для этого каждый набор заключается в операторные скобки — команды к1 Веб т л ( ) и 61Епо().
Аргумент функции 61Вебтп() определяет тип описываемого вершинами графического примитива. Например, в листинге 2,3 определяется набор вершин, описывающий многоугольник, показанный на рис. 2.6. Листинг 2.3. Залитый К(аеатп(61 РОСУООН); К1Негтех2( (0.0, В1Негтех2( (0,0, К1Негтех2Г (4.0, В(уегтех2( (6.О, а(Негтех2Г (4.0, К1Епе(): МНОГОУГОЛЬНИК О.В); 3.0); З.О); 1.5): О.Е); Если вместо 61 РОСУ60Н использовать 61 Р01МТ, будут определены пять точек, показанных на рис.
2.6. В табл. 2.2. приведены десять возможных значений аргумента функции В1Вебт и () и соответствующие им типы примитивов. ной В1Вебтл(С)егтцгп тот(е); Определяет начало списка вершин, описывающих графический примитив. Тип примитива указывается значением параметра тоНе, одним из перечисленных в табл. 2.2. Таблица 2,2. Значения параметра пюбе и их описания Описание Значение 61 Р01МТ5 61 Е!НЕ5 61 11МЕ 5ТК1Р 61 Е!ИЕ 100Р 61 ТК1АНОСЕ5 61 ТК1АМОСЕ 5ТК1Р 61 ТК1АНОСЕ ЕАМ 61 00АО5 66 00АО 5ТК(Р 6! РОГУООН ОС РОСКЗОИ ОС РО(НТВ Рис.
2.б. Рисование многоугольника илн набора точек Отдельные точки Каждая пара вершин задает отрезок Серия соединенных отрезков Аналогично предыдущему, причем последняя точка соединяется с первой Тройка вершин задает треугольник Рисуются треугольники с общей стороной Рисуются треугольники с общей стороной. Другой способ соединения сторон Четыре вершины задают четырехугольник Четырехугольники с общей стороной Рисуется простой правильный многоугольник Описание точек, линий и многоугольников 57 чо1й цгепв(чон1); Определяет конец списка вершин. На рис. 2.7 показаны примеры всех графических примитивов, перечисленных в табл. 2.2, с описанием пикселов, рисуемых лля каждого объекта.
Заметьте, что опрелелены дополнительные примитивы для точек, типов линий и многоугольников. Таким образоль существует множество путей рисования одинаковых примитивов. Выбранный метод зависит от набора вершин. Рис. 2.7. Типы графических примитивов 88 Глава 2 ° Управление состоянием и рисование геометрических объектов Пусть между операторными скобками В1Ведтп() и В1Епб() описано п вершин (чш чь ч„..., ч„,).
Тогда: Рисует точки в каждой п-й вершине 6С РО1йТ5 Рисуется серия несвязанных отрезков. Отрезки соединяют вершины ч, и чь ч, и ч, и т. д. Если и — нечетное, последний отрезок рисуется между вершинами ч„, и ч„ь а вершина ч„, игнорируется 6(. (1йЕ5 6( С1йЕ 5ТК1Р Рисует отрезки между вершинамн ч, и чь затем между ч, и чь н т.
д., последний отрезок — между вершинами ч,, и ч„,. Таким образом, рисуется и-1 отрезков. Нет никаких ограничений на описание вершин. Линии могут произвольно пересекаться 61 (ТКЕ СОВР Аналогично 6( (1КЕ 5ТК1Р, за исключением тога, что последний отрезок рисуется между вершинами ч,, и ч, и завершает цикл 6( ТК1Айб(Е5 Рисует серию треугольников, используя вершины чь чь чь затем чь чь чь и т. д. Если и не кратно 3, последние одна или две вершины игнорируются 6( ТК1Айб(Е 5ТК1Р Рисует серию треугольников, используя вершины ч„чь чь затем чг, чч чь (запомните порядок), затем чь чь ч, и т.
д. Порядок гарантирует, что все треугольники рисуются в одном направлении, поэтому полученная лента может корректно формировать часть поверхности. Сохранение направления важно для таких операций, как отбраковка (см. раздел «Обращение и отбраковка поверхностей многоугольников»). Значение п должно быть больше или равно 3 для того, чтобы что-то нарисовалось 6( ТК1АйбьЕ ЕАй Аналогично 6( ТКТАйб(Е 5ТК1Р, но порядок вершин чь чь чь затеи чь чь чь затеи чь чь чь и т. д. (см.
Рис. 2.7) Рисует серию четырехугольников, используя вершины чь чь чь чь затем чь чь чь чн и т. д. Если п не кратно гг, последние одна, две или три вершины игнорируются 6( ООА05 6( ООАО 5ТК1Р Рисует серию четырехугольников, начиная с чь ч,, чь чг, затем чь чь чь чь затем чь чь чь чь и т. д. (см. Рис. 2.7.) Значение и должно быть больше или равно с, чтобы что-то нарисовалось. Если п — нечетное, последняя вершина отбрасывается Рисует многоугольник, используя точки ч„..., ч„, как вершины.
Значение и должно быть больше или равно 3, иначе ничего не нарисуется. Кроме того, грани многоугольника не должны пересекаться и многоугольник должен быть выпуклым. Если вершины не удовлетворяют этим условиям, результат непредсказуем 6( РОСУбой Ограничения на испольэование д1Вед(п() и д1Епс(О Наиболее важная информация о вершинах — их координаты, указываемые командой В1Негсек' (). Но кроме этой команды существует ряд других, позволяющих определять дополнительную информацию для каждой вершины — цвет, вектор нормали, координаты текстуры или любую их комбинацию — с помощью специальных команд.