Мип маппинг что это
Mipmapping
Mipmapping (mip-mapping, mip-текстурирование или мипмеппинг) это метод уменьшения объема вычислений необходимых для точного наложения текстурного изображения на полигон. Простейший метод наложения текстур называется point-sampling (single point-sampling или поточечная выборка). Суть его в том, что для каждого пикселя, составляющего полигон, вы выбираете один тексель из текстурного изображения.
Этот метод очень неточен и результатом его применения является появление неровностей (aliasing — качество изображения ухудшается). А именно, всякий раз, когда пиксели больше по размеру, чем тексели, наблюдается эффект мерцания. Этот эффект имеет место, если часть полигона достаточно удалена от точки наблюдения, так, что сразу много текселей накладываются на пространство, занимаемое одним пикселем.
Заметим, что если полигон расположен очень близко к точкем наблюдения и тексели больше по размеру, чем пиксели, мы можем наблюдать другой тип ухудшения качества изображения (aliasing — алиасинг). В данном случае, изображение начинает выглядеть блочным. Этот эффект имеет место, когда текстура может быть достаточно большой, но ограничение в виде доступного разрешения экрана не дает возможности правильно представить исходое изображение.
На самом деле, mipmapping не может предотвратить такого рода эффекты ухудшения качества изображения; ничто не может помочь в этом случае, за исключением использования больших по размеру (т.е. имеющих более высокое разрешение) текстурных изображений или использование специальной техники, называемой «detail textures» (детализированные текстуры). Метод mipmapping разработан с целью помочь избавиться от первого типа ухудшений изображений или алиасинга, когда несколько текселей накладываются на один пиксель. Проблема тут в том, что если вам требуется правильным образом вывести на экран пиксель, вам необходимо скомбинировать значения ВСЕХ текселей, которые накладываются на пиксель. Разумеется, вы не можете сделать этого, если выбираете лишь один тексель. При этом, вам не хочется делать выборку по ВСЕМ текселям, потому что это слишком большой объем работы для правильного вывода на экран всего одного пикселя.
Метод mipmapping снижает объемы работы за счет генерирования и хранения множество версий исходного текстурного изображения, каждая из версий которого имеет все меньшее и меньшее разрешение (таким образом эффективнее используя «большие» тексели). Когда происходит текстурирование пикселя, вам нужно выбрать версию текстурного изображения, которая имеет необходимый размер текселей (относительно размера пикселя).
Если вы создаете неподвижное изображение, вы можете просто выбрать один ближайший тексель и использовать его. Однако, если вы создаете анимацию или движущееся изображение, результатом такого выбора будет серьезное ухудшение качества изображения (снова мерцание), в следствии того, что при медленном движении тексель выбранный для пикселя может «перескакивать» с одного места на другое при смене кадров.
Кстати, такое усреднение отнюдь не является простым, а скорее наоборот сложным: чем ближе тексель находится по отношению к пикселю, тем большее влияние на конечное значение усреднения он оказывает (и наоборот).
Получается, что трилинейный мипмеппинг это лучшее, что может быть?
Нет конечно. Видно, что проблема не только в соотношении размеров пикселя и текселя, но также и в форме каждого из них (или, что бы быть более точными, в соотношениях форм).
Метод mip-текстурирования лучше всего работает для полигонов расположенных прямо «лицом к лицу» к точке наблюдения. Объясняется это тем, что каждая версия mip-текстуры получается в результате сокращения в четыре раза набора текселей, составляющих текстуру с более высоким разрешением, для получения текстуры с более низким разрешением.
Однако, полигоны, косонаправленные по отношению к точке наблюдения искривляют накладываемую текстуру так, что на пикселы могут накладываться различного вида и квадратичные по форме области текстурного изображения. Метод mip-текстурирования не принимает это во внимание и в результате наблюдается эффект слишком сильного размытия текстурного изображения, так, будто использованы неправильно выбранные тексели. Для решения этой проблемы вы должны делать выборку из большего количества текселей, составляющих текстуру, и выбирать эти тексели следует принимая во внимание «отображенную» форму пикселя в текстурном пространстве. Эта техника называется «anisotropic filtering» (анизотропная фильтрация). Обычное mip-текстурирование называется «isotropic» (изотропное или однородное), потому что мы всегда фильтруем вместе квадратные области, состоящие из текселей. Анизотропная фильтрация означает, что форма области из текселей, которую мы используем меняется в зависимости от обстоятельств. Anisotropic: «an» = not (не); «iso» = uniform (постоянная); «tropic» = shape (форма).
Кстати, архитектура Talisman от Microsoft может в некоторой степени осуществлять анизотропную фильтрацию, таким образом обеспечивая несколько лучшее качество текстурированного изображения. Имеено эта архитектура легла в основу графического чипсета от Fujitsu — Marqius 2000.
Заметим, что использование большего количества текселей при фильтрации требует соответствующего повышения пропускной способности текстурной памяти. Напомним так же, что все описанные выше вычисления должны выполняться для каждого пикселя из каждого прорисовываемого на экране полигона, или по меньшей мере для каждого пикселя в изображении.
Дополнительную информацию по данной теме можно прочитать здесь и здесь.
Мипмап (MipMap) и Мипмаппинг (MipMapping)
Мипмапы (MipMaps) или Мип-карты — предрассчитанный, оптимизированный набор изображений связанных с одной текстурой и предназначенный для увеличения скорости рендеринга и улучшения качества изображения.
Каждое следующее изображение в наборе вдвое меньше предыдущего. То есть самое первое имеет размер равный размеру текстуры, второе вдвое меньший, третье — вчетверо и т.д. до размера 1х1 тексель.
Смысл такого вот предрассчитанного набора состоит в том, что при текстурировании будет выбираться изображение с наиболее подходящим размером.
Предположим, что на модель натянута текстура размером 1024х1024. Модель стоит далеко от камеры и геометрические размеры на экране у нее малы (скажем 3 пикселя)
При отключенном мипмапинге видеокарте придётся выбирать, какой тексель из большой текстуры будет использован для расчёта цвета точки. Этот выбор может меняться при изменении ракурса камеры, что приведёт к мерцанию объектов вдали.
При включенном мипмапинге видеокарта выберет более подходящий размер текстуры, и будет производить выборку из него, что избавит нас от артефактов изображения.
При применении Трилинейной Фильтрации или Билинейной Фильтрации с мипмапингом можно получить более размытые текстуры на поверхностях вдали или под углом. Для улучшения качества желательно применять Анизотропную Фильтрацию.
Использование мипмапинга также повышает быстродействие, так как более эффективно используется текстурная кэш-память видеокарты, и меньше данных приходиться передавать по шине.
Генерацию мип-уровней можно сделать несколькими способами:
- Самое простое, это указать видеокарте сгенерировать мип-уровни, но качество не будет очень хорошим, так как для генерации, скорее всего, будет использоваться простой Box фильтр.
Ещё один вариант требует намного больше труда, чем предыдущие два. Он заключается в рисовании всех мип-уровней вручную. В зависимости от опыта художника качество может измениться в ту или иную сторону.
Что такое Мипмап (MipMap) и Мипмаппинг (MipMapping)?
MIP-MAP Filtering в процессе выполнения приложения
При разработке игр, программисты отвечающие за графику, всегда пытаются достичь наибольшей реалистичности создаваемых ими объектов. Самый простой способ — применить технологию наложения текстуры на объект (texture mapping). Значительно усиливая реалистичность восприятия создаваемой сцены, этот способ, в то же время, вызывает целый ряд новых проблем. Наиболее заметной проблемой при наложении текстур, является проблема визуальных искажений изображения возникающая из-за цифровой дискретизации всех используемых в компьютере изображений (aliasing artifacts). Эти искажения становятся особенно заметными тогда, когда наблюдаемый полигон с наложенной текстурой находится на некотором расстоянии от точки наблюдения. Если вы начнете быстро передвигаться внутри своего виртуального мира, то данные искажения будут проявляться в виде мерцания и появления паразитных бликов на поверхности текстуры. Или, в случае если вы находитесь в неподвижном состоянии, вы заметите искажения в виде паразитных муаров и узоров на поверхности полигона, который вы только что «обтянули» текстурой. Это хорошо заметно на Рисунке 1, когда по мере увеличения дистанции от точки наблюдения, мы замечаем значительные искажения строгих геометрических фигур на текстуре.
Технология MIP-mapping (MIP текстурирование) сглаживает отрицательные визуальные проявления данной проблемы и делает искажения менее заметными. Акроним MIP происходит от латинского «multum in parvo«, означающего «множество в малом» или «много вещей на одном пятачке». Для общего образования отметим, что по информации из OpenGL RedBook термин «mipmap» был предложен для использования Ланцем Вильямсом (Lance Williams) в 1983 году, когда на SIGGRAPH’83 он рассказал идею этой новой техники в своем докладе «Pyramidal Parametrics». Правда, Lance Williams использовал несколько инуюрасшифровку термина, а именно: «multim im parvo«, так что не удивляйтесь, если встретите и такую транскрипцию. По другой версии исследователи из Нью-йоркского технологического института впервые применили данный термин в 1979 году, для того, что бы описать технологию преобразования и сжатия множества пикселей в одну малую, специальным образом сформированную текстуру или карту, известную как MIP-map.
Для того, что бы увидеть насколько улучшается визуальная чистота изображения, достаточно поглядеть на Рисунок 2, который показывает эффект от применения MIP-mapping c билинейной фильтрацией (bilinear filtering).
Для того, что бы понять, что же вызвало проблемы, показанные на
Рис.1, вы должны заглянуть внутрь процесса наложения текстуры на объекты и понять каким образом процесс дискретизации текстур влияет на конечное изображение, выводимое на экран монитора. Посмотрите на Рисунок 3а, на котором синусоида дискретизируется внешним сигналом со значительно большей частотой. Видно, что мы можем получить достаточно точную копию исходной синусоиды, если восстановить значения амплитуды каждого из сэмплов при частоте внешнего сигнала. Однако, если частота внешнего сигнала (частота дискретизации) будет равна удвоенной частоте синусоиды (Рис. 3b), то возможны моменты (при равенстве фаз, например), когда моменты дискретизации будут совпадать с моментами прохождения исходной синусоиды через нуль, в результате чего данный сэмпл будет неинформативен. Применение частоты дискретизации меньше удвоенной частоты исходного сигнала (Рис. 3с) приведет к тому, что сигнал, восстановленный из значений полученных сэмплов, будет синусоидой с частотой меньшей, чем у исходного сигнала. Исходя из изложенного, мы можем предположить, что частота дискретизации должна быть, по крайней мере, в два раза больше частоты дискретизируемого сигнала. Данное соотношение известно под названием предел Найквиста (В России, данное соотношение носит название теоремы Котельникова. Прим. переводчика).
И все же, откуда происходит это, кажущееся магическим число, равное значению удвоенной частоты сигнала необходимого для дискретизации? Для того, что бы получить ответ, мы должны заглянуть чуть глубже и рассмотреть ряд Фурье.
Знакомство с рядом Фурье
Полное изложение вопросов теории Фурье, может запросто занять несколько отдельных книг, поэтому для тех из вас, читатели, кто не особо утруждался на лекциях по ТЭРЦ (теории электро-радио цепей) в институте, я могу предложить почитать книгу Брейсуэлла, ссылка на которую дана в конце статьи. Что же касается самой статьи, то в ней будет изложено очень сжатое введение в теорию преобразований Фурье, но этого должно быть достаточно для того, что бы понять из чего вытекает значение предела Найквиста (Котельникова).
Рисунок 4а показывает вид функции h(t)=sinc 2 x и ее представление рядом Фурье H(f). Для удобства будем считать, что H(f) это ряд Фурье (или частотный ряд), а h(t) временной ряд. (Если вас интересует, почему я выбрал в качестве функции именно sinc 2 x, просто потому, что она имеет наиболее простое графическое представление в частотном ряду). Для того, что бы перейти от временного ряда к частотному в теории Фурье применяется следующее преобразование:
Результат преобразования h(t) последовательности импульсов представленных функцией s(t) показан на Рисунке 4с. Во временном ряду преобразования напоминают перемножение h(t) и s(t), тогда как в частотном ряду (ряду Фурье) результатом является конволюция H(f) и S(f).
Конволюция двух любых функций f(x) и g(x) представляется формулой:
Если попытки подстановки в формулу 4 результатов функций h(t) и s(t) преобразованных по Фурье вызывают у вас головную боль и желание пропустить эту «мыльную» статью (стр.72 Ноябрьского выпуска Game Developer), то все же задержитесь на секунду — все не так сложно, как кажется. Конволюция единичного импульса в момент времени t=t0 измененного по h(t) это ничто иное, как значение h(t) смещенное на позицию времени t=t0.
Применим Формулу 5 для нахождения конволюции H(f) и S(f).
Как видим, эта формула показывает нам, что результат конволюции это функция H(f) с образами разнесенными на величину интервала 1/Ts, как раз то, что мы видим на Рис. 4с. Спектр функции sinc 2 x не является бесконечным, т. е. имеет вполне определенные ограничения частоте до fmax. Мы так же знаем, что частота это величина обратная периоду. Отсюда, единственное требование, которое мы должны удовлетворить, что бы избежать искажений, это не допустить перекрывающихся областей в частотном ряду, т. е. обеспечить соотношение fs>2fmax, где fs=1/Ts. Это то, откуда и взялся предел Найквиста (Котельникова). Как можно заметить из Рис. 4d, если частота дискретизации будет ниже 2fmax, то рядом лежащие спектральные области перехлестнутся, и частотные составляющие данных областей будут безвозвратно утеряны в результирующем сигнале. Однако, вместо того, что бы исчезнуть полностью, эти высокочастотные гармоники, появляются на низких частотах в виде паразитных гармоник, отзвуков на исходные гармоники (aliases). Вот, откуда появился термин — aliasing. Для того, что бы избежать этих отзвуков, необходимо либо сузить полосу, занимаемую сигналом, подлежащим дискретизации до величины меньшей 2fs, либо установить частоту дискретизации в два раза выше максимально возможной частоты дискретизируемого сигнала 2fmax.
Основы MIP-mapping (MIP текстурирования)
Давайте посмотрим, как MIP-mapping позволяет уменьшить искажения вызываемые дискретизацией изображения (aliasing artifacts) на примере изображения. Помните, наложение текстур на объекты в сцене применяется исключительно для придания большей реалистичности создаваемым объектам. Однако, все мелкие детали изображения в текстуре это всегда наиболее высокочастотные компоненты, и они же и являются источником aliasing problems. Так, как реально мы не можем изменить частоту дискретизации (1/DU и 1/DV в визуализирующей части нашего игрового движка), то мы вынуждены будем отфильтровать (filtering) наши текстуры таким образом, чтобы убрать высокочастотные составляющие нашего изображения.
* Примечание переводчика: при использовании двумерных текстур в трехмерном пространстве, возникает необходимость использования двумерной координатной системы текстуры внутри существующей трехмерной координатной системы X, Y, Z. Для того, что бы разделить между собой эти координаты, разработчики ввели дополнительные обозначения двумерных координат U и V для текстур. Также был введен параметр W для того, чтобы расширить пространство Евклида (X, Y, Z) до неевклидова гомогенного (X, Y, Z, W). При эжтом, если W>0, то (X, Y, Z, W) совпадает с (X/W, Y/W, Z/W). Так что, если вам необходимо произвести манипуляции над текстурой уже размещенной в вашей 3D сцене, то вы должны будете использовать каординаты U, V.
Величины DU и DV, упоминаемые выше по тексту, это минимальные единичные приращения текстуры, которые мы можем использовать для вычислений. Обычно эти величины определяются размерностью пикселя, именно он является минимальной дискретизирующей величиной. Отсюда 1/DU и 1/DV будут величинами, определяющими частоту дискретизации изображения текстуры.
Хотя и считается возможным отфильтровать каждый индивидуальный тексель непосредственно в процессе исполнения программы, но этот способ не применяется ввиду сложности его реализации. Более оптимальным считается вариант использования MIP текстур (MIP-map), которые состоят из серии заранее отфильтрованных и отмасштабированных текстур. Фильтрация текстур может быть произведена непосредственно в период начального запуска программы или произведена самим программистом еще в период разработки программы. Другой способ реализации MIP-mapping, это применение графических акселераторов, например, NVIDIA RIVA 128, которые произведут генерацию необходимых MIP-текстур для вашей сцены в момент, когда исходные текстуры загружаются в видео память. Рис. 5 иллюстрирует пирамидальную структуру MIP карты (текстуры), сформированную в результате MIP-mapping для исходной текстуры размерностью в 64х64 пикселя. Как можно видеть, уровень детализации (LOD) уменьшается по мере увеличения MIP уровня (MIP level). Как только текстура была преобразована в
MIP-map, все, что вам необходимо сделать в период выполнения программы для достижения базового per-polygon MIP-mapping — это выбрать корректный MIP уровень для конкретной текстуры и передать его для визуализации в акселератор или модуль программы отвечающей за визуализацию в случае software rendering.
Генерация MIP текстур
Существует несколько способов генерации MIP текстур. Один из них — просто подготовить их заранее, используя графические пакеты типа Adobe PhotoShop. Другой способ — генерация MIP текстур на «лету», т.е. в процессе выполнения программы. Заранее подготовленные MIP текстуры означают дополнительные 30% дискового пространства для текстур в базовой поставке инсталляции игры, но позволяют применять более гибкие методы управления их созданием и позволяют добавлять различные эффекты и дополнительные детали различным MIP уровням. Независимо от того, какой из способов реализации MIP-mapping вы выбрали, MIP текстуры потребуют дополнительные 30% RAM для своего размещения, что значительно увеличивает минимальные требования к количеству оперативной и/или видеопамяти на компьютере.
Давайте начнем с создания MIP карты для 8-битной текстуры.
Создание MIP текстуры — в действительности достаточно простой процесс, и хотя существует множество графических фильтров, которые могут быть использованы в этом процесс, чаще всего стандартный набор фильтров к графическому пакету удовлетворить все потребности.
Рассмотрим процесс генерации MIP текстур на «лету». Первый MIP
уровень представляет собой неизмененную исходную текстуру, скопированную в структуру MIP карты. Смотри Listing 1 (С целью экономии печатного пространства все кодовые листинги доступны для загрузки в виде одного архива: nov98.zip (584 Кб).
Создание остальных MIP уровней текстуры это шаг за шагом повторяющийся процесс. Каждый последующий (более высокий) уровень создается на базе предыдущего уровня, имеющего больший масштаб. Каждый созданный уровень располагается в памяти последовательно с предыдущим. Так же в структуре MIP карты хранится стартовый указатель (pointer) на нужный MIP уровень, так что игровой движок с легкостью может извлечь для использования уровень с соответствующим LOD.
Первым шагом в определении цвета нового пикселя будет вычисление усредненой цветности прямоугольника из четырех близлещащих пикселей на предыдущем MIP уровне. См. Listing 2. Так как, в нашем случае мы работаем с текстурой содержащей палитру цветов, то после того как мы определили значение нового пикселя, нам необходимо найти наиболее соответствующий ему цвет из палитры. Этот процесс показан в Listing 3. Процесс поиска нужного цвета из палитры прост, но может потребовать значительных временных затрат, так как нам необходимо обработать таким образом все пиксели в каждом из MIP уровней. К счастью, данная процедура требуется только один раз, на этапе инициализации MIP текстуры, значит, это не будет критичным. Однако, если вы пожелаете использовать другие эффекты в процессе рендеринга (визуализации), например билинейная и трилинейная фильтрация, то процесс поиска нужного цвета может стать очень медленным.
В этом случае, нам необходимо отказаться от применения текстур содержащих палитру в заголовке, и перейти к использованию 16 или 24-битных текстур. Ввиду того, что большинство применяемых графических карт поддерживают 16 битные текстуры, то мы рассмотрим в данном разделе именно 16 битную текстуру. Технология создания MIP текстуры для 16 битного изображения, очень близка к той, которую мы применяли для 8 бит, см. Listing 4. Так как 16 битные текстуры не содержат палитру, усредненные значения цветности для нового пикселя берутся непосредственно из предыдущего MIP уровня. Одна из проблем, которая возникает в результате неоднократно усреднения цветовых величин для каждого из LOD, это то, что каждая последующая текстура будет темнее предыдущей, находящейся на один MIP уровень ниже. Можно компенсировать это некоторым увеличением значений цветовых составляющих пикселя на каждом из новых MIP уровней. Хотя это компенсация обычно не столь необходима ввиду того, что потеря в интенсивности чаще всего не столь значительна, что бы она бросалась в глаза.
Наложение MIP текстур в процессе выполнения приложения
Рисунок 6 (ниже) показывает некоторые из проблем, с которыми вы можете столкнуться, выбирая корректный LOD (уровень детализации) в процессе выполнения программы. На рисунке, прямоугольная текстура, наложенная на треугольник в плоскости самой текстуры, преобразуется в четырехсторонний многоугольник, находящийся в плоскости экрана. Перспективная проекция текстуры вызывает соответствующие преобразования прямоугольных индивидуальных текселей в многоугольники различных размеров. В нашем случае, когда полигон развернут в плоскости экрана, определение корректного LOD, который необходимо применить на полигон, является первостепенной задачей, т.к. именно от него будет зависеть хорошее конечное качество изображения. Если выбранный уровень детализации (LOD) слишком велик (размерность текстуры велика), искажения дискретизации (aliasing) будут видны в «полной своей красе». Если LOD будет недостаточным, то конечное изображение будет слишком размытым. Например, уровень детализации, выбранный для текстуры использованной на Рис. 7 (ниже) слишком мал, поэтому мы можем наблюдать большие грубые тексели в увеличенном окне вынесенном влево. Существует множество различных методов для выбора корректного LOD, каждый из которых имеет свои плюсы и минусы. Существуют два наиболее известных метода, которые мы рассмотрим ниже. Первый, основан на выборе уровня детализации в зависимости от местоположения текстуры в плоскости экрана (Area based); второй, использует для выбора LOD проекции u и v векторов.
Следует обратить внимание еще на один момент, дело в том, что вам, возможно, потребуется различное количество текселей для того, что бы прорисовать разные пиксели на экране. Как результат, вам необходимо будет просчитать LOD для каждого из пикселей. Эти вычисления могут быть очень медленными, и именно поэтому большинство программных методов визуализации (software renderers) и некоторые из устаревших видеоакселераторов, производят вычисления LOD основываясь на технологии per-polygon и/или per-triangle. Однако, несомненным плюсом per-polygon технологии в MIP-mapping, особенно при программной визуализации, является то, что для полигонов расположенных на удалении (более мелких) вы применяете более мелкие версии текстур из MIP карты, что значительно снижает требования к количеству кэш-памяти процессора в период интенсивных операций с текстурами. В то же время, по-пиксельный вариант выбора LOD позволяет вам реализовать целый ряд дополнительных преобразований в процессе MIP-mapping, включая такие как: точечная дискретизация; билинейная фильтрация на одном уровне детализации; трилинейная фильтрация между двумя ближайшими LOD.
Per-polygon MIP-mapping
Выбор корректного LOD в per-polygon MIP-mapping считается наиболее выгодным с точки зрения количества вычислений необходимых для его реализации, так как выборка производится однократно для целого полигона. Здесь, однако, есть два недостатка:
Первый — два соприкасающихся полигона могут быть отвизуализированы с применением разных уровней детализации. Визуально это проявляется в виде потери неразрывности восприятия нанесенной на объект текстуры (такие искажения носят название MIP banding). Рис.8 демонстрирует проявление незначительного MIP banding явившегося результатом per-triangle MIP-mapping.
Второй — визуальный недостаток проявляется в резких и неожиданных сменах качества прорисовки на объектах, в те моменты времени, когда происходит замена LOD на текстуре при перемещении точки наблюдения или перемещении полигона, относительно точки наблюдения.
Выбор LOD в зависимости от местоположения текстуры на экране (Area-based LOD selection)
Area based LOD selection реализует по-полигонную технику MIP-mapping. Используя этот метод, вы регулируете LOD путем изменения степени сжатия, которая будет применена к текстуре нужной текстуре. Для того, чтобы определить необходимую степень сжатия, вам нужно определить местоположение полигона в плоскости экрана, а так же определить ту часть текстуры (в проекции текстуры) которая будет покрывать выбранный полигон. Используя пример из Listing 5, вы можете определить соотношение текселей к пикселю и далее выбрать соответствующий уровень детализации для применения. (С целью экономии печатного пространства все кодовые листинги доступны для загрузки в виде одного архива: nov98.zip (584 Кб).
U и V размеры более высокого MIP уровня в MIP текстуре равны половине предыдущего MIP уровня, таким образом площадь каждого из уровней, представляющего соответствующий LOD, будет равна одной четвертой от
площади предыдущего. Соответственно, при выборе необходимого LOD мы будем перемещаться на одну ступень вверх по пирамиде MIP текстуры каждый раз, когда соотношение количества текселей на пиксель (texel-to-pixel ratio) изменится четырехкратно. Например, если texel-to-pixel ratio равно 3:1, то мы выбираем MIP уровень 0; если texel-to-pixel ratio равно 7:1, то выбираем уровень 1 и т.д. Как только произошла смена LOD мы можем передать указатель на соответствующий MIP уровень нашему модулю отвечающему за визуализацию, который в свою очередь и произведет визуализацию текстуры с указанным LOD. Здесь необходимо отметить, что каким бы способом мы не проводили MIP-mapping, одна проблема нас будет преследовать всегда. Эта проблема связана с любым преобразованием использующим проекции полигонов с наложенными текстурами и выражается в проявлении паразитного aliasing в те моменты, когда используемый полигон достаточно тонок. Корни этой проблемы прячутся в анизотопности алгоритмов компрессии текстур (анизотропность заключатся в том, что степени сжатия вдоль координатных осей U и V- всегда различна!)
Per-pixel MIP-mapping
По-пиксельное MIP текстурирование позволяет реализовать более утонченное управление уровнем применяемой детализации, чем по-полигонное, оно так же допускает применение дополнительных преобразований над текстурами, хотя все это за дополнительную «плату». Все по-пиксельные методы требуют хранения полной MIP текстуры в RAM, а дополнение внутренних циклов в процедурах программы отвечающих за наложение текстур, может привести к значительному падению производительности игрового движка. К счастью, большинство из сущестующих в настоящее время 3D акселераторов аппаратно поддерживают MIP-mapping c билинейной фильтрацией (а некоторые чипы без ущерба могут осуществлять и трилинейную), поэтому мы рассмотрим, что же собственно необходимо для того, что бы реализовать по-пиксельное MIP текстурирование. Хотя и здесь, при выборе уровня детализации, мы можем применить Area based метод, мы все же пойдем по более аккуратному и сложному пути и просчитаем LOD для каждого из пикселей, в отличие от однократного просчитывания LOD на весь полигон.
Выбор LOD на основе краевого сжатия (Edge compression-based LOD selection)
Значения ux, uy, vx,vy определяются четырьмя частными производными. См. Рис.9. Т.к. мы уже знаем, как вычислять значения u и v для любого пикселя на экране, мы можем применить наши знания для вычисления частных производных. Зная текущие градиенты u/z, v/z и 1/z в системе × и y, а так же зная начальные значения u/z, v/z, 1/z в плоскости экрана, мы можем определить значения u и v по формулам 8 и 9. Нотацию, принятую в формулах 8 — 19 вы можете определить из серии статей Криса Хекера (Chris Hecker) по проекционному текстурированию, которые могут быть найдены на его WEB сайте. (См. раздел «Особые благодарности» в конце статьи).
Используя полученные выше результаты, мы можем определить частные производные в соответствии с формулами 10 — 13.