OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 63
Текст из файла (страница 63)
на ГИЯ то[с) В1Со1огтаЬ)ерэгаметег([()и(С[.епизп Гауес, ОТепиптрлате, ТУРЕ "рахат); Устанавливает параметры 66 СОСОК ТАВСЕ 5САСЕ и 66 СОСОК ТАВСЕ В1А5 для каждой таблицы цветов. Аргумент гаг)(е7 — зто одна из следующих кон- стант; 6С СОСОК ТАВСЕ, 66 Р05Т СОМЧОГ ОТ10М СОСОК ТАВСЕ или 6С Р05Т СОСОК НАТК1Х СОСОК ТАВСЕ, он указывает саму таблицу цветов. Возможные значения для рлате — это 6С СОСОК ТАВСЕ 5САЬЕ и 61 СОСОК ТАВсЕ В1А5. Значением аргумента рогат является массив из четырех значений, представ- ляющих красный, зеленый, синий и альфа-модификаторы в атой последова- тельности.
ент 5Т )СЕ, ОК сти Листинг 8.5 показывает, как с помощью таблицы цветов можно инвертировать юображение, то есть заменить каждый цветовой компонент инверсным ему. Листинг 8.5. Замещение пикселов с помощью таблицы цветов: со[оггаЫе.с ех(его бсииуте* гевЕТмабе(сопят сиаг', бсз1ке1*, бьз1зе!* ); 6ШЬуте *рпхе1з; 6Ы!гез н!итп, Ье16ЬС; хо(В (пзт(то!д) ( 1п( 1; 6(иоуте со1огТвще [256] [3); елов ых в трам продолжение,о сра- РНА, СЕ4, 6(. 61. 6[. ГЕН- 61. 61.
6( А(РНА 6( ЕОИ1МАМСЕ 6( [ОНТМАМСЕ АСРНА 6[ !МТЕМ51ТУ 61 КОВ 6[ РЕВА ц ц 1г К, Кг ц 1, б~ 6, 296 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений Листинг 8.5 (продолжение) р1хе15 = ге а01вазе (" Вата/]ееаз. Ы п", ан101П. Вне]ВЬ 1); 61Р]хе151оге1(60 ОМРАСК А(16ММЕМТ, 1); 61С1еагСо1ог(0, О, О, 0); /* Формирование таблицы инверсных цветов 'l тог (! = 0; ! < 256; ++1) ( со1огТаЫе(1) (В] = 255 - 1; со1огТаЫе(1]( 1] = 255 - 1; со1огТаЫе(!](2] = 255 - з; ) 61Со1огТаЫе(60 СОСОР ТАВ(Е. 6( РОВ.
256, 60 КОВ, 6( Вй516йЕО ВУТЕ. со1огТаЫе): 01ЕпаЫе(6( СОСОЯ ТАВСЕ); то! 0 01 зр1а у (то!0) ( 0161еаг(60 СОСОК ВВЕРЕН В1Т); 01аазтегРоз21(1, 1); 610ганРзхе15(н101Ь. Пе! Влт, 60 а6В, 60 Ой516МЕО ВТТЕ, р]хе15); В1Р1цзл(); ПРИМЕЧАНИЕ Листинг 8.5 включает в себя процедуру геао]глаоеО, введенную для упрощения структуры про. граммы. В общем, вам требуется такого рода подпрограмма, умеющая читать изображение из файла. Формат файла, понимаемого геаа]гладе(), сводится к следующим принципам: ширина изображения (и!00п) имеет тип ЯзаеЬ высота (Ье!ОЫ) — тип 6(з]зеЬ при сохранении РОВ триад (КОЛИЧЕСТВОМ Ш]ОШ х ЬЕ!ОЫ) дпя КаждОГО КОМПОНЕНта ИСПОЛЬЗуЕтея тнл Я.цоу(Е.
В дополнение к явному заданию таблицы цветов вы можете захотеть использовать изображения, созданные в буфере кадров, в качестве определения для таблицы цветов. Операция 61СоруСО1огтаЫе() позволяет указать отдельный ряд пикселов; с целью считывания его из буфера кадров для дальнейшего включения в таблицу цветов. уо]с( 61 С о руСо1 0 г Та Ы е(С( епшп (агнес, б(еп опт (птегла]гогглад С] ]пС х, С(]01 у, О(л]ге( нлг(гг!); Создает таблицу цветов из данных буфера кадров, используя их как элементы таблицы цветов. Пикселы читаются из текущего буфера 61 КЕАО ВОТРЕМ и обрабатываются как при вызове 61Сорур ! хе15 (), но без «паузы перед конечным преобразованием. Здесь применяются настройки команды 01Р1хе1Тгапзтег'(). Аргумент (атлет должен быть установлен на одну из таблиц командой к1Со1о гТаЫе () .
Для аргумента гл(егла(гоггпат используются те же символические константы, что для одноименного аргумента к1Со1огТаЫ е () . Массив цветов задается строкой буфера кадров с шириной (клг(гл) и начальной позицией (х, у). Замена всей таблицы цветов или ее части Если нужно заменить часть таблицы цветов, используйте операции В1С01ог50ЬТаЫе() и 61Сорусо1ог50ЬТаЫеО. Расширение ?тар)па Вцьзе? 297 чо((? 61СО1ог5оЬТаЬ1е(01 епшп Гатяеб О?.в(ге? ятагг, С?.в?ге? соил(, О?.епцт /оплат, О?.спцш (уре, сопя! С?.чо?т? *г?аса) Заменяет элементы таблицы цветов, начиная с элемента ягагг и заканчивая элементом зтатт + соил( — 1, значениями из массива Ната.
Аргумент Гагяет — это 61 СО(ОЙ ТАВСЕ, 61 Р05Т СОННО?ВТ10Н СОЕОР ТАВСЕ нлн 6С Р05Т СОСОЙ ИАТЙ?Х СОСОЙ ТАВСЕ. Аргументы/оп)пас и Гуретакие же, как для 6!со?огТаЫе (), но относятся к массиву !?ага. чо?т? 61сорусо1ог5оЬТаЫе(0?.епц)п Га!Вет, СЕз?ге? зтагг, С?.(пс х, С?тпг у, 61в?ге1 соипг); Заменяет элементы таблицы цветов, начиная с элемента з(аг( и заканчивая элементом згагг + свинг — 1, где соипг — количество пикселов в строке буфера кадров, начинающейся с позиции (х, у).
Пикселы преобразуются во внутренний формат (тпгегпа?йогтпа() таблицы цветов. 3Впрос значений из таблицы цветов Пнкселы, сохраненные в таблице цветов, могут быть извлечены с помощью коинды д16етсо1огтаЫе (). Подробно см, раздел «Команды запроса» приложсння Б. 3апрос на допустимость таблицы цветов Параметры-посредники (ргохтев) предоставляют способ, которым можно оценить, достаточно ли ресурсов в системе для сохранения таблицы цветов. Эти паРвиетрьт заносятся в аргумент СагВет команды В! СО1огтаЫе О: ° 6( РРОХУ СОЕОР ТАВСЕ; ° 6С РРОХУ Р05Т СОЙНОСОТ?ОН СОСОЙ ТАВСЕ; » 6С РЙОХУ Р05Т СОСОЙ ИАТР?Х СОСОЙ ТАВСЕ.
Тогда ОрепС?. определяет, хватит ли ресурсов системы для сохранения таблицы. Если она не помещается, значения ширины, формата и компонента разрешения ?станавливаются в О. Например: В!Со1огТаще(6( РЙОХУ СО(ОЙ ТАВСЕ, 6С ЙОВ, 1824, 6( РОВ, 6( ОН5?6НЕО ВУТЕ, вы)); 1!Се(Со1огТащеРагаветег)ч(6С РРОХЧ СО(ОЙ ТАВСЕ, ОС СО(ОЙ ТАВСЕ И?отН, (ж)4(П); !т (н(етн == В) М нельзя поддержать такую таблицу Более подробно команда В16етсо1огтаЫеРагаюетег» О описана в разделе «Коканды запроса» приложения Б. Свертки Свертки представляют собой фильтры, которые замещают каждый пиксел средневзвешенным значением его соседеи и собственно самого этого пиксела.
Размытне (Ыцгг?пй) и повышение резкости (з?)агрешпя) изображений, поиск границ н корректировка контраста — вот основные примеры применения сверток. 298 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений На рисунке 8.15 показано, как пиксел Р„и окружающие его пикселы обрабатываются фильтром 3 х 3, чтобы получить пиксел Р'„. Свертки — это массивы весовых значений пикселов, и оперируют они только ВСВАгпикселавии. Фильтр, известный под названием кегпе1 (ядро), является простым двухмерным массивом весовых значений.
Каждый пиксел результирующего изображения создается умножением набора пикселов входного изображения на веса свертки, а результаты суммируются. Например, на рис. 8.15 в формировании пиксела Р'„принимают участие девять пикселов исходного изображения и девять элементов свертки. Рис. 8.1В. пример свертки чоЫ 81Сопчо1ог~ опг11тег2О(СЕепшп Гагдет, С) епшп т~еглаТоппат, СЫте! вил, СЕл1хе1 Ье18йд С1.епшв )оплай С1.ешпп гуре, сопзг С1.чоЫ *йладе); Определяет двухмерный фильтр свертки, где аргумент Гсппет установлен в значение 61 СОИчОЫТ10И 20. Аргумент 1лгегла1Еоплаг определяет, над какими компонентами пикселов выполняется операция свертки, он может быть одной из 38 символических констант, перечисленных для одноименного аргумента функции 81Со1о гтаь1е О. Расширение ]шад[пд 500зет 299 Ширина (геЫЙ) и высота (Ье!8]тг) указывают размеры матрицы фильтра.
Максимально допустимые ширина и высота могут быть оценены запросом 816етсопчо[ог(опРагаиегег»(). (см. раздел «команды запроса» приложения Б.) Как и для В10гаыР ! хе1з (), формат (]о!тиас) и тип (Гуре) задают способ хранения изображения ([шаде). Подобно таблицам цветов, внутренний формат фильтра определяет, какие ком- поненты пзображения подлежат обработке. Таблица 8.9 описывает связь форма- тов с компонентами пикселов.
Обозначения В„бн В, и А, представляют компо- иеиты цвета. Обозначение 1.1 соответствует значению яркости в фильтре 6С [ОН1МАИСЕ, а ]у — значению интенсивности в фильтре 6С 1ИТЕМ51ТУ. Наконец, Вд СА Ву и А; представляют ВОВА-компоненты фильтра. Таблица 8.9. Воздействие свертки на РОВА-компоненты пнкселов Оскевиой формат фильтра Результат для альфа- компонента Результат для синего компонента Результат Результат для красного для зеленого компонента компонента А, х Ау Не изменяется Не изменяется Не изменяется Не изменяется А, х Аг А, х 1( Не изменяется А, х Ау Используйте команду В1ЕпаО)е(6С СОМЧОСОТ10М 20), чтобы разрешить приме- нение двухмерной свертки.
Листинг 8.6 демонстрирует использование нескольких 3 х 3 61 СОН1ИАМСЕ фильтров для обнаружения границ в ВСВ-изображении. Смена фильтра выпол- ияется клавишами Н,! и ч, Листинг 8.6. Использование двухмерного фильтра свертки: сопчо]ц(]оп.с ектегп 6СОЬуге* геад1маве(сопят сваг*, ОС»тте(*, 6гв!те!*); 6[иву(в 'р(хе1»; 6(т(те! нтосп, Ьетапг; П Описание фнп »тра свертки 'I 6(Ива! Ьогт коптя! [З] [З] = ( (О, -1, О), ( О, 1, В ( О, В, В ] 6[(!ва! чеггтса1[3][3] ( О, О, О ( -1, 1, О ), ( В, О, О ) продолменое Р 6[ А(РНА 6( (ВМ!МАИСЕ 61 СОМ1ИАМСЕ АСРНА 6[ 1МТЕИ51ТУ 6[ 06В 6[ 06ВА В,хг! И,х [у й,х], Вг х аг Й,хат 6,х(у 6,хС, 6, х 1! 6, х 6( 6, х 6( В, х С, Вт х С, В, 1 в, .
в, В,хВ 300 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений Листинг З.б (продолжение) 6С!1оаС 1ар1ас!ап[3) (3) = ( ( -0.125, -9.125, -0.125 ), ( -0.125, 1.0, -9.125 ], ( -0.125, -9.125, -0.125 ) чо)о 01зрсау(чо10) ( 9161еаг(61 СОСОР ВОРЕЕМ В1Т); 91йазеегРоз21(1, 1); 910ганР!хе1з(н1ОСП, Пе!ВПС, 6( ПОВ, 6С ОМ516МЕО ВЧТЕ, рзхе1з); 91Р)азп(); ) тозе 1п1С(чозд) ( рзхе1з = геа01шайе("Овса/1еедз.а1п", ан10сп, аье!Влс); 91Р1ХЕ15СОГЕ!(6С ОМРАСК А(16ММЕМТ, 1)! 9161еагсо1аг(9.9, 0.0, 9.0, 0.9); рг)птт("Горизонтальный фильтр!а"); й(Сопчосатзопрзстегза(6С СОМЧОСОТ)ОМ 20, 6С СОИ(МАИСЕ, 61 СОИ1МАМСЕ, 6С РСОАТ, Пог)сопСа1); 91Епаьсе(61 СОМЧОСОт)ОМ 20); ) чо10 Кеуаоаге(апз1йпед слаг Кеу, зпт х, !пт у) ( зн)тсл (Кеу) ( сазе 'Ь': ргзпст("Горизонтальный фильтр!а")', 91Сопча1а11опр111ег20(6С СОМЧОСОТ10М 20, 6( СОИ1МАМСЕ, 3, 3, 6( СОИ1МАМСЕ, 6С ЕСОАТ, Паг(гапта1 ); Ьгеах; саве 'ч': рг(птт("Вертикальный фильтр!а" ); 91Сапча1ат!опР111ег20( 6( СОМЧОСОТ10М 20, 61 СОИ1МАМСЕ, 3, 3, 6С СОИ)МАИСЕ, 6С РСОАТ, чегС)сас ); Ьгеах; сазе '1': рг(птт("Фильтр Папласасп"); 91Сопчо1ит!опЕ! 11ег20(6С СОМЧОСЧТ10М 20, 6С СОИ1МАМСЕ, 3, 3, 6С СЧИ1МАМСЕ, 61 РСОАТ, 1арсасзап ); Ьгеа1с; сазе 27: /* Клавиша Езс */ ах!с(0); Ьгеах; 91аСРозтйеО!зр1ау(); ) Как и в таблицах цветов, вы можете задать фильтр свертки со значениями пикселов из буфера кадров.