М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 46
Текст из файла (страница 46)
Таким способом выявляются аеавдимгае (или скрытые) части поверхностей, не подлежащие рисованию и кочерме, соответственно, не используются при смешивании. В(ли необходимо совместить непрозрачные и прозрачные объекты в одной сцене, ауфер глубины поможет удалить невидимые поверхности любых объектов, вар(овенные непрозрачными объектами. Если непрозрачный обьект скрывает про)(ичный или другой непрозрачный объект, буфер глубины должен отсеять более уааленный объект.
Однако если прозрачный объект находится ближе, его нужно шегнать с непрозрачным объектом. Конечно, можно определить должный поря(ох рисования многоугольников, когда сцена неподвижна, но при перемещении )вблюдателя или объекта эта проблема вырастает в практически неразрешимую. 210 Глава 6 ° Смешивание, сглаживание, туман и отклонение Решение кроется в использовании буфера глубины в режиме «только для чтения» при рисовании прозрачных объектов. Сначала рису!отея все непрозрачные объекты в обычном режиме доступа к буферу глубины.
Затем устанавливается запрет на изменение значений в буфере глубины. Когда рисуются прозрачньн обьекты, их глубина также сравнивается с сохраненными в буфере значенияма для непрозрачных объектов, то есть прозрачные объекты не рисуются, если расположены за непрозрачными. Если же они ближе к точке обзора, это не отбрасывает непрозрачные объекты, так как буфер глубины не может быть изменен. Для управления режимом доступа к буферу глубины предназначена функция а10ер(ПИ а за () . Если в качестве аргумента ей передать значение 61 РАЕ 5 Е, буфер переходит в режим етолько Лля чтения», а значение 61 Тй()Е восстанавливает нормальный режим, разрешая запись. Пример использования этого метода для рисования непрозрачных и прозрачных трехмерных объектов приведен в листинге 6.3.
В данной программе клавиша а переключает последовательность анимации ца состояние, где прозрачный куб перемешается через непрозрачную сферу. Нажатие клавиши г переводит объекты в сцене в первоначальное состояние. Для получения хорошего результата при пересечении прозрачных объектов их нужно рисовать от задней грани к передней. Листинг 6.3.
Трехмерное смешивание: а(рлаЗЕ).с №Оегзпе МАХЕ 8.8 №Оетзпе И!МЕ -8.0 №оегзпе Е!МС 0.4 »сат!с (1оа1 зо1107 = МАХЕ; »за(!с 11оас 1гапзрагеп(Е = И1МЕ; »Саззс 6спзпс арпеге((»1, сооесз»1; 5(атзс чозе зпз1(чозо) ( 6С(1оас еас аресо1аг() = ( 1.0, 1.8, 1.0, 0.15 61(1оаз еаз апзп!пе»з[] = ( 100.0 ); 6((1оас роз!с!оп() = ( 0.5, 0.5, 1.0, 0.0 ); 81насегза1!ч(6С РМОМТ, 6( 5РЕСОСАН, пас зреси1аг); 81на1егза1(ч(6С РНОНТ, 61 5Н1М1МЕ55, аа1 зпзпзпееч); 81(зхпс(ч(6С 116НТО, 6С РО51Т!ОМ, ро»!(!оп); 61Епаьзе(6( С16НТ1М6); 61Епаь)е(6С (16НТВ); 81Еп»озе(6С ЬЕРтН ТЕ51)З зрпегесз»1 = 616епс!»Са(1): 81нечзс!»1(зрпеге(з»1, 61 СОИР!СЕ): 61и(5о1зз)5рпеге(8.4, 16, 16); 81Еппс! ас(); сове(!»1 = 616епсзч1»(1); 61нен(ззС(сьье(з»1, 6С СОИР!СЕ); 81и(5о1(есоье(8.6); 81Епоь(зс(); ) 212 Глава 6 ° Смешивание, сглаживание, туман н отклонение Листинг 6.3 (продолжение) зо1!бЕ =- Е1МС; сгапзрагеп(Е += 71МС; 51исро»1Йеб!»р1ау() ! ) чо!б кеуьоагб(ипз!абеб сьаг хеу, !п1 х, !пс у) ( зи!(сп (Кеу) ( сазе 'а': са»е 'А': зо1!б7 = МАХЕ: Сгапзрагеп(Е = М1МЕ; в1и1101еуипс(ап!васе); Ьгеах; сазе 'г': сазе 'Й': 5011бЕ = МАХЕ; сгапзрагептЕ = М1МЕ; 51итрозсаеб! »р1ау (); Ьгеах; сазе 27: ех!1(е); ) Ьгеа)с; ) !пт аа!п((пт агас, спаг'* агач) ( 51и11п)с(аагас, агач); а(ис)п!10!»р)аумобе(ссит ооовсе ! Осот Йов ~ 0(от 05Ртн); 51ис(п!1Н!пбои5(те(500, 500); 51иссгеа1еи! обои(агач(9) ); чп!1(); а1исаезпарегипс(ге»ларе); а1итхеуиоагбгипс(хеуьоагб); 51ито!»р1аурипс(б!»р1ау); В1исна!псоор(): ге!игл 0; Сглаживание Как вы уже могли заметить, в некоторых написанных вами программах линии на рисунках, особенно почти горизонтальные или почти вертикальные, кажутся зубчатыми.
Эта «зубчатость» возникает из-за того, что идеальная в теории линия на практике составлена из групп пикселов, которые выстраиваются на пиксельной сетке. В дг ном разделе описаны технологии для устранения втой ступенчатости (ее уменьшения). На рис. 6.2 изображены две пересекающиеся линии, как в исправленнс 1, так и в исходном виде. Изображения масштабированы для большей наглядности. Сглаживание 213 Рис. 6.2.
Ступенчатые и сглаженные линии Ни рис. 6.3 показано, что диагональная линия толщиной в 1 пиксел некоторые пвкселы перекрывает больше, чем остальные. Фактически при выполнении сглаживания ОрепС1. вычисляет значения локргытия для каждого фрагмента па осювании площади пикселов, охваченной линией.
На рис. 6.3 также приведены эти пиления покрытия для рисуемой линии. В режиме НОВА ОрепСВ умножает впвчение альфа-компонента для фрагмента на значение покрытия. Затем полувввшееся значение может быть применено лля смешивания фрагмента с соответпвующим пикселом, хранимым в буфере кадров. В режиме индексации цвета ,ОрепСВ устанавливает младшие четыре бита в индексе цвета на основе степени покрытия фрагмента (0000, если покрытие отсутствует, н 1111 — прп полном охмте).
Задачей программиста является заполнение карты цветов и использование ного свойства для получения нужного эффекта. Нодробности вычисления значений покрытия достаточно сложны, их трудно предпввнть в общем виде, так как они существенно зависимы от реализации ОрепС1.. Выработать компромисс между качеством изображения и скоростью выполнения ООИОГаЕт фуНКцИЯ 81Н1лг О; с ней полезно поупражняться, но не все реализации се поддерживают. А .040510 В .0405!О С .878469 0 .434259 Е 007639 Е 141435 6 .759952 Н 759952 1 141435 .007639 К .434259 878469 М .040510 И 040510 Рис.
6.3. Определение степени покрытия уоЫ 81НО лС(С1.епцш Гагйей С1.еппш 1ппг); Управляет рядом режимов работы ОрепСВ. Аргумент гагяег идентифицирует подконтрольный режим, его возможные значения перечислены в табл. 6.3. Аргумент лглс может принимать следующие значению ВЕ ЕА5ТЕК для отдания предпочтения скорости обработки, 6Е Н1СЕ5Т с целью постижения наивысшего качества или 6Е 00НТ САКЕ для снятия всех требований. Интерпретация 214 Глава 6 ° Смешивание, сглаживание, туман и отклонение подсказок зависит от реализации.
Некоторые реализации ОрепС1. могут на них не реагировать. Значение аргумента Гагцес 6С РЕК5РЕСТ1УЕ СОККЕСТ10М Н1МТ связано с интерполяцией значений цвета и координат текстур вдоль примитива: или линейно в пространстве экрана (относительно простые вычисления), или с нахождением правильной перспективы (что требует больших усилий). Часто системы выполняют линейную интерполяцию цвета, поскольку результаты, являющиеся технически не совсем корректными, визуально приемлемы.
Однако в большинстве случаев текстуры требуют максимально пригодную интерполяцию по перспективе. Таким образом, реализация ОрепС1. может задействовать этот параметр для управления методом интерполяции. (См. главу 3 для справки о перспективной проекции, главу 4 для получения информации о цвете и главу 9 по вопросам текстурирования.) Таблица 6.3. Значения аргумента тагрет функции д!Н)пт() Значение Применение 6( Р01МТ 5МООТН Н1МТ,ОЕ Е1МЕ 5МООТН Н1МТ, Управление качеством сглаживания точек, 6Е РОГУООМ 5МОООТН Н1МТ линий или иногоугольников 6С Е06 Н1МТ Указывает, выполнять ли вычисления при наложении тумана по пикселам (61 М1СЕ5Т) или по вершинам (6С ЕА5ТЕ5Т) Качество интерполяции координат при вычислении цветов и наложении текстур Качество и производительность автоматической генерации М1РМАР-текстур Качество и производительность сжатых текстурных изображений 66 РЕКЗРЕСТ1УЕ СОККЕСТ10М Н1МТ 6Е ТЕХТОКЕ СОМРКЕ5510М Н1МТ Сглаживание точек или линий Сглаживание в режиме ГсбВА В режиме РСВА необходимо включить смешивание.
Обычно используются сле- дующие факторы влияния: 6С 5РС АСРНА для источника и 6С ОМЕ Н1М05 5ЙС Одним из способов устранения ступенчатости для точек или линий является включение сглаживания с помощью вызова функции 61Епа(з(е О со значением аргумента6С Р01МТ 5НОООТН или 6С С1МЕ 5НООТН для точек и линий соответственно. Кроме того, функция д1Нт пт () позволяет управлять качеством сглажива.
ния. (Напомним, что размер точки и толщина линии являются настраиваемыми. Кроме того, можно создавать прерывистые линии. См. раздел «Подробно о линнях> главы 2.) Затем выполняется алгоритм, описанный в одном пз следующих разделов, в зависимости от режима работы (зсСВА или индексированных цветов). Другой техникой сглаживания точек или линий является технология мультивыборки, описанная в разделе «Сглаживание геометрических примитивов с помощью мультивыборкиь этой главы. Сглаживание 21Б А[РВА для получателя.
Альтернативный способ: если значения альфа-компонента Едя получателя установить в 6С ОМ Е, линии в местах пересечения будут более ярками. Сглаживание тем более заметно, если используются большие альфа-значе(гдя. Помните, что поскольку вы выполняете смешивание, вероятно, нужно ]честь порядок рисования, как было показано в разделе «Трехмерное смешиваане с использованием буфера глубиныю Одаако в большинстве случаев порядок рисования можно не учитывать, и это не окажет каких-то нежелательных эффектов.
Программа в листинге 6А инициализирует нужные режимы для сглаживания, а затем рисует две пересекающиеся диагональные линии. Когда программа запущена, с помощью клавиши г можно вращать линии для того, чтобы оценивать их выравнивание при различных углах юклона. Обратите внимание, что в этом примере мы обходимся без буфера глубнны и отключили его. Листинг 6.4. Сглаженные линии: аагдЬ.С зсэт!с (1оаС гоСАп91е = О.; Л Инициализируем сглаживание для режима Й6ВА, включая эльфа-смешивание, указания режима работы и толщины линии.
Выведем значения детализации и толщины линии, зависимые от реализации чо\Е !п(с(чозо) ( 6[(1оаС ча1цез(2]; 916еСР1оасч(6С С]МЕ И[ОТН 6ЙАМОСАЙ]ТУ, ча]цез); рг!пс(("6С (1МЕ И!ОТН 6ЙАМОСАЙ1ТУ равно %3.1()п", ча1цез[ В ]); 916есР1оатч(6С С!МЕ ИТОТН ЙАМОЕ, ча]цез); рг(пСГ("6С С1МЕ И]ОТН ЙАМ6Е равно %3. 1Т %3.1Г(п", ча1цез[0], ча1цез[1]); 91Епаще(6С С1МЕ 5НООТН); 91Епаще(6С ВСЕМО); 91В1епбрцпс(6С 5ЙС АСРНА.