OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 70
Текст из файла (страница 70)
ПРИМЕЧАНИЕ Это полезно для обработки видеокадров, размеры которых в общем случае произвольны. Теи не ивнев вы должны загружать видеокадры в исходное, большое изображение, с размерами в 2" текселов в каждом измерении, а для вкладываемых изображений подстраивать координаты текстуры. 324 Глава 9 ° Наложение текстур во[с[ я1тех5оываке20(С[еппш гагяег, С[да( 1еэе1, С[зпсхоДтег, С[1псуо//зег, С[л[хе[ нийЬ, С1з[ге] Ье[фи', С1.епшп /оплат, С1.ешпп гуре, сопзс С1уо[с[ "гехей); Определяет двухмерное изображение текстуры, замещающее собой существующее двухмерное изображение или его некусочный участок (в 2[) это просто прямоугольник). Аргумент (агнес должен бьгть установлен аналогично команде к1Сорутех]ваке20.
Аргументы 1еое[, /оппаг и Гуре используются аналогично к1Тех [ваке 20 () . Уровень детализации (1еэе1) — это номер уровня детализации для М1Р-отображения. Не является ошибкой задание пулевых ширины и высоты, по эффекта на изображение это никакого не производит. Аргументы/отта( и гуре описывают формат и тип данных изображения текстуры. На неполное (парциальное) изображение также влияют режимы, установленные к1Р1хЕ15Соге*() и к1Р1 хе1- Тгапзуег«(), и другие операции прн передаче пикселов. Массив гехв[з содержит данные текстуры для парцнального изображения, Ширина (ши[гЬ) и высота (Ье[дйг) — это размеры подобласти, замешающей изображение или его часть. Аргументы хоДзег и увозе( указывают смещение тексела в х- н у-направлениях — (О, 0) соответствует левому нижнему углу текстуры, — то есть положение в массиве текстуры, в которое будет помещено неполное изображение, Эта область не может включать в себя любые текселы вне изначально определенного массива текстуры.
В программе из листинга 9.3 присутствует код из листинга 9.1, модифицированный так, чтобы по нажатию клавиши 6 в существующее изображение вставлялось небольшое изображение «в шахматную клетку». (Результирующая текстура показана на рис. 9.3.) При нажатии клавиши г восстанавливается исходное изображение. Листинг 9 3 содержит две процедуры, вакеСПеск [вакез () и КеуЬоагб (), которые были основательно изменены. (См. раздел «Объекты текстур» для получения большей информации о команде к101пбтехгпге().) Рмс.
9.3. Текстура с добавленным неполным изображением Листинг 9.3. Замещение части изображения текстуры: сехзцЬ.с /' Создание клеточных текстур '/ №беттпе спеск]ва№ей1бСП 64 №беттпе спесхгвазеНе1№ПС 64 №бет[пе зиЫвв№ейтбСП 16 №бе11пе звЫвв№ене1№ПС 16 зтат[с 6(вэуте сПесх[ввзе[спесК]ввзеНес№ПС][спесх[взяей1бСП][4]; всат~с 6[оьуте зпЫва№е[зиЫва№ене!6ПС] [зиЫвааей[бСП] [4]; Описание текстуры 325 чо1и вахесьеск[вавеа(чо1и) ( !пс !.
), с; 1ог (! = В; 1 < спеск[вавене18пс; !++) ( гог () = 0; ] < <Не<К[ваней!ОСП; ]++) ( с = (((!йнхв)==В) * ((]авхв)==В))"255; спес(<[ване[1] [)][0] = (6(иоу(е) с; спеск[ваве [1] [] ] [ 2] = (бьиьуее) с: спеса[ваве[1][))[2] = (6(иЬуСе) с; спеса[ваве [ 1] [) ] [3] = (6(иЬу(е) 255; ) 1ог (! = 0; ! < аиЫвавеНе18ПС; 1++) ( гог (] = 0; ) < аиЫвавен!ОСП; ]++) ( с = (((1йах4)==в) " ((]ЙВХ4)==В))'255; аиЫваве[!][]][В) = (6(иЬуСе) с: ВЬЫваве[з][)][1] = (6(.иЬу(е) В; 5иЫваве[!][]][2) = (6[.иЬу(е) 0; 5ЬЫваве[1][]][3) = (6(иЬуСе) 255; ) !о!в хеуьоаги(ипа[впеи спаг хеу, !пс х, зпс у) ( аи)С<П (Хеу) ( саве сазе '5': В[В!потех(иге(6С ТЕХТОНЕ 20, Сехнаве); В[тех5иЫвавего(6С ТЕХТОНЕ го, В, )г, 44, аиЫваней1ОСП, аиЫвавене18ПС, 6С НОВА, 6С ОМ516НЕО ВУТЕ, аиЫваве)1 В[иСРоа(Нее!ар)ау О; Ьгеах; сазе 'г': сазе 'Н': 818!потех(иге(6С ТЕХТОНЕ 20, Сехнаве); 8)тех[вавего(66 тЕХТННЕ гв, В, 6С НОВА, сьесх[вавей!йСП, спеск[вавеНе[ВМ, О, 66 НОВА.
66 ОН5[ВНЕО Вутв, спесх[ваве): ВСЬСРоаСНеи1ар!ау(); Ьгеах; саае 27: ех1с(0); Ьгеах; ие1аи)С: Ьгеах: Напомним еще раз, что сам буфер кадров может быть использован в качестве исвчннка данных текстуры — здесь это часть изображения текстуры. Команда [ИоруТех 5 иЬ? ваве20 () читает прямоугольник пикселов из буфера кадров и за- 32б Глава 9 ° Наложение текстур мешает им часть существующего объекта текстуры. (Эта команда похожа на команды к1СоруТех1ваае20О и к1Тех5ип1ваке20О.) чо(й к1Сорутех5оп1маке20(С(.еппш Гагдей С)лпг 1еое(, Ссшг хоДзед С1ш( уорд С1.!пс х, С1.
пс у, С)л1ге1 тйгл, С1л1зе1 Ье(8)гг) Применяет данные изображения из буфера кадров для замены существующего двухмерного изображения текстуры или его некусочной подобласти. Пикселы читаются из текущего буфера ОС кЕАО ВОРЕ ЕП и обрабатываются аналогично команде к1СоруР1хе1з (), но вместо поступления в буфер кадров они помещаются в память текстуры.
К этой команде применимы установки для команды к1Р! хе1Тгапв(ег» () и другие операции при передаче пикселов. Аргумент Гагпет устанавливается аналогично команде к1Сорутех1еаае20. Аргумент 1еое1 — номер уровня детализации для М1Р-текстур. Аргументы хоДзе( и уоДзег указывают смещение тексела в х- и у-направлениях — (О, О) соответствует левому нижнему углу текстуры, — то есть положение в массиве текстуры, в которое будет помещено парциальное изображение.
Замещающее изображение берется из выровненного относительно экрана прямоугольника пикселов с координатами левого нижнего угла (х, у). Аргументы щп((л и Ье(ййг задают размеры прямоугольника подобласти. Одномерные текстуры Иногда достаточно одномерной текстуры, например, если вы рисуете текстурированные полосы и все изменения однонаправлены. Одномерная текстура ведет себя подобно двухмерной с высотой (Ае(ййг), равной 1, и без верхней и нижней границ. Все двухмерные текстуры и их подтекстуры имеют соответствующие «одномерные» процедуры-аналоги. Чтобы создать простую одномерную текстуру, используйте команду к1Тех1маке10 О.
чо1с) к1тех1маке10(С?.еппш Гагйей С(зпс (еое1, С1.пй т(егпа1гоппаб С1яие( пи«(ГЬ, С1зпс Боги(ег, С1.ели т /оппай Сйеппш (уре, сопи( С1чоп) "ГехеЬ). Определяет одномерную текстуру. Все принимаемые аргументы имеют те ке значения, что и для команды а1тех1маке20(), с той разницей, что Гелей— здесь одномерный массив. Как и раньше, ширина (влйй) или равна 2" (или 2 + 2, с учетом границ), где га — неотрицательное целое число. Вы также мо. жете применять множественное отображение и текстуру-посредник (устаио. вив аргумент (а»пег в Ос РЙОху техтОпе 10), и все так же доступны параметры фильтрации. Пример простой программы, использующей одномерную карту текстуры, приве.
ден в листинге 9.8. Если ваша реализация ОрепСВ поддерживает расширение 1та81пй ЯпЬзсг и если включен одномерный фильтр свертки (61 СОМУОСОТ1ОН 10), эта свертка применяется и к изображению текстуры. (Свертка может изменить его ширину.) Са. храняют силу и другие операции над пикселами. Для замены одномерной текстуры целиком нли части ее текселов используйм команду к1Тех5оЫмаке10().
Описание текстуры 327 ха на ко- ед С1лп( :твуюше. сти. Пик ся анало. п(ров он ювки д ;село в. ~1е20. Ар ~ты хоОз ~) соответ ве текс ту ющее из угольни 1йи Ае! екстури тура вед ~в нижн тствующ Ою текс хай С1.Ы ехеЬ); ~меют те зто гехеЬ вна 2"' (и ыта кже м ~их( устан нып арам гуры, при )нЬзе( и е .ртка при гирину. ) использу" чоЫ к1Тех5оЫааке10(С1.епшп гагВег, С1зп( 1епе1 С|ли(хо(1зег, С(л)ге! гаЫ(А, Я.еппш !огглад С1.епшп гуре, сонат С1чоЫ "гехеЬ); Определяет массив одномерной текстуры, которая замещает собой существующее целое изображение одномерной текстуры илп его некусочную область (для 1П это ряд). Аргумент !ащег должен быть установлен в значение 61 ТЕХТЬКЕ 10.
Аргументы 1епе1, 1огтаг и гуре подобны используемым для к)Тех!ааке10(). Уровень (1еге1) — это номер уровня детализации М!Р-отображения, Аргументы уогтаг и гуре описывают формат и тип данных изображения текстуры. В отношении парциального изображения также эффективны режимы, устанавливаемые командами 61Р) хе!5(оге'(), к1Р! хе1Тгапзгег*() или другими операциями при передаче пикселов.
Массив гехеЬ содержит данные текстуры для неполного изображения. Ширина (плЫ(А) — это количество замещающих текселов. Аргумент хоДзег указывает смешение тексела в существующем массиве текстуры, куда будет помещено неполное изображение. Чтобы задействовать буфер кадров в качестве источника новой одномерной текпуры или для подмены старой текстуры либо ее части, используйте команды 1)(орутех1вабе10() или к16оругех5оЫваке10(). чоЫ к16оруТех1ваке10(С1.еппш гагдег, С1.шг 1епе1, С1!и( т1егла!гогтад Я|чп( х, С?зпг у, С1 гйге! юЫЙ, С1зп( бои!ег); Создает одномерную текстуру с использованием данных буфера кадров для определения ее текселов. Пикселы читаются из текущего буфера 61 кЕА0 80Г Г ЕК и обрабатываются аналогично команде к16ору Р ! хе1з (), но вместо поступления в буфер кадров пикселы помещаются в память текстуры.
Здесь сохраняют силу установки для к1Р(хе15тоге*() и кТР! хе1Тгапз(ег*(). Аргумент Гагдег должен быть установлен в значение 61 ТЕХТпкЕ 10. Уровень детализации (1еие1), внутренний формат (тгегаа1готтаг) и границы (Ьоп!ег) задаются подобно к16оруТех1паке20(). Массив текстуры берется из строки пикселов с координатами левого конца (х, у). Ширина (гаЫ(А) указывает количество пикселов в строке. Это значение должно быть равно 2~ (или 2~ + 2, без учета границ), где т — неотрицательное целое число. чоЫ д)6оругех5оЫааке10(С|.епшп сагпег, С!.)пс 1епе1, С!зп( хоДзед С(зпг х, СПп( у, С! я!ге! геЫгл); Применяет данные изображения в буфере кадров для замены существующего одномерного изображения текстуры или ее некусочной подобласти.
Пикселы читаются из текущего буфера 6( ЯЕА0 ВЬРРЕК н обрабатываются аналогично команде д16оруР(хе1з(), но вместо поступления в буфер кадров они помещаются в память текстуры. Сохраняют силу установки для В1Р) хе|- Тгапзтег*() и других операций при передаче пнкселов. Аргумент Гагпег должен быть установлен в значение 6( ТЕХТЬРЕ 10. Аргумент 1епе! — это номер уровня детализации М!Р-отображения.