mip mapping что это

Фильтрация текстур с использованием MIP-карт

Mipmap — это последовательность текстур, каждая из которых представляет собой поочередно уменьшенное представление того же изображения. Высота и ширина каждого изображения или уровня MIP-карты меньше вышестоящего уровня на число, соответствующее степени двух. MIP-карты не обязаны быть квадратными.

Изображения MIP-карт с высоким разрешением используются для объектов, расположенных близко к пользователю. Изображения с низким разрешением используются для объектов, отображаемых дальше. Использование MIP-карт улучшает качество отображаемой текстуры за счет использования большего объема памяти.

Direct3D представляет MIP-карты как цепочку присоединенных поверхностей. Текстура с наиболее высоким разрешением находится в начале цепочки, а далее к ней присоединяются последующие уровни MIP-карты. Этот уровень тоже имеет вложение — следующий уровень MIP-карты, и так далее до самого низкого разрешения MIP-карты.

На следующих рисунках показан пример таких уровней. Точечные текстуры представляют собой знак на контейнере в трехмерной игре от первого лица. При создании MIP-карты текстура с самым высоким разрешением является первой в наборе. Каждая последующая текстура в наборе MIP-карт меньше предыдущей по высоте и ширине на число, соответствующее степени двух. В этом случае максимальное разрешение MIP-карты — 256 пикселей на 256 пикселей. Далее следует текстура размером 128×128 пкс. Последняя текстура в цепочке имеет размеры 64×64 пкс.

Этот знак расположен на максимальном расстоянии, на котором его можно увидеть. Если пользователь находится далеко от знака, игра отображает самую маленькую текстуру в цепочке MIP-карт, которая в данном случае имеет размер 64×64 пкс.

Когда пользователь перемещает точку зрения ближе к знаку, используются текстуры цепочки MIP-карты с постепенно увеличивающимся разрешением. Разрешение на следующем рисунке — 128×128 пкс.

Текстура с самым высоким разрешением используется, когда точка зрения пользователя находится на минимально допустимом расстоянии от знака, как показано на следующем рисунке.

Это более эффективный способ имитации перспективы для текстур. Вместо отрисовки одной текстуры во многих разрешениях, быстрее использовать несколько текстур в разных разрешениях.

Direct3D может оценить, какая текстура в наборе MIP-карт имеет разрешение, наиболее близкое к требуемому для вывода, и сопоставляет пиксели пространству текселей. Если разрешение конечного изображения является промежуточным между двумя разрешениями текстур в наборе MIP-карт, Direct3D проверяет тексели обеих MIP-карт и накладывает их цветовые значения друг на друга.

Для использования MIP-карт ваше приложение должно построить набор MIP-карт. Приложения применяют MIP-карты, выбирая набор MIP-карт в качестве первой текстуры в наборе текущих текстур. См. раздел Наложение текстур.

Затем приложение должно установить метод фильтрации, который использует Direct3D для выборки текселей. При самом быстром методе фильтрации MIP-карт Direct3D выбирает ближайший тексель. Чтобы выбрать этот параметр, используйте перечислимое значение D3DTEXF_POINT. Если приложение использует перечислимое значение D3DTEXF_LINEAR, Direct3D может улучшить фильтрацию результатов. В этом случае выбирается ближайшая MIP-карта, после чего вычисляется взвешенное среднее значение текселей, окружающих точку текстуры, которой сопоставлен текущий пиксель.

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

Direct3D может автоматически выполнить фильтрацию текстур MIP-карт. Приложения могут вручную пройти по цепочке MIP-карты, чтобы загрузить данные точечных изображений для каждой поверхности в цепочке. Часто это единственная причина для прохождения по цепочке. При автоматическом создании MIP-карт в момент создания текстуры используется аппаратная фильтрация, поскольку MIP-карта хранится в видеопамяти.

Источник

Шейдинг — это подложка под запекание нормалки. Чем лучше он выглядит, тем красивее будет финальная модель и normal map. Слева на скриншоте пример хорошего шейдинга, справа — плохого.

То есть слева low poly модель, максимально похожая на high poly: выглядит красиво, нет никаких артефактов и искажений. Справа видны ошибки в шейдинге, искажения.

Основные инструменты воздействия на шейдинг — это добавление большего количества геометрии. Если этот вариант не подходит, — проставление хардов. Изначально шейдинг модели на гифке ниже недостаточно корректно отображает ее форму. С добавлением edge loops модель шейдится лучше. Ее форма становится понятней.

Это самый лучший, но и самый затратный способ, потому что используется большое количество полигонов. Если у вас ограничения по полигонам, можно использовать харды. Однако в этом случае придется делать разрез на UV.

Поэтому хороший шейдинг — это баланс между софтами и хардами.

Совет всем начинающим: настраивайте шейдинг во время low poly стадии. Таким образом вы прямо по ходу ретопологии можете знать, где добавить дополнительную геометрию, а где поставить hard edge.

Многие сначала делают ретопологию, разворачивают, запаковывают и только потом настраивают шейдинг по хардам. Это не самый корректный способ. Результат будет более оптимальным, если изначально опираться на шейдинг.

Это нужно для того, чтобы абсолютно все объекты на уровне имели одинаковое разрешение текстур. Предположим, на уровне есть две бочки — одна маленькая, другая большая. Если мы применим к ним одинаковую текстуру в 2К, плотность их текстур будет отличаться. Маленькая бочка будет крайне плотная и детализированная, большая будет замыленная. Чтобы избежать этих проблем появился термин Texel Density.

Очень часто бывает, что клиент задает необходимое значение Texel Density, но не задает разрешение текстур. Раньше это создавало трудности. Приходилось колхозить. Сейчас в UV Editor Maya 2018 есть специальный инструмент. Выбираете необходимый UV Shell, нажимаете Get и вам выдает числовое значение, в зависимости от разрешения текстур. Точно так же можно выбрать любой Shell, задать цифру, нажать Set и Texel Density будет такой, как вы задали.

Предположим, что желтый цвет — это Texel Density, которого мы должны придерживаться. Чем краснее цвет, тем его значение больше, текстура плотнее, детализация выше. И наоборот, — чем синее, тем значение меньше.

Прием с увеличением значения используется, в основном, в оружии от первого лица. Потому что, заднюю часть пистолета мы видим больше всего, и было бы неплохо сделать ее более детализировано.

С другой стороны, уменьшить детализацию там, куда никто не смотрит — это прием из разряда «must have». Абсолютно независимо от того, какой объект вы делаете.

Читайте также:  какой ликер подходит для кофе

Для одного из тестовых я делал квадратный генератор. Его днище, которое в принципе никогда никто не увидит, я разъювишил точно так же, как и все остальное. То есть оно занимало ¼ моего UV пространства. Это было абсолютно не оптимальное использование текстуры. Для экономии пространства, в невидимых местах, заполненных геометрией, необходимо использовать крайне маленькие шеллы текстур.

Повторное использование текстур — еще один не менее важный инструмент. Я использую его даже в работах для портфолио, потому что он тоже экономит много пространства.

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

Для примера, я запек два кубика с одинаковым Texel Density и текстурой. Но в кубе слева все UV Shells выровнены по горизонтали и вертикали, а справа повернуты под углом.

Ровные шеллы создают хорошую, красивую фаску. Если же шеллы повернуты, мы видим эффект лесенки. Это крайне некрасиво. Особенно на игровых разрешениях текстур. Потому что в играх используется маленькое разрешение, на котором это очень заметно. Поэтому любой прямоугольный шелл нужно выравнивать. Даже если это не идеальная прямоугольная форма на самом объекте, я его специально выравниваю, чтобы на UV он был ровный.

Если игрок отдаляется от какого-то игрового объекта, то модель этого объекта меняется на менее полигональную. Точно так же с текстурами — чем дальше мы отходим, тем меньшая текстура к нему применяется. 4К подменяется на 2К, когда мы отходим еще дальше — на 1К. Этот прием экономит ресурсы вашего компьютера.

Padding — это расстояние между UV Shells. Чем меньше это расстояние, тем сложнее отображать текстуры при Mip Mapping. Потому что при уменьшении текстур, уменьшается и расстояние между шеллами. Padding нужно всегда делать побольше, или хотя бы следить за тем, чтобы он везде был равномерным. Для персональных работ, в принципе, все равно, но если вы делаете проекты для клиентов, на это следует обращать внимание.

Это очень важный момент. Изначально полигоны прямоугольные — квады. Соединив два вертекса, получается два треугольника.

Любой движок, работающий с геометрией, триангулирует модель, чтобы корректно ее отобразить.

Если оставить квады на ровной поверхности, никаких проблем не будет. Но бывают не идеально ровные полигоны. И вот тут уже, в зависимости от того, как мы соединяем вертексы, меняется форма. В одном случае он вогнутый, в другом выпуклый.

Если запекать в квадах, то бейкер триангулирует модель каким-то своим образом, и на базе этой триангуляции выдает нормалку. Если затем эту модель закинуть в движок, то не факт, что он триангулирует ее также. Из-за несоответствия нормалки с триангуляцией, появятся ошибки и артефакты.

Чтобы быть уверенным, что ваша нормалка будет везде красиво смотреться, триангулируйте меш до запекания.

Если вы все правильно сделали, нормалка будет выглядеть как на картинке слева. Она стремиться к однородному цвету, а градиентная информация находится по фаскам. Справа пример плохой нормалки с большим количеством градиентов.

Почему градиенты — это плохо?

Текстуры — это самая затратная часть любой игры. Когда вы качаете игру на 150 гигов, 100 из них — текстуры. Но все они компрессируются, что ухудшает их качество. Лучше всего компрессия видна в тех местах, где есть градиенты. Поэтому при максимально ровной нормалке ошибок быть не должно. Они, конечно, будут, но значительно меньше, чем с градиентом.

Источник света в Substance Painter нельзя регулировать по вертикали — только по горизонтали. Поэтому полезно будет повернуть модель на 90 градусов. Так текстуры будут лучше видны сверху и снизу пистолета.

Базовые приемы, которые я использую при текстуринге, подойдут абсолютно для любых объектов и независят от материалов. Для большей наглядности, эффекты на скриншотах преувеличены.

Износ по краям. Это главный инструмент процедурного текстурирования в Substance Painter и самое мощное устройство, которым нельзя не пользоваться. Если мы посмотрим на любой объект в реальном мире, который был в употреблении, на любом материале будет износ по краям. Не надо делать прям настолько сильно, но высветленные края — это крайне важно.

Грязь во впадинах. Можно использовать просто затемнение. Это также соответствует объектам в реальном мире. Всегда будет какая-то грязь, которая попадает в выемки объекта, а края, при этом, будут стираться. Эти два эффекта вместе задают объем вашему объекту и делают его более читаемым.

Когда я текстурирую, то стараюсь, чтобы ни один канал на моей текстуре не был залит одним цветом. В реальном мире не бывает одинаково равномерного цвета. Везде есть какие-то вариации. Допустим, на дереве. Где-то оно светлее, где-то темнее, где-то отдает зеленым, а где-то красный. То есть любой цвет можно добавить на любой предмет. Главное, не перестараться.

Точно так же на глосе. У нас не может быть одинаково глянцевых объектов. Его залапали, он потерся — всегда бывает вариация. Это крайне важно.

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

Финальный вид вашего объекта задается уникальными маркировками. Это те вещи, на которые сразу падает взгляд. Проблема в том, что новички часто создают базовый материал и сразу бросаются в какие-то зарубки, царапины, цифры. Это не правильно. К этому пункту можно приступать только после того, как будут выполнены предыдущие шаги. Текстура без уникальных вещей, но с хорошей базой будет работать и красиво выглядеть. Если же вы не потрудитесь над базой, но добавите уникальные маркировки — это не будет хорошо смотреться.

Читайте также:  что делать если выключилось электричество в квартире

Вот пример того, как базовые материалы превращаются в финальную текстуру примерно через 50 слоев в Substance Painter.

Источник

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.

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

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

Источник

Полезные советы по оптимизации игровой модели. Часть 1

Shading

Шейдинг — это подложка под запекание нормалки. Чем лучше он выглядит, тем красивее будет финальная модель и normal map. Слева на скриншоте пример хорошего шейдинга, справа — плохого.

То есть слева low poly модель, максимально похожая на high poly: выглядит красиво, нет никаких артефактов и искажений. Справа видны ошибки в шейдинге, искажения.

Основные инструменты воздействия на шейдинг — это добавление большего количества геометрии. Если этот вариант не подходит, — проставление хардов. Изначально шейдинг модели на гифке ниже недостаточно корректно отображает ее форму. С добавлением edge loops модель шейдится лучше. Ее форма становится понятней.

Это самый лучший, но и самый затратный способ, потому что используется большое количество полигонов. Если у вас ограничения по полигонам, можно использовать харды. Однако в этом случае придется делать разрез на UV.

Читайте также:  какой коронкой сверлить под розетку в гипсокартоне

Поэтому хороший шейдинг — это баланс между софтами и хардами.

Совет всем начинающим: настраивайте шейдинг во время low poly стадии. Таким образом вы прямо по ходу ретопологии сможете понять, где добавить дополнительную геометрию, а где поставить hard edge.

Многие сначала делают ретопологию, разворачивают, запаковывают и только потом настраивают шейдинг по хардам. Это не самый корректный способ. Результат будет более оптимальным, если изначально опираться на шейдинг.

Texel Density

Это нужно для того, чтобы абсолютно все объекты на уровне имели одинаковое разрешение текстур. Предположим, на уровне есть две бочки — одна маленькая, другая большая. Если мы применим к ним одинаковую текстуру в 2К, плотность их текстур будет отличаться. Маленькая бочка будет крайне плотная и детализированная, большая будет замыленная. Чтобы избежать этих проблем появился термин Texel Density.

Очень часто бывает, что клиент задает необходимое значение Texel Density, но не задает разрешение текстур. Раньше это создавало трудности. Приходилось колхозить. Сейчас в UV Editor Maya 2018 есть специальный инструмент. Выбираете необходимый UV Shell, нажимаете Get и вам выдает числовое значение, в зависимости от разрешения текстур. Точно так же можно выбрать любой Shell, задать цифру, нажать Set и Texel Density будет такой, как вы задали.

Распределение Texel Density.

Предположим, что желтый цвет — это Texel Density, которого мы должны придерживаться. Чем краснее цвет, тем его значение больше, текстура плотнее, детализация выше. И наоборот, — чем синее, тем значение меньше.

Прием с увеличением значения используется, в основном, в оружии от первого лица. Потому что, заднюю часть пистолета мы видим больше всего, и было бы неплохо сделать ее более детализировано.

С другой стороны, уменьшить детализацию там, куда никто не смотрит — это прием из разряда «must have». Абсолютно независимо от того, какой объект вы делаете.

Для одного из тестовых я делала квадратный генератор. Его днище, которое в принципе никогда никто не увидит, я разювишил точно так же, как и все остальное. То есть оно занимало ¼ моего UV пространства. Это было абсолютно не оптимальное использование текстуры. Для экономии пространства, в невидимых местах, заполненных геометрией, необходимо использовать крайне маленькие шеллы текстур.

Reuse

Повторное использование текстур — еще один не менее важный инструмент. Я использую его даже в работах для портфолио, потому что он тоже экономит много пространства.

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

Ровные UV Shells

Для примера, я запек два кубика с одинаковым Texel Density и текстурой. Но в кубе слева все UV Shells выровнены по горизонтали и вертикали, а справа повернуты под углом.

Ровные шеллы создают хорошую, красивую фаску. Если же шеллы повернуты, мы видим эффект лесенки. Это крайне некрасиво. Особенно на игровых разрешениях текстур. Потому что в играх используется маленькое разрешение, на котором это очень заметно. Поэтому любой прямоугольный шелл нужно выравнивать. Даже если это не идеальная прямоугольная форма на самом объекте, я его специально выравниваю, чтобы на UV он был ровный.

Mip Mapping и Padding

Если игрок отдаляется от какого-то игрового объекта, то модель этого объекта меняется на менее полигональную. Точно так же с текстурами — чем дальше мы отходим, тем меньшая текстура к нему применяется. 4К подменяется на 2К, когда мы отходим еще дальше — на 1К. Этот прием экономит ресурсы вашего компьютера.

Padding — это расстояние между UV Shells. Чем меньше это расстояние, тем сложнее отображать текстуры при Mip Mapping. Потому что при уменьшении текстур, уменьшается и расстояние между шеллами. Padding нужно всегда делать побольше, или хотя бы следить за тем, чтобы он везде был равномерным. Для персональных работ, в принципе, все равно, но если вы делаете проекты для клиентов, на это следует обращать внимание.

Триангуляция

Это очень важный момент. Изначально полигоны прямоугольные — квады. Соединив два вертекса, получается два треугольника.

Любой движок, работающий с геометрией, триангулирует модель, чтобы корректно ее отобразить.

Если оставить квады на ровной поверхности, никаких проблем не будет. Но бывают не идеально ровные полигоны. И вот тут уже, в зависимости от того, как мы соединяем вертексы, меняется форма. В одном случае он вогнутый, в другом выпуклый.

Если запекать в квадах, то бейкер триангулирует модель каким-то своим образом, и на базе этой триангуляции выдает нормалку. Если затем эту модель закинуть в движок, то не факт, что он триангулирует ее также. Из-за несоответствия нормалки с триангуляцией, появятся ошибки и артефакты.

Чтобы быть уверенным, что ваша нормалка будет везде красиво смотреться, триангулируйте меш до запекания.

Градиенты на нормалях

Если вы все правильно сделали, нормалка будет выглядеть как на картинке слева. Она стремиться к однородному цвету, а градиентная информация находится по фаскам. Справа пример плохой нормалки с большим количеством градиентов.

Почему градиенты — это плохо? Текстуры — самая затратная часть любой игры. Когда вы качаете игру на 150 гигов, 100 из них — текстуры. Но все они компрессируются, что ухудшает их качество. Лучше всего компрессия видна в тех местах, где есть градиенты. Поэтому при максимально ровной нормалке ошибок быть не должно. Они, конечно, будут, но значительно меньше, чем с градиентом.

Следуя этим правилам, вы легко повысите качество своих работ, сократив усилия, необходимые для их создания.

Во второй части статьи рассмотрим основные правила хорошего текстурирования, которые помогут оживить вашу модель и сделать ее более интересной.

Источник

Сказочный портал