М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 48
Текст из файла (страница 48)
(Запрос со значением 6С 5АНРСЕ5 возвращает количество элементов выборки. Если оно равно единице, мультивыборка невозможна.) 611пт ьотз, заир\ез; В16е11птеаегч(6( 5АНРСЕ ВВГГЕР5, аьотз); В16ет)псевегч(60 5АИРСЕ5, Ввавр(ез); 3. Для активизации мультивыборки используется команда: 01Епао)е(6С НВСТ15АРСЕ): Программа из листинга 6.6 рисует два набора примитивов, демонстрируя эффект от применения мультивыборки. Процедура тлтс() проверяет, доступен ли режим множественной выборки, а затем создает два списка отображения: один в виде «солнечного колеса» из линий различной толщины и треугольников (за- ! крашенных многоугольников), и второй с «шахматным» фоном. В процедуре отэр!ау() выводится «солнечное колесо» в двух видах: с мультивыборкой (слева) и без нее (справа).
Таким образом, можно сравнить ступенчатость двух объектов. Контрастный фон иногда акцентирует зубчатость, а иногда скрадывает ее. С помощью клавиши Ь можно перерисовать изображение — с «шахматным» фоном или без него. Листинг 6.6. Применение мультивыборки: гло(1(эаглр.с зтаттс (п1 ЬВСЬВВ1е = 1; /» * Выводим параметры состояния, связанные с мупьтивыборкой. ' Создаем список отобраиения с "колесом" из линий и треугольников.
Сглаживание 221 то!а !п!с(чо(О) ( 6(!пС Ьчг, зЬчс; !пс т, 1; 61С1еагСосог(0.8, 8.0, 8.0, 8.8): 616еС1пСебегч(6с 5АМРСЕ ВОЕЕЕК5 АКВ, ВЬч!): ргтпсг("Количество буберов выборок равно ХО(п", Ьч!)! 616ес1псевегч(6с 5Амрсе5 АВВ, азьч!); рг!пСГ("Количество элементов выборки равно ХО(п", зЬч!); В!Мень!зС(1, 66 СОМЕ)СЕ); сог (! = 0; ! < 19; !++) ( 61РозлнаСгтх(); В)Котята!(368.О"(!сов!)!7 13.8, О.О. О.О, 1.0); ВссосогЗ! (1.0, 1.0, 1.0); 61(тлен!ОСЬ((т%3)<1.9): 618еВ!п(6с с1МЕ5): 61Чегтех2г(9.25, 9.95); В(чегеехгг(В.В, 8.2); 61Епо(); 61Со1огзг(9.0, 1.8, 1.0); 61Веб!п(6с ТК1АМОСЕ5); 61Чегтех2г(0.25, 0.0); 61Чегтех2г(0.3, 0.9): 61Негтех27(8.975, О.
19); 61Епо(); 61Рорнатгтх(); 61ЕпОС!зС(); 61нен(тзС(2, 6С СОМР1СЕ); 61Со)огзг(1.9, 8.5, 0.0); 61ВеВтп(6с ООА05); тог (! = 8; т < 16; !++) ( гог () = 0; ) < 16; )++) !Г (((т + )) М 2) == 8) ( 61ЧЕГСЕХ2((-2,8 + (! * 0,25), -2.8 + (1 * 8.25)); 61Негтех2Г(-2.9 + (! ° 0.25), -1.75 + () ' 9.25)); В(Чегтех2((-1.75 + (! ' 0.25), -1.75 + () * 0.25)); В(Чегтех27(-1.75 + (т * 0.25), -2.0 + () * 0.25)); ) 61Епб(); 61ЕпбСтзС(); ) /' Рисуем два набора примитивов для сравнения результатов ' при использовании мультивыборки и в ее отсутствие. ' Зтот код включает сглаживание и рисует один список отображения, ° затем отключает сглаживание и рисует второй список отображения ° / та(в Отзр1ау(чо(О) продолжение *р 222 Глава б ° Смешивание, сглаживание, туман и отклонение Листинг 6Я (про<>ряженое) ( В(С(еаг<аЕ СОЕОМ ВВРРЕВ В)т>; (! (ЬВ1оав1е) В1Св11Е(вс(2); В1Епао>е(ВЕ ИЬЕТ15АМРЕЕ АМВ); В1РивПМа!г!х О; В>тгапв(асе(<-1.В, В,О, О,О>; В1Са11(! 51(1); В\РорМасг(х(); В>В(вао(е(ВЕ М 61ривПМэсг! х () В1тгап»1аге((1 в<сапе!вт(1); 61Рорнасг!х О; В1и(5иарви((ег оет15АНРее АМВ); .В, 0,0.
О.В); »О ) ио!б КеуЬоагб(ипв!Впеб слаг Кеу, (пс х, чпс у) ( ви((сл (Кеу) ( саве 'Ь': саве 'В': Ьвсоха В(и(Ро Ьгеах; саве 27: / ех!С(в Ьгеах; бе(аи11; Ьгеаа; 1е = (ЬВ(овв1«: всаеб!вр1ау О; ' Клавиша Евс '/ ): Альфа-компонент и покрытие мультивыборки По умолчанию мультивыборка вычисляет степень покрытия тех фрагментов, которые не зависят от значения альфа-компонента. Однако есть специальные режи- В стандартной реализации возможности управления мультивыборкой весьма ограничены. Нельзя изменить число элементов выборки или задать (или даже узнать)их местоположение. Если мультивыборка включена и ее буфер присутствует, то точки, линии и многоугольники «генерируют» фрагменты, для которых выполняется сглаживание, Например, примитив точки большого размера округляется, а не выглядит как квадрат; вне зависимости от того, включен или выключен режим ОЕ Р01МТ 5ИООТН.
Состояния ОЕ Е1НЕ 5ИООТН и ОЕ РОЕУООМ 5ИООТН также игнорируются. Другие атрибуты примитивов, такие как размер точки и толщина линии, множественной выборкой не блокируются. Сглаживание 223 км, где альфа-значения для фрагментов участвуют в расчете покрытия. Ниже пе(хчислены эти режимы: ° 61 5АИРСЕ АСРНА ТО СОЧЕкАОЕ использует значение альфа-компонента фрагмента для вычисления зоны покрытия; ° 61 5АИРСЕ АСРНА ТО ОНЕ устанавливаетзначениеальфа-компонентафрагмента в гяаксилтальио возможное значение — единицу и использует это значение при вычислении покрытия; к 6С 5АИРСЕ СОЧЕНАОŠ— набор значений, установленных функцией В15аар1еСочегайе(), комбинируется (операцией И) с вычисленным значением покрытия.
Кроме того, этот режим может быть «инвертирован» посредством установки признака (претт в функции я15амр1еСочегаке О. то1г) В15ашр1еСотегабе(О!.с(ашрЕ ра1ие, 01Ъоо!еап (тегс); устанавливает значения параметров, влияющих на интерпретацию значений ильфа-компонента при вычислении покрытия мультивыборки. Аргумент оа1ие— значение покрьпия, используемое, если включен режим 61 5АИРСЕ СОЧЕРАОЕ яли 61 АСРНА ТО СОЧЕНА6Е. Аргумент 1лрегт — значение логического типа, определяющее, должно ли промежуточное значение покрытия оа1ие быть поразрядно инвертировано (логическое И). Сглаживание границ многоугольников Устранение ступенчатости ребер закрашенных многоугольников аналогично спаживанию точек и линий. Если многоугольники имеют общие границы, необюднмо смешать соответствующие значения цветов.
Это можно сделать методом, предлагаемгяги в данном разделе; другой вариант — сглаживание всей сцены с покощью буфера накопления. Работа с буфером накопления (см. главу 10) проще стояки зрения программиста, но требует большего объема вычислений и поэтому ммедляет рисование. С другой стороны, как вы дальше увидите, описываемый к«год более громоздкий. ПРИМЕЧАНИЕ Само собой, сглаживание точек нлн линий выполняется, если многоугольник рисуется в виде точек его вершин нлн ранки, то есть включен режим 6С Р01НТ нлн 6С ЫЧЕ в функции р!Ро!уропМоае0.
Цель .-того раздела — показать сглаживание ниенна закрашенного многоугольника (режим 6С Р)СС). Тюретически сглаживание многоугольника можно выполнять и в режиме КОВА, к в режиме индексации цвета. Однако пересечение многоугольников влияет на сглаживание больше, чем совпадение точек и пересечение линий, поэтому поряюк рисования и точность смешивания становятся более критичными. Фактичеаш они настолько критичны, что при устранении ступенчатости для более чем одного многоугольника необходимо упорядочить многоугольники от ближнего кдзльнему, а затем использовать функцию В1В1епбрцпс() со значениями аргументов 61 5кС АСРНА 5АТЦРАТЕ для источника и 61 ОНЕ для получателя. Соотмтственно, устранение ступенчатости многоугольников в режиме индексации кзота обычно не используется. 224 Глава б ° Смешивание, сглаживание, туман и отклонение Чтобы выровнять цвет границ многоугольников в режиме ВОВА, а значит, определить степень покрытия для границ многоугольника, нужно использовать значения альфа-компонента.
Включение сглаживания многоугольника выполняется командой я1Епао1е(6Е РОЕУ60Н 5НООТН). Тогда пикселам на границах многоугольника будут присваиваться дробные значения альфа-компонента, основанные на зоне покрытия, как если бы эти границы были просто сглаженными линиями. Также, по желанию, можно задать значение для 6Е РОЕУ60Н 5НООТН Н1МТ. Теперь необходимо «смешать» накладываюшиеся границы.
Вначале выключим буфер глубины, так как требуется управлять рисопанием пикселов, совпадающих по положению. Затем установим коэффициенты смешивания в значения 6Е 5ДЕ АЕРНА 5АТОДАТЕ (для источника) и 66 ОНЕ (для получателя). Мы хотим составить конечный цвет из цвета получателя и масштабированного цвета источника. Масштабирование осуществляется путем выбора наименьшего из входных значений альфа-компонента источника и вычтенного из единицы значения альфа-компонента получателя. Входящие пикселы получателя с большим значением альфа-компонента оказывают малое влияние на результирующий цвет, поскольку значение «1 минус альфа» близко к нулю. В итоге с помощью этого метода пикселы на границах многоугольника должны измениться в соответствии с цветами ппкселов другого многоугольника, рисуемого позже.
Наконец, нужно отсортировать многоугольники в сцене в порядке от ближнего к дальнему, перед их рисованием. Туман Компьютерные изображения иногда кажутся нереалистично четкими и ярко выраженными. Устранение ступенчатости делает объекты более реалистичными за счет размытия их границ. Крогае того, изображение можно приблизить к реальности посредством добавления тумана, который заставляет объекты постепенно «растворяться» при удалении. «Туман» вЂ” это общий термин, описывающий различные формы атмосферных явлений.
Он может употребляться при моделировании дымки, мглы, смога или загрязнения воздуха (см. цветной рисунок 9). Туман необходим в приложениях, где требуется создать ограниченную видимость. Он часто используется в авиасимуляторах. Когда туман включен, объекты, располагаюгциеся вдали от точки обзора, начинают растворяться в цвете тумана. Можно управлять плотностью тумана, которая определяет степень таяния объектов при увеличении расстояния, и его цветом. Кроме того, можно явно определять координаты на основе вершин для вычисления расстояния тумана вместо автоматического вычисления значения глубины. Туман поддерживается как в режиме КСВА, так и в режиме индексации цвета, с некоторой разницей в вычислениях.
Так как туман применяется после матричных преобразований, освещения и текстурирования, он оказывает действие на преобразованные, освещенные и текстурированные объекты. Обратите внимание, что туман способен увеличить производительность больших программ моделирования, поскольку можно не рисовать объекты, скрытые им. Туман 225 ]]се виды геометрических примитивов могут быть затуманены, включая точки и внии. Использование тумана для точек и линий также называется воздушной аерспекгпивой (с]ерС]с-сц[пй) (как показано на цветном рисунке 2).
Этот эффект входит применение в молекулярном моделировании и других приложениях. Применение тумана Моделировать туман чрезвычайно просто. Он включается с помощью команды 1[[раб!е (СС ГОС), а затем с помощью функции к! Рок* () задаются цвет и выраксйне, управляющее плотностью тумана. При желании можно задействовать значение 61 Г06 Н1МТ в функции К! Н ! и! (), как описывалось в табл.