OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 45
Текст из файла (страница 45)
' Допустим, необходимо написать графический редактор и в нем имитировать кисть для сгущения красок, когда каждый мазок добавляет немного больше ' цвета к текущему цвету изображения (скажем, 10 % цвета на 90 % изображения прн каждом приходе). Для этого изображение рисуется кистью с А - 10 %, зфакторы влияния устанавливаются в 61 5РС АСРНА (для источника) и 61 РИЕ М1М05 5МС АСРНА (для получателя), Кроме того, можно изменять альфа- ' значение внутри следа для того, чтобы придать ему свойство сглаживания, кода кисть добавляет больше цвета в центре и меньше по краям (см.
раздел «Сглаживаниеа). Точно так же создается ластик путем установки цвета стирания в цвет фона. Функция смешивания, которая использует цвета источника и получателя— значения 61 Р5Т СОСОМ или 61 ОМЕ М1МР5 Р5Т СОСОМ для коэффициентов 206 Глава 6 «Смешивание, сглаживание, туман и отклонение источника и 6С 5КС СОСОЯ нли 6С ОМЕ М1МО5 5кС СОСОМ для коэффициентов получателя, — позволяет корректировать каждый компонент цвета в отдельности.
Эта операция эквивалентна применению простого фильтра; так, умножение красной составляющей на 80 %, зеленой составляющей на 40 %, а синей составляющей на 72 % имитирует просмотр сцены через светофильтр, блокирующий 20 % красного света, 60 % зеленого и 28 % синего. ° Предположим, что нужно нарисовать рисунок, составленный из трех полупро.
зрачных поверхностей на залитом фоне, частично перекрывающихся. Пусть самая дальняя поверхность пропускает 80 % цвета за ней, следующая пропус. кает 40 %, а ближняя — 90 %. Для получения этого изображения сначала рисуется фон с факторами влияния источника и получателя по умолчанию, затеи меняем коэффициенты смешивания на 6С 5КС АСРНА (для источника) Я. ОМЕ Н1МО 5 5 КС АС РНА (для получателя). Теперь рисуем дальнюю поверхность с А - 0.2, затем промежуточную поверхность с А = 0.6 и наконец ближнюю поверхность с А - 0.1. ° Если ваше оборудование имеет альфа-плоскости, можно построить объекты один раз (включая их альфа-значения), вернуться назад, а затем выполнить требуемые операции матирования и компоновки на уже полностью построен. ных объектах.
(Пример использования этой техники см. в работе Тома Даффд Сотрояд(лй .Ю Яелдегег1 1та8ез (труды конференции 81СОКАРН, 1985, с. 41 — 44.) Объекты, составляющие изображение, могут быть получены из различных источников: они могут быть построены командами Орепб), при помощи технологии трассировки лучей илн метода излучательности, реализованных в других графических библиотеках, или могут просто являться сканированными копиями. ° Задавая различные значения альфа-компонента для отдельных фрагментов изображения, можно создавать растровые изображения непрямоугольной формы. В большинстве случаев для этого нужно обнулить альфа-значение каждой «невидимой» части н присвоить максимальное (1.0) каждому непрозрачному участку.
Например, так йожно нарисовать многоугольник в форм« дерева и применить к нему лиственный орнамент. Наблюдатель сможет смотреть сквозь фрагменты прямоугольной текстуры, которые будут прозрачными, если их значения альфа-компонента равны О.
Этот метод, иногда называемый «обшивкой» (Ь1!!Ьоагг(1п8), работает быстрее, чем конструирование дерев» из «трехмерных» многоугольников. Пример приведен на рис. 6.1, где дерево является одиночным прямоугольником, способным вращаться вокруг оси ствола, как показано с помощью контуров, причем оставаясь всегда обращен. ным «лнцом» к наблюдателю.
(См. раздел «Функции текстур» главы 9 для получения более подробной информации о смешивании текстур.) ° Смешивание также применяется для сглаживания (ап11а11аз1п8), под которыя понимается технология, «разглаживающая» шероховатости во внешнем виж примитивов, рисуемых на растровом экране. (См. раздел «Сглаживание» ддз получения дополнительной информации.) Смешивание 207 г 1 М 1 1 1/ Рис. 6.1. Создание непрямоугольного растрового изображения Пример смешивания Листинг б.2.
Пример смешивания: а(р))а.с ттат)с зот (еттрт гзт = 6( ТНЧЕ; /' Инициализируем еункцно смешивания "/ иаыс чозо зпт'т(чете) ( В(Епао)е(6( ВСЕМВ); В(В1епвгцпс(6( 5ЙС АСРНА, 6Е ОМЕ Н)М05 5ВС АСРНА); 915навеноде!(6С Р(АТ); 91С1еагСа1ог(9.9, 9.9, 9.0, 9.0); о ттат!с чотп Оган(етттг!ап91е(чоттв) ( /' Рисуем желтый треугольник в левой части экрана '/ 11Вейтп(6( Тй)АМВСЕ5); В(со(огат(1.0, ).Е.
9.0, 9.)5); 91чегтехзт(9. 1, 0.9, 0.9); 91Чегтехзт (Е. 1, О. 1, 9, О); 91Чегтехзт(9.7, 0.5. 0.0); М (е (Я продолжение вх Программа, представленная в листинге 6.2, строит два перекрывающихся тре- рольника, со значениями альфа-компонента 0.75, Смешивание включено, а фак- торы влияния источника и получателя установлены в 6( 5КС АЕРНА и ОС ОМЕ В(Н05 5КС АЕРНА соответственно. При запуске программы слева появляется желтый треугольник, а затем справа рисуется циановый треугольник таким образом, чтобы они перекрывались в цен- тре окна и циан смешивался с изначальным желтым цветом. Смена порядка рисо- мния треугольников производится с помощью клавиши Е. 208 Глава б ° Смешивание, сглаживание, туман и отклонение Листинг 6.1 (лро(Толженые) 81Епб(); ) всат!с чо!б бгаий!Влттг!ап81е(чо!б) /* Рисуем ивановый треугольник в правой части экрана '/ 818ев!п(61 Т81АМ6(Е5); 81со1ог4((9.9, 1.9, 1.0, 0.75); 81ЧегсехЗТ(О.Э, 9.9, 8.8); 81Негсех)Р(8.3, 9.5, 9.0); 81ЧегсехЗТ(9.9, 8.1, 0.0): 81Епб(); чо!б б!вр1ау(чо!б) ( 8161еаг(61 Со(08 ВЧРЕЕК В!Т); !Т (1ет(Р!гэ1) ( бгаисетстг!апй)е(); бгаий!'8леТг!апй1е() ) е1ве ( бгаий!Олстг!ап81е(): бган(е(1тг!ап81е(): ) 81Р)овл(); ) чо!б гевпаре(!пс и, !пс П) ( 81Чтеирог1(8, 8, (6(э!Те!) и, (6св!ае!) П); 81иа1г!хиобе(6С РКО)ЕСТ108); 811оаб1беп(1(у(): (и <= и) 81овгспо20(9.9, 1.8, 9.8, 1.8'(6(Т1оа1)П/(6((1оа1)и); е1эе 81овгспо20(8.8, 1.9*(61(1оа1)и/(6((1оас)П, 8.0, 1.0); ) чо!б кеуьоагб(опв!Впеб сваг кеу, зпс х, !пс у) ( эи11сп (Хеу) саве '1': саве 'Т' 1етср!гвс = (1ет(Р!гэс; 81о(Ровскеб! вр1ау(): Ьгеах; саве 27: /' Клавиша Еэс '/ ех11(0); Ьгеах, бетаи11: Ьгеа)с; ) ) Смешивание 209 )а( на\ п(1п1 агхс, спаг** агвч) ( В1н(1п(1(загвс, агхч); а1н(1п! гвг ар1аунове(О(ОТ 51МОГЕ ( 6(ОТ ЙОВ); В1н11п( (И(пнои5(ге(200, 200); х1нтсгеасеи!пони(агвч(0]): (п1'1(); а1н(яеавареЕнпс(геапаре); а1н(хеуноагорнпс(кеуЬоагс); а)н(вгвр)аугнпс(оц ар(ау); В1н(иа!пгоор О: ге(нгп 0; Последовательность рисования треугольников влияет на цвет пх пересечения.
Вслучае, когда сначала рисуется левый треугольник, цпановый фрагмент (источВвк) смешивается с желтым фрагментом, который уже хранится в видсобуфере (получатель). Когда же первым рисуется правый треугольник, желтый наклады'аается на циан. Так как значения альфа-компонента равны 0.75, реальный коэффициент смешивания равен 0.75 для источника и 1.0 — 0.75 = 0.25 для получатеаа. Другими словами, фрагменты-источники слегка прозрачны, и они оказываю~ (влыцес влияние на конечный цвет, чем фрагменты-получатели. трехмерное смешивание с использованием буфера глубины )(ак было показано в предыдущем примере, порядок отрисовки многоугольников оказывает существенное влияние на результат смешивания.
При рисовании трсхкерных полупрозрачных объектов результат зависит от способа рисования много)(ельников — от задней грани к передней или от передней к задней. При опрсдемвии правильной последовательности необходимо также учесть эффект буфера глубины. (См. раздел «Удаление невидимых поверхностей» главы 5, а также пг, раздел «Тест глубины» главы 10.) Буфер глубины хранит расстояние от точки бозора до части объекта, занимающей заданный пиксел окна на экране. Если данаий пиксел принадлежит еще и другой части этого или другого объекта, он будет о)хранен только в том случае, если текущий объект находится ближе к наблюдаплю; тогда значение в буфере глубины изменится. Таким способом выявляются аеавдимгае (или скрытые) части поверхностей, не подлежащие рисованию и кочерме, соответственно, не используются при смешивании.
В(ли необходимо совместить непрозрачные и прозрачные объекты в одной сцене, ауфер глубины поможет удалить невидимые поверхности любых объектов, вар(овенные непрозрачными объектами. Если непрозрачный обьект скрывает про)(ичный или другой непрозрачный объект, буфер глубины должен отсеять более уааленный объект.
Однако если прозрачный объект находится ближе, его нужно шегнать с непрозрачным объектом. Конечно, можно определить должный поря(ох рисования многоугольников, когда сцена неподвижна, но при перемещении )вблюдателя или объекта эта проблема вырастает в практически неразрешимую. 210 Глава 6 ° Смешивание, сглаживание, туман и отклонение Решение кроется в использовании буфера глубины в режиме «только для чтения» при рисовании прозрачных объектов. Сначала рису!отея все непрозрачные объекты в обычном режиме доступа к буферу глубины. Затем устанавливается запрет на изменение значений в буфере глубины. Когда рисуются прозрачньн обьекты, их глубина также сравнивается с сохраненными в буфере значенияма для непрозрачных объектов, то есть прозрачные объекты не рисуются, если расположены за непрозрачными.
Если же они ближе к точке обзора, это не отбрасывает непрозрачные объекты, так как буфер глубины не может быть изменен. Для управления режимом доступа к буферу глубины предназначена функция а10ер(ПИ а за () . Если в качестве аргумента ей передать значение 61 РАЕ 5 Е, буфер переходит в режим етолько Лля чтения», а значение 61 Тй()Е восстанавливает нормальный режим, разрешая запись. Пример использования этого метода для рисования непрозрачных и прозрачных трехмерных объектов приведен в листинге 6.3. В данной программе клавиша а переключает последовательность анимации ца состояние, где прозрачный куб перемешается через непрозрачную сферу.