OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 13
Текст из файла (страница 13)
(Помните, что если координата г не задана, то она равна О.) Координаты во втором примере — (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Негсек' ().
Но кроме этой команды существует ряд других, позволяющих определять дополнительную информацию для каждой вершины — цвет, вектор нормали, координаты текстуры или любую их комбинацию — с помощью специальных команд. Кроме того, есть несколько других команд, которые разрешено помещать между операторными скобками д1Вебзп() и 61Епо().
В табл. 2 а приведен полный список таких команд. Никакие другие команды ОрепС(. ие могут находиться между операторными скобками В1Вебт и () и к1Е по (), и вызов большинства из иих приведет к возбуждению сообщения об ошибке. Использование некоторых команд массивов вершин, Описание точек, линий и многоугольников 59 Таблица 2.3. Команды, допускаемые между операторными скобками д! Вед)п() и 9!Епб() Демствие Глава Команда Глава 2 Глава 4 Глава 4 Глава 9 9(Уегсех*() 9(СО(от*() 9((поех*() 9(5есопдапгСо(ог*П Устанавливает координаты вершин Устанавливает ВВВА-цвет Устанавливает индекс цвета Устанавливает вторичный цвет для приложений с посттекстурнрованием Задает координаты вектора нормали Задает свойства материала Устанавливает координаты тумана Устанавливает координаты текстур Устанавливает координаты текстур для мультнтекстурировання Управляет рисованием границ Извлекает массив вершин Генерирует координаты Выполняет список отображения 9(иоппа1*() 91Матепа(*() 9(ГодСоогд*() 91ТехСоогд*() 9(Мц(11техСоогд*Ц Глава 2 Глава 5 Глава б Глава 9 Глава 9 9(ЕодеР(ад*() д(АгтауЕ(епзепс() д(ЕчаКоооп1*(), 9(Еча(Розит*() 9Кай(!510, 9Кдй(1515() Глава 2 Глава 2 Глава 12 Глава 7 Однако это касается только команд ОрепОГ..
Между 91Веб! и () и ВТЕпс! (), конечно, не запрещается вставлять любые конструкции языка программирования (за исключением вышеупомянутых 91Х» () ). Например, листинг 2.4 рисует окружность. Листинг 2.4. Языковые конструкции между 91Вед1п() н 91Епс)о Лбет!пе Р1 3.1415926535В98 61!пт с!гс1е ротптз = 100; 91Вебтп(ВС С1НЕ СООР); тог (т = О. ! < стгс1е ро!псз; !»») апй1е = 2*Р1*1/стгс1е ро!птз; 91уегтех21(соз(апв!е), з!п(апй1е)); 91ЕпоО; ПРИМЕЧАНИЕ Метод рисования круга, приведенный в листинге 2М, не самый эффективный, особенно если контур нужно рисовать часто. Конечно, графические команды довольно быстры, но в данном коде для каждой вершины вычисляются углы и обсчнтываются яп() и соз().
Кроме того, добавляются затраты на выполнение цикла. )дтугим способом вычисления вершин окружности является использование команд ВЕК (См. раздел «Поверхности второго порядка; сферы, цилиндры и диски» в главе 11). Если нужно нарисовать несколько окружностей, вычислите координаты вершин один раз и сохраните их в списке отображения (см. главу 7) или используйте для рисования массив вершин.
Все команды 91уегсех» () должны находиться между операторными скобками 91Веб! и () и 91 Ело О, если только они не образуют список отображения. (Их использование в любом другом месте не даст никакого эффекта.) Если они образу- таких, как 91Епао(еС1!еп151асеО и В(уегтехРо!псегО, между 91Веб!и() и 91Епо О приводит к непредсказуемым результатам, но ошибок не генерирует, (Также непредсказуемыми результатами опасны команды 91Х» О.) Подобных ситуаций следует избегать, так как локализация ошибок довольно трудна.
60 Глава 2 ° Управление состоянием и рисование геометрических объектов /* ыептый */ /* синий '/ Управление основными состояниями В предыдущем разделе вы видели пример параметра состояния — текущий ГсСВА-цвет и то, как он связан с примитивом. ОрепСЕ поддерживает много состояний и параметров состояний. Объекты могут быть отображены с освещением, текстурированием, удалением скрытых поверхностей, туманом и другими состояниями, влияющими на их вид. По умолчанию большинство зтих состояний отключено.
Их включение может быть довольно затратным. Например, включение карты текстур почти наверняка замедлит процесс построения примитива. Однако качество изображения повысится, и рисунок будет выглядеть более реалистичным вследствие расширения графических возможностей. Для переключения большинства состояний используются две простые команды; чо(с( 91ЕпаЫе(С1.епшп сар); чо!с) 910! заЫе(С1.епиш са)з); 91ЕпаЫе Π— включает возможность, а к10! 5а01е() — выключает. Более бО значений могут быть параметрами к1ЕпаЫе О и я10! 5аЫ е О. Например, 6с Всенв (управляющее смешиванием ксВА-цветов), 6( Верти те5т(управляющее сравнением глубины и обновляющее буфер глубины), 6( Р06 (управляющее туманом), 6( с1не 5т1РРсе (прерывистые линии) и бс (16нт1н6 (управляющее освещением). ют список отображения, то исполняются лишь между 91Вея!и() и к1Епп().
(См. главу 7 для получения информации о списках отображения.) Заметьте, вершины генерируются только при использовании команд к1Че гтех «() . Во время вызова к1Че гтех «() ОрепСЕ связывает получившуюся вершину с ин- формацией о текущем цвете, координатах текстуры, векторе нормали и т. д. По- смотрите на код, приведенный ниже. Первая точка рисуется красным, вторая и третья — синим, несмотря на другие команды, определяющие цвет: 919ез!п(6( Р01нТ5); 91Со1ог3!(8.8, 1.0, 0.0); /' зеленый '/ 91Со1ог3!(1.8, 0.0, 8.0); /* красный*/ 91чегтек(...); 91Со1огзг(1.8, 1.8, 0,8); 91Со1ог3!(8.8, 8.8, 3.8), Г,1Чеггек(...): 91Чегсех(.
.): 91Епп(); Вы вправе применить любую комбинацию всех 24 вариантов команды к1Че гтех' () между 91ВеВ)п() и 91Епд(), хотя в реальных приложениях для всех вызовов достаточно одного внда. Если ваши данные о вершинах последовательные и по- вторяющиеся (например, я1601ог«О, 91Чегсех«(), к1601ог«(), к\Чегтех«О, ...), можно увеличить производительность программы за счет массивов вершин. (См. раздел «Массивы вершины) Отображение точек, линий и многоугольников 61 Также можно проверять текущее значение параметра состояния командой СБЬоо1еап к11зЕпап?ев(С? епшп сараЬ!ЙГу); Возвращает значение 61 ТРОЕ или 6? РА?5Е, в зависимости от того, включена или выключена интересуюшая возможность.