OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 75
Текст из файла (страница 75)
(За справкой о том, где взять эти программы, обращайтесь к разделу «Обучающие программы по ОрепОь от Нэйта Робинса».) Она поможет вам в экспериментах с фильтрацией при наложении текстур, и вы увидите наглядно разницу между 6с МЕАКЕ5Т и 6Е Е1МЕАк. Объекты текстур Объект текстуры хранит ее данные и делает их легко доступными. Вы можете управлять множеством текстур и возвращаться к ранее загруженным текстурам. Использование объектов текстур — обычно самый быстрый способ применения текстур, дающий хорошие результаты по производителъности, поскольку практически всегда быстрее прикрепить (для многократного использования) к тек.
стуре объект, чем непосредственно перезагружать изображение текстуры с помощью 61тех1еабе*во. Также некоторые реалиаации поддерживают ограниченный по количеству рабочий набор (чогЫпй зег) высокоэффективных текстур. Вы можете использовать объекты текстур для загрузки наиболее часто востребуемых вами текстур в эту область данных. Чтобы исполъзовать объекты текстур для своих данных текстур, выполните следующие действия. 1. Сгецерируйте имена текстур. 2. Свяжите (создайте их) объекты текстур с данными текстур, включая массивы изображений и свойства текстур. 3.
Если ваша реализация поддерживает рабочий набор высокопроизводительных текстур, поглядите, достаточно ли в нем места для ваших объектов. Если свободного пространства мало, вы можете назначить приоритеты объектам текстур так, чтобы наиболее часто востребуемые постоянно присутствовали в ра. бочем наборе. 4. Открепляйте и повторно прикрепляйте объекты текстур, делая их данные дос. тупными в нужньш момент для отображения текстурируемых моделей. Присвоение имен объектам текстур В качестве «имени» текстуры может быть использовано любое целое беззнаковге число.
Чтобы избежать дубликатов имен, обеспечьте их согласование между собой с помощью команды а16ептехтогез(). ноЫ я16ептехгигеэ(01.з1ге1 п, 01л1пГ "ГехтигеХитез)' Возвращает и неиспользуемых на данный момент имен для объектов текстур в массиве геятигеИатех Значения в этом массиве могут не быть набором последовательных целых. Объекты текстур 347 Имена в массиве тех(иге№тез помеча1отся как используемые, причем они наследуют состояние текстуры и ее размерность (11), 21) или 31)) только прп первом использовании.
Нуль — зарезервированное имя, которое никогда не возвращается функцией В16ептехтпгев О. Команда В11зтехгогео выясняет, используется ли имя текстуры. Если возврав(енное командой В16епТехгогево имя еще не было закреплено за объектом (вмзовом В1В)потех(иге()) с именем хотя бы раз, то В11втехгцге() возвращает 6( ГА(5Е. СЕЬоо)сап В11вТехтоге(СЕп(п( Гехтигейгате) Возвращает 6С ТВОЕ, если Гех(игедгате оказывается именем текстуры, которое было назначено текстуре и впоследствии не высвобождено, и возвращает 6( РА(5Е, когда Гехсиге)Оате равно нулю или это имя ненулевое и отсутствует среди выделенных текстурам имен. Создание и использование объектов текстур Создает и использует объекты текстур одна и та же команда В1В! потех(о ге ( ) . Если ИРЯ тЕКСтуРы уже было прикреплено (посредством В101ППТехти ге () ), объект ноюй текстуры создается со значешими по умолчанию для параметров изображения текстуры и ее свойств.
Последующие вызовы В1Тех1найе'(), В1Тех5иЫваВе'(), 11Сорутех1вайе*(), В1Сорутех5оЫнайе*(), 01ТехРагааетег*() и В1Ргчог111веТехгигев() сохраняют свои данные в объекте текстуры. Объект текстуры может содержать изображение текстуры и связанные и множественные изображения (если надо), включая информацию о ширине, высоте, толщине границ, внутреннем формате, размерности компонентов и свойствах текстуры. В сохраненных свойствах в том числе указываются фильтры увеличения и уменьшения, режимы обработки границ (нгарр(пя), цвет границ и приоритет текстуры. Когда в дальнейшем объект текстуры связывается повторно, его данные становятся текущим состоянием структуры.
(Замещают собой текущее состояние.) чо1г( В101пптехгоге(С1спшп Гагйег, СЕшпг гех1игеХате) Делает три вещи. Когда для гехгигеЖате используется ненулевое беззнаковое целое число, причем в первый раз, создается новый объект текстуры и ему присваивается это имя. Если обнаруживается факт предыдущего связывания имени и объекта текстуры, этот объект становится активным. Когда указывается нулевое значение аргумента гехгиге№те, ОрепС1. останавливает использование объектов текстур и возвращает неименованную текстуру по умолчанию. Если объект текстуры связывается в первый раз (то есть создается), ему назначается размерность целевой текстуры гагкег, выбираемая из 6( техтцяе 10, 6С ТЕХТОВЕ 20, 6( ТЕХТОкЕ 30 или 6( ТЕХТОВЕ СОВЕ НАР. Сразу после первичного связывания состояние обьекта текстуры идентично состоянию текстуры по умолчанию размерности гагдег.
В этом начальном состоянии свойства текстур, такие как фильтры увеличения и уменьшения, режимы обертки, цвет границы и приоритет текстуры, приобретают значения цо умолчанию. 348 Глава 9 ° Наложение текаур В программе из листинга 9.7 в теле процедуры ! и ! 1() создаются два объекта текстур.
В процедуре б! 501ау() каждый из них привлекается к воспроизведению различных четырехсторонних многоугольников. Листинг 9.7. Прикрепление объектов текстур: (ехЬ)пб.с №беГ!пе спесх1вахеи!б(П 64 №бег!пе спесх1вахеНе!Впс 64 51ас! с 6(оьусе спеск1ваке[спеск1ваВене! Впс] [спеск1вахеичбгп] [4]; атас! с 6(оьу(е о(пег!вахе [спеск1вахене! Впс] [спеск1вавеи!бсп] [4]; атас!с 61о!пс сехкаве[2]; чо!б вахеспесх1вахеа(чо(б) !пс 1, ], с; гог (! = 0; ! < спеск!аахене!Впс; !++) !ог () = О; ) < спесх!вахеизб(П; ]++) с = (((!Ввхв)==9)"((]89хв)==0))"255; спесК1вахе[!][)][9] = (6!.ОЬусе) с; спеск1ваве[!][)][1] = (6(оьусе) с; спесх1вахе[!][]][2] = (6(ооуге) с; спесх1ваве[!][]][3] = (6(ооусе) 255: с = (((!$8х19)==9)"(()йвх19)==8))'255; о(Пег1ваве[з][]][9] = (61ооу1е) с: о(пег1вахе[!][]1[ 1] = (6(ооусе) О; о1Пег1ваве[!][)][2] = (6!.иЬусе) 9; оспег1ваве [ ! 1 [ 1] [3] = (6СОЬуге) 255; ) ) чо!б !и! 1(чо!б) ( 81С]еагсо]ог(9.9.
В.О, О.В, О.О); 815пабеиобе1(6( РСАТ): 81ЕпаЬ]е(61 ОЕРТН ТЕ5Т); вахеспесК1вахеа(): 81Р!хе15(оге!(61 ОМРАСК А116МНЕМТ, 1); 816ептехсогеа(2, (ехиаве); 818чпбТех(иге(61 ТЕХТОКЕ 20, сехМаве[9]); 81техРагаве1ег!(6( ТЕХТОКЕ 20, 61 ТЕХТОКЕ ИКАР 5, 6( ССАНР); 81ТехРагавесег!(6С ТЕХТОКЕ 20, 6С ТЕХТОКЕ ИКАР Т, 61 ССАНР); 81техРагавесег!(61 ТЕХТОКЕ 20, 6С ТЕХТОКЕ НА6 Р]СТЕК, 6С МЕАКЕ5Т); В!ТехРагавесег!(6( ТЕХТОКЕ 20, 6( ТЕХТОКЕ Н1М Р1(ТЕК, 6( МЕАКЕ5Т): 81тех1вахе20(61 ТЕХТОКЕ 20, 9, 6( К6ВА, спесх1вахеи!ОСП, спесх1ваВеке!ВП(, 8, 61 МОВА, 6( ОМ516МЕО ВЧТЕ.
спесх1вахе); 819!потех(осе(6( ТЕХТОКЕ 20, 1ехиаве[1]); 81техРагаве1ег!(6( ТЕХТОКЕ 20, 61 ТЕХТОКЕ ИКАР 5, 61 ССАМР); 81техРагавесег!(61 ТЕХТОКЕ 20, 61 ТЕХТОКЕ ИКАР Т, 61 С(АМР); 81техпагаве1ег!(61 ТЕХТОКЕ 20, 6( ТЕХТОКЕ НА6 Р1(ТЕК, 6( МЕАКЕ5Т); Объекты текстур 349 31техРагаве(ег((6С ТЕХТОНЕ 20, 6С ТЕХТОаЕ Н1М Р1СТЕН, 6( МЕАВЕ5Т); ВстехЕпхс(6С ТЕХТОМЕ ЕМЧ, 6С тЕХтоаЕ ЕМЧ ЙООЕ, 6С аЕРСАСЕ); 11тех1ваае20(6С ТЕХТОНЕ 20, О, 6( Й6ВА, сьеск1вахеи(бСП, сьеск1вахейе(ВПС, О, 6С а6ВА, 6( ОМ516МЕО ВЧТЕ, о(ьег1вахе); 11Епаосе(61 ТЕХТОНЕ 20); ] чо!б б(лр1ау(чп(б) ( 3161еаг(6С СОСОЙ ВОРРЕЙ В1Т ] 6С ОЕРТН ВОРРЕН В1Т); 419(пбтехсиге(6с техтоае 20, сехмаве(0]); 319еа!п(6с ООА05); 3(техсббгб2((9.9, О.О); ВТЧег(ехЗГ(-2.9, -1.9, О.В); 9(техспогбгс(8.9, 1.О); В)Чег(ехЗГ(-2.О, 1.О, О.О); 11техсоогб2((1,9, 1.0); 91Чеггехз((9.0, 1.9, 9.8); 91техспогб2((1.9, 0.0); 91ЧегСехзг(0.0, -1.0, 0.9); 111 пб (); 91В(пбтех(иге(6( ТЕХТОКЕ 20, Сехйаве(1]); 91Веа(п(6( ООА05); 91техсоогб2((9.9, 0.0).
91ЧегСехзг(1.0, -1.0, 9.0); Е)техсоогб2((9.8, 1.0); 91ЧегСехзг(1.0, 1,0, 0.0); В)техсоогб2! ( 1. 8, 1. 0); Всчег Сехз! (2 . 41421, 1 . О, -1. 4142 1); 11ТЕХСООГб2((1,9, О.О); 91ЧЕГСЕХЗ((2,41421, -1.9, -1.41421); 91Епб О; 1151изь (); ] После каждого повторно связывания объекта текстуры вы можете врсдактироса)ъ» его содержимое. Любые команды, вызываемые вами для изменения объекта а)ображения и его свойств, изменяют содержимое текущего объекта, за которым нкреплено данное имя, равно как состояние текущей текстуры. Плистинге 9.7, после аавершения отображения б ! 50]ау (), ваши объекты все еще Осазаны с именами, содержащимися в Гех]чате(11 Будьте осторожны, чтобы не Вызвать по невнимательности подпрограмму, которая изменит данные вашего сбьекта текстуры.