Mipmapping


Mipmapping (mip-mapping, mip-текстурирование или мипмеппинг) это метод уменьшения объема вычислений необходимых для точного наложения текстурного изображения на полигон. Простейший метод наложения текстур называется point-sampling (single point-sampling или поточечная выборка). Суть его в том, что для каждого пикселя, составляющего полигон, вы выбираете один тексель из текстурного изображения.

Этот метод очень неточен и результатом его применения является появление неровностей (aliasing — качество изображения ухудшается). А именно, всякий раз, когда пиксели больше по размеру, чем тексели, наблюдается эффект мерцания. Этот эффект имеет место, если часть полигона достаточно удалена от точки наблюдения, так, что сразу много текселей накладываются на пространство, занимаемое одним пикселем.

Заметим, что если полигон расположен очень близко к точкем наблюдения и тексели больше по размеру, чем пиксели, мы можем наблюдать другой тип ухудшения качества изображения (aliasing — алиасинг). В данном случае, изображение начинает выглядеть блочным. Этот эффект имеет место, когда текстура может быть достаточно большой, но ограничение в виде доступного разрешения экрана не дает возможности правильно представить исходое изображение.

На самом деле, mipmapping не может предотвратить такого рода эффекты ухудшения качества изображения; ничто не может помочь в этом случае, за исключением использования больших по размеру (т.е. имеющих более высокое разрешение) текстурных изображений или использование специальной техники, называемой "detail textures" (детализированные текстуры). Метод mipmapping разработан с целью помочь избавиться от первого типа ухудшений изображений или алиасинга, когда несколько текселей накладываются на один пиксель. Проблема тут в том, что если вам требуется правильным образом вывести на экран пиксель, вам необходимо скомбинировать значения ВСЕХ текселей, которые накладываются на пиксель. Разумеется, вы не можете сделать этого, если выбираете лишь один тексель. При этом, вам не хочется делать выборку по ВСЕМ текселям, потому что это слишком большой объем работы для правильного вывода на экран всего одного пикселя.

Метод mipmapping снижает объемы работы за счет генерирования и хранения множество версий исходного текстурного изображения, каждая из версий которого имеет все меньшее и меньшее разрешение (таким образом эффективнее используя "большие" тексели). Когда происходит текстурирование пикселя, вам нужно выбрать версию текстурного изображения, которая имеет необходимый размер текселей (относительно размера пикселя).

Теперь у вас есть много альтернатив — какие тексели следует использовать, исходя из 8 хороших вариантов:

  • у вас есть 4 близлежащих (nearest) текселей из текстурного изображения, причем эти тексели лишь слегка больше по размеру чем писксель.
  • у вас есть 4 близлежащих текселей из текстурного изображения, причем эти тексели лишь слегка меньше по размеру чем писксель.

Если вы создаете неподвижное изображение, вы можете просто выбрать один ближайший тексель и использовать его. Однако, если вы создаете анимацию или движущееся изображение, результатом такого выбора будет серьезное ухудшение качества изображения (снова мерцание), в следствии того, что при медленном движении тексель выбранный для пикселя может "перескакивать" с одного места на другое при смене кадров.

Чтобы результат был лучше, вы должны выбрать несколько текселей и взять их среднее значение для определения пикселя. Т.е. вы должны выбрать способ фильтрации:

  • линейный (linear) мипмеппинг: выбирается два текселя один побольше, а другой поменьше
  • билинейный (bilinear) мипмеппинг: выбираются 4 текселя из ближайшего уровня
  • трилинейный (trilinear) мипмеппинг: выбираются все 8 текселей

Кстати, такое усреднение отнюдь не является простым, а скорее наоборот сложным: чем ближе тексель находится по отношению к пикселю, тем большее влияние на конечное значение усреднения он оказывает (и наоборот).

Получается, что трилинейный мипмеппинг это лучшее, что может быть?

Нет конечно. Видно, что проблема не только в соотношении размеров пикселя и текселя, но также и в форме каждого из них (или, что бы быть более точными, в соотношениях форм).

Метод mip-текстурирования лучше всего работает для полигонов расположенных прямо "лицом к лицу" к точке наблюдения. Объясняется это тем, что каждая версия mip-текстуры получается в результате сокращения в четыре раза набора текселей, составляющих текстуру с более высоким разрешением, для получения текстуры с более низким разрешением.

Однако, полигоны, косонаправленные по отношению к точке наблюдения искривляют накладываемую текстуру так, что на пикселы могут накладываться различного вида и квадратичные по форме области текстурного изображения. Метод mip-текстурирования не принимает это во внимание и в результате наблюдается эффект слишком сильного размытия текстурного изображения, так, будто использованы неправильно выбранные тексели. Для решения этой проблемы вы должны делать выборку из большего количества текселей, составляющих текстуру, и выбирать эти тексели следует принимая во внимание "отображенную" форму пикселя в текстурном пространстве. Эта техника называется "anisotropic filtering" (анизотропная фильтрация). Обычное mip-текстурирование называется "isotropic" (изотропное или однородное), потому что мы всегда фильтруем вместе квадратные области, состоящие из текселей. Анизотропная фильтрация означает, что форма области из текселей, которую мы используем меняется в зависимости от обстоятельств. Anisotropic: "an" = not (не); "iso" = uniform (постоянная); "tropic" = shape (форма).

Кстати, архитектура Talisman от Microsoft может в некоторой степени осуществлять анизотропную фильтрацию, таким образом обеспечивая несколько лучшее качество текстурированного изображения. Имеено эта архитектура легла в основу графического чипсета от Fujitsu — Marqius 2000.

Заметим, что использование большего количества текселей при фильтрации требует соответствующего повышения пропускной способности текстурной памяти. Напомним так же, что все описанные выше вычисления должны выполняться для каждого пикселя из каждого прорисовываемого на экране полигона, или по меньшей мере для каждого пикселя в изображении.

Дополнительную информацию по данной теме можно прочитать здесь и здесь.

Использованы материалы, которые любезно предоставили Carl Mueller и Kristof Beets




Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.