OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 76
Текст из файла (страница 76)
Ггли используются множественные отображения, все связанные с одним изображен(ел! текстуры карты должны быть помещены в один объект текстуры. В лпстини 9.5 изобрюкения текстур уровней 0 — 5 объединены в объекте с именем Тех)числе. удвление объектов текстур Фиксируете ли вы за текстурами имена или разъединяете их с обьсктами текпур, данные текстур все еще остаются где-то среди выделенных ресурсов.
Если ]йсурсы ограничены, удаление текстур может быть единственным способол! высаобождения памяти. чо]г] а10е1ететехтигез(СЕВ]ге] и, сопзС С1.шпС Гехтиге№тех); Удаляет и объектов текстур, соответствующих именам в массиве гезтигедгатех Открепленные имена могут быть использованы повторно (например, командой 916ептехтигез()). 350 Глава 9 ° Наложение текстур Если удаляется связанная текущая текстура, это равносильно возврату к текстуре по умолчанию, как если бгя была вызвана команда к1В!пс(техгогЕО с нулем вместо указателя на гехгиге№те.
Попытки удалить несуществующие имена или нулевое имя игнорируются без генерации ошибки. Рабочий набор резидентных текстур Некоторые реализации ОрепС1. поддерживают рабочий набор высокопроизводя. тельных текстур, которые называются резидентными (гезЫепг). Обычно эти реализации нацелены на специальные аппаратные средства, выполняющие операции над текстурами, и на аппаратный кэш фиксированного объема для хранения изображений текстур. В этом случае использование объектов текстур даже больше, чем рекомендуется, так как вы в состоянии загрузить много текстур в рабочий набор и затем управлять ими.
Если совокупность текстур, требующихся приложению, не умещается целиком в кэш, часть текстур не может быть резидентна. Если вы хотите проследить судьбы ваших резидентных структур, используйте команду к16естехРагааесег'ч() для получения признака, указывающего на состояние резидентности — 6Е ТЕХТОРЕ РЕ510ЕМТ. Если вас интересует судьба сразу многих резидентных сразу, используйте команду х1Агетехсогеэкеэ! с)епс О. С1.Ьоо1еап к1Агетехгцгеэцез!Оепг(С) з!хе( и, сонэ( С).ц)пС "Гехсиге№тед СЕЬоо1еап геясйепсез) Запрашивает статус резидентности для и обьектов текстур, согласно их именам в массиве гехтигедсатея Аргумент геяс(елсез — это массив, в который возвращаются признаки резидентности в сюрядке следования имен объектов з массиве гехсиге№тея Если оказывается, что резидентны все интересующие вас объекты, функция возвращает 6О ТРОЕ, а содержимое массива гезийелсез не изменяется.
Если хотя бы одна из указанных текстур не резидентна, воз. вращается 6Е ЕАО5Е, а элементы массива гезЫепсея соответствующие нерезидентным обьектам текстур в порядке их перечисления в тех(игейсатея также устанавливаются в 6Е ЕАО5Е Заметьте, что команда к1Агетехсогеэцеэ!Оепго возвращает теку!ций статус резидеитности. Ресурсы текстур очень динамичны, и статусы могут обратиться в любое время. Отдельные реализации кэшируют текстуры при их первом исполь. зовании.
И, может быть, иногда стоит нарисовать текстуру перед тем, как проверять ее на резидентность. Если ваша реализация ОрепС1. не предоставляет рабочего набора текстур, объекты текстур всегда полагаются резидентными. В этом случае команда к1Агетехсогеэцеэ! с)епс О всегда выдаст 6Е ТРОЕ, а практической пользы от возвращас. мой информации нет. Стратегии резидентности Если вы можете создать рабочий набор текстур и хотите на этом выиграть в про. изводительности, вы должны опереться на специфику ваших реализаций Объекты текстур 351 ) е а- а- гя ь- о- >м ,ь() эу, еэ, гус яв ль- ве- кты ех- (ае- гро- ций эе- эзэ в (ие сез оз- эи- же ОрепСЕ и приложения. Например, при визуальном моделировании или в видеоиграх вы должны отпавать предпочтение производительности во всех ситуациях. Тогда вам не стоит никогда обращаться к нерезидентным текстурам.
Для таких приложений вам следует загрузить все свои текстуры при инициализации и сдежгь их все резидентными. При отсутствии достаточного количества ресурсов может потребоваться пожертвовать размерами, разрешением, глубиной детализации М1р-изображений, или вы можете использовать команду 51Тех 5 вЫ жабе* () Ыя повторного использования одной и той же памяти, выделенной под текстуры. ПРИМЕЧАНИЕ Если у аас есть несколько недолгожиаущих текстур одинакового размера, вы можете использовать команду р(Техбвшпщре*() для перезагрузки существующих объектов текстур различными иэображениями.
Эта техника «зачистки» бывает эффективнее удаления текстур и их создания заново. Для приложений, создавших текстуры «па лету», нерезидентные текстуры — неизбежность. Если какие-то текстуры востребуются чаще других, вы можетс сдеээть их объекты высокоприоритетными, тем самым увеличив их способность к Раэидентности. Удаление объектов текстур также освобождает место под другие. И наоборот, назначение объекту текстуры низкого приоритета может поставить к в ряд первых претендентов на вывод из состава рабочего набора, как неактугльвого ресурса. Для назначения приоритетов объектам текстур используется коканда 51Рг(ог)тэаеТехгигеэ(), уо(с! В1Рг(ог(Сэаетехтигеэ(С1э!хе! и, сопя( С1в!пг "Гех(иге№теэ, сонэ( Ях! апэр! "ргтоп(!еэ); Для и объектов текстур с именами, перечисленными в массиве газ(игв№теэ, присваивает приоритет резидентности согласно элементам массива ргтоггсгеэ.
Значения в массиве рПоййеэ ограничиваются диапазоном !0.0, 1.01 Нуль— зто самый низкий приоритет (такие текстуры в первую очередь превращаются в нерезидентные), а ! — наивысший приоритет. Команда не требует, чтобы все имена геэтиге№теэ были связаны с объектами текстур. Соответственно, приоритеты никак не сказываются в отношении по- ка еше не связанных объектов. Приоритет одиночной текстуре можно также присвоить командой 51ТехРэгаяегег*(), но только если она текушая и связанная. Фактически команда 1Пехра гаме Сег' () — это лишь способ установки приоритета текстуре по умольэвию. В случае равенства приоритетов текстур обычные реализации ОрепСЕ применяют стратегию самого давнего использования (!еазс гесеп(!у пзег1, ЕК()) в решении эб исключении обьекта из рабочего набора.
Если вы уверены, что вашей решгизаеыи ОрепС1. присущ именно этот алгоритм, присвойте всем объектам текстур (явные приоритеты, тем самым вы получите благоразумную 1 КП-систему лля перераспределения ресурсов текстур. Если же ваша реализация ОрепСЕ не использует принцип ЕКТ) для объектов гскстур с равными приоритетами (или вы вообще не знаете, какой принцип в нее 352 Глава 9 ° Наложение текстур заложен), воспроизведите ЕВ(3-стратегию и тщательное управление приоритетами собственными силами. Когда текстура используется (связана), вы можете поднять ее приоритет до максимального, отражая тем самым ее недавнее использование.
Затем через регулярные промежутки времени вы можете снижать ее приоритет. ПРИМЕЧАНИЕ Вероятны проблемы с фрагментацией памяти текстур, особенно если вы удаляете и заново создаете множество текстур, Хотя возможно загрузить все объекты текстур в рабочий набор, свя. зывая их в определенной последовательности, последующее связывание их в другой последовательности способно привести к тому, что некоторые текпуры станут нерезидентными. Функции текстур Во всех примерах, представленных ранее в втой главе, значения в картах текстур использовались в качестве цветов, которыми окрашивались отображаемые поверхности. Вы можете использовать эти значения также для модуляции цвета, которым поверхность была бы отрисована в отсутствие текстурирования, или для комбинирования цветов карты с оригинальными цветами поверхности.
Вы выбираете функцию текстурирования, передавая соответствующие аргументы в процедуру к1ТехЕлу«(). уо)с) к1ТехЕлчЩ(С).епшп Гагдей С).епшп рпате, ТУРЕ рагат); но(г) к1Техбпч((()у(СЕепшп гагцед С1.ешпп рпате, ТУРЕ "рагат); Устанавливает текущузо функцию текстурирования. Аргумент гагде( выбирается из 6( ТЕХТОРЕ Е1СТЕР СОМТРОС и 6С ТЕХТОРЕ ЕМН. Если значение Сагйег — 6( ТЕХТОРЕ Р1СТЕР СОМТРОС, аргументрпате должен быть задан как 6( ТЕХТОРЕ СОО В1А5, а рогат должен быть одиночным значением с плавающей запятоуь вносящим поправку (Ь(аз) в параметр уровня де. тализации отображения.