OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 47
Текст из файла (страница 47)
Так как последние 4 бита в индексе цвета определяют степень покрытия, необходимо инициировать 16 соседних индексов цветами, изменяющимися по линейному закову от цвета фона до цвета обьекта. (Изменеиие должно начаться с индекса, кратного 16.) Затем производится очистка цветового буфера первым из этих 16 цветов гребенки, и рису!отея точки или линии с использованием данного набора индексов. В листинге 6.5 представлена програмиа, демонстрирующая создание цветовых гребенок для рисования сглаженных диний в режиме индексации цвета. В этом примере создаются два набора: один дли зеленого цвета и другой для синих теней. Листинг 6.5. Сглаживание в режиме индексации цвета: аа(лбех.с Збес(пе РАИР512Е 26 Меыне РАНР15тдат 12 сбег!пе РАИР25ТАРТ 48 иас1с 11оас госАпи1е = О.; /' Инициализируем сглаживание для режима индексации цвета, " включая загрузку зеленой гребенки, начиная с индекса ' РАИР15ТАРТ, и синей гребенки, начиная с индекса РАИР25ТАРТ.
' Количество цветов в наборе должно быть кратно 16 т/ чоьб 1п11(уо!б) ( (пС 1 сог (1 = И; 1 < РАИР512Е; 1++) ( 6С11оаС спаде; спаде = (6111оаС) 1/(6111оаС) РАНР512Е; и1ис5ессо1ог(РАНР15тАРт+(6(1пс)1, 9., злабе, О.); И1и15есСо1аг(РАИР2 5ТАРТ+(6С1пС)1. О., О., владе); И1Епаьсе(61 С1МЕ 5НООТН), И1Н(пС(6С С!МЕ 5ИООТН Н1МТ, 6С ООМТ САРЕ); И)С(пеисбСЬ( 1.5); Исссеаггпбех((бсссоаг) РАИР15ТАРТ); /' Рисуем две диагональные линии в виде буквы Х */ то(б б(зр1ау(уо1б) ( И161еаг(61 СОСОР ВОРРЕР В1Т); И11пбех! (РАИР15ТАРТ); продолжение *Р г1В Глава б ° Смешивание, сглаживание, туман и отклонение Листинг 6.5 (продолжение) 91РовЬМа(г(х(); 91йо(ате((-гоСАп91е, 0.9, 0.9, 9. 1); 91вев!п<6с с1ИЕ5); 91Чег(ех2((-9.5. 0.5); 91чегеех2Г(9.5, -9.5); 91Епб(); 91РорИатг7х(); 911пбЕХ((МАИР25ТАВТ); 91РовЬМаСГ! х (); 9)Во(аеес<гоСАпвсе, 9.9, О.О, 9.1): 919ев!п(6с с1ИЕ5); 91чегтех2Г(9.5, 9.5); 91Чег(ех21<-9.5, -9.5); 91Епб(); 91РорМатг!х(); 919105Ь(); ) чо!б гевпаре(!пС и, !пС Ь) 91Ч(еирогС(9, 9, (6Св!Хе!) и, (615!Хе!) Ь); 91МаСГ(хиобе(6С РМО)ЕЕТ10М); 91Соаб1бепС!Су(); (т (и <= Ь) 91оОгСПо20<- 1.0, 1.0, -1.9'(6СГ)оаС)Ь/(6С(1оаС)и, 1.9*<ВСГ)оаС)п/<6СГ)оаС)и); е1ве 91оОгсьо20(-1.9*(6с(1оас)и/(6с(1оас)ь, 1.9*(6сг1оас)и/(6сг1оас)ь, -1.0, 1.0); 91Ма(г!хИобе(6С МООЕСН1ЕИ); 91Соаб1бепС!Су(); Хеупоагб(опв(впеб спаг Хеу, !пС х, !пС у) чо!б ви!Ссп (Кеу) ( саве 'г'; саве 'й': гоСАГ91е += 20.; !! (Го(пп91е >= 360.) гоСАп91е = О.; 91ЬСРоьгйеб!вР1аУ(); Ьгеак; саве 27: /" Клавиша Еьс '/ ех!С(9); Ьгеах; бесаи11: Ьгеак,' ) !пс ша!п((пС агвс, спаг"* агвч) 91и(1п!С(йагвс, агвч); Сглаживание 219 Н[и(1п]101нр[ауносе(6СОТ 51НС(Е [ 6(НТ 1Н0ЕХ); Н]и(1п1(нп пиои51 ае(200, 200); Н[и(Сгеасеннпиои(агви [О] ), 1п1 С (); Н[и(аевьареЕипс(ге»наре); Н[игкеуооагогипс(кеуьоагн); Н(и(01»р[аугипс(О1»р)ау),' Н[и(на(п(оооо; гесигп Э; Тм( как цвет меняется от цвега фона к цвету объекта, сглаженные линии выглядят правильно лишь тогда, когда они рисуются на фоне.
При рисовании синей линии она затирает часть зеленой линни в точке пересечения. Для того чтобы исправить аго упущение, нужно перерисовать область пересечения линий с помощью зелено-синей гребенки (от цвета линии в видеобуфере до цвета рисуемой линии). Однико это влечет дополнительные расчеты и обычно нс имеет смысла, поскольку область пересечения невелика по размеру. Заметьте, что в режиме ВГ>ВА проблены, в общем-то, и нет, так как цвета рисуемых объектов смешиваются с цветами, хранящимися в видеобуфере.
При рисовании выровненных точек и линий в режиме индексации цвета может потребоваться включение теста глубины. В приведенном примере тест глубины выключен по той причине, что обе линии лежат в одной г-плоскости. Однако при рисовании трехмерных сцен буфер глубины необходим, так как конечные цвета пнкселов соответствуют ближайшим объектам.
Метод, описанный в разделе «Трехмерное смешивание с использованием буфера глубины», применим и для совмещения сглаженных точек и линий с несглаженными многоугольниками. Для этого сначала рисуем многоугольники, затем переводим буфер глубины в состояние «только для чтения» и рисуем точки и линии. Пусть точки и линии «пересекаются», это будет не видно за закрывающими пересечения многоугольниками. Упражнение Возьмите одну из написанных ранее программ типа руки робота или Солнечной системы из раздела «Примеры объелинения нескольких преобразований» главы 3 и нарисуйте каркасные объекты со сглаживанием.
Попробуйте сделать это вак в режиме Г«ОВА, так и в режиме индексации цвета. Также посмотрите иа реаультат изменения толщины линий и размеров точек. Сглаживание геометрических примитивов с помощью мультивыборки Усреднение по множественной выборке, или, короче, множественная выборка, нлн, еще короче, мультивыборка (щп[с[зашр![пя) — технология, привлекающая лонолпительную информацию о цвете, глубине и трафарете при сглаживании примитивов Орепо].: точек, линий, многоугольников, битовых образов и изображений. При усреднении по множественной выборке в определении цвета, глуби- 220 глава б» Смешивание, сглаживание, туман и отклонение ны и координат текстур фрагмента участвуют цвета, глубины и координаты текстур других фрагментов и никселов, согласно размеру выборки.
Вычисления проводятся не относительно неподвижного центра каждого пиксела (выборка иэ одного элемента), а отталкиваются от нескольких отсчетов (множественная выборка). Степень покрытия примитивом пиксела рассчитывается не по альфа-значениям, а на основе содержимого буфера мультивыборкн. Мультивыборка особенно хороша при сглаживании ребер многоугольников, так как она не требует строгого порядка обработки. (Но порядок рисования полупрозрачных объектов, подразумевающих использование альфа-компонентов, влияет на цвет результата.) В случаях, считающихся трудными по определению, наподобие пересечения илн прилегания многоугольников, мультивыборки следует опасаться.
Мультивыборку очень просто добавить в приложение. Это делается в три шага: 1. Инициализация окна для поддержания множественной выборки. Это делается командой СьПТ: В1ЬС1пттвтзР1аУНоее(600Т 000ВСЕ ( 600Т Р6В ( 6(0Т НВСТ15АИРСЕ): 2. После открытия окна необходимо убедиться, доступна ли мультивыборка.
То, что с помощью библиотеки САИТ можно создать окно «на любой вкус», еше не доказательспзо доступности мультивыборки в данной реализации. Если запрос параметра состояния 60 5АНРСЕ ВВГГЕР5 возвращает значение 1, а 66 5АМРСЕ5 — возвращает значение больше единицы, мультивыборка поддержана. (Запрос со значением 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ау О; ' Клавиша Евс '/ ): Альфа-компонент и покрытие мультивыборки По умолчанию мультивыборка вычисляет степень покрытия тех фрагментов, которые не зависят от значения альфа-компонента.