М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 47
Текст из файла (страница 47)
6С ОМЕ Н!М05 5ЙС АСРНА)! 91Н(пС(6С щМЕ 5НООТН Н]МТ, 6С ООМТ САНЕ); 91С(пен!ОСН(1.5); 91С!еагСо1ог(0.9, 0.0, 9.0, 9,0); Л Рисуем две диагональные линии в виде буквы Х '/ чоы О(яр!ау(чо!О) ( В]С(еаг(6С СОСОЙ ВОРРЕЙ В]Т); 91Со1ог3((9.9. 1.9, 9.9); В]Рцзлнатг(х О; а!Йотатет(-готдпзсе, О.О, О.О, О.ц; 91Вех(п(6с с1МЕ5); В(ЧегСехгт(-9.5, О.5); В!Честен)((9.5. -9.5); 9!Ело(); 91Рорнэтг(х О; продолжение р 22б Глава б ч Смешивание, сглаживание, туман и отклонение Листинг б.4 (продолженое) 91СЬ1огЗТ(9.9, 0.0, 1.9); 91Роьлна(г!х(); 91ко(а(ет(гоСАпб1е, 0.0, 0.9, 0.1); 919ев!п(6С С 1ИЕ5); 91ЧегСех2((9.5, 0.5); 91Чегеех2((-9.5, -0.5); 91Епе(); а1Рорнаег!х(); 91Е1цал(); ) чо(с[ геьларе(!пС и, !пС Ь) ( 91Н!еиРогС(9, О, (61!пС) и, (6!.!пС) Ь); 91Маег!хноае(6С РЙОЗЕСТ10И); 91(оао10епС!Су(); !г (и <= и) 91осггло20(-1.9, ).О, -).О (61!1 С)п/(61([оаС)и, 1.9'(6С(1оаС)П/(61(1оаС)и); е1ье 91иогСПЬ20(-1.9"(6С(1оаС)и/(6С(1оаС)Ь, 1.9*(61(1оаС)и/(61(1оаС)П, -1.9, 1.0)', 9]наес!хноее(6С ИООЕСН!ЕН); 91(оао1вепС!Су(): чо!Е Кеувоаго'(опа!Впее слег Кеу, !пС х, 7пС у) ( аи!Ссп (Хеу) ( саве 'г': саве 'й': гоСАп91е е= 29.; !! (гоСАпб1е >= 369.) гоСАп91е 9]оСРовеяеп!ар]ау(); Ьгеах; саве 27: /' Клавиша Еас */ ех!С(0); Ьгеак; вагап\с: Ьгеак; !пс ша!и(!пс агбс, сваг" агах) ( 91иС1п!С(йагбс.
агвч); 91о(1п!Со!ар1аунове(6СОТ 51МОСЕ [ 6[ ОТ К6В); 91оС1п!СН!поои5! хе(200, 200); 91оССгеаеей!пеон(агвч[ 9 ] ): 7п(с(); 91ЧСйеаларегипс(геьларе); Сглаживание 217 И1иСКеуЬоагбрипс(иеуЬоагб); И1иСО(зр1аурипс(бсзр1ау); И1итнасл(оор(): геСигп 0; ) Сглаживание в режиме индексации цвета Для устранения ступенчатости в режиме индексации цвета необходимо загрузить и использовать карту цветов. Так как последние 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 — возвращает значение больше единицы, мультивыборка поддержана.