
Сегодня я хочу поделиться с вами советами по использованию Udim, текстурных сетов, texel density, padding, mipmapping и других техник в различных ситуациях и при возникновении ошибок.
Этот материал создан автором самостоятельно, однако в него также включена информация, полученная из других источников.
Редактор и создатель идеи: Daniil Lipin (lipa_l1).
Благодарю за помощь в написании статьи замечательных художников высокого уровня: _Shelest_, Titan_Fair, Alexey Yarmola, nikiost, trasnik.
Отдельное спасибо:
Dmitriy Bogumil — за предоставление файлов/скринов модели монстра.
gRen — за предоставление скринов с ошибками запекания карт id на оружии.
Сайты, откуда была взята маленькая часть информации:
1) https://www.youtube.com/watch?v=55sGQLX7iho
2) https://www.artstation.com/artwork/Xg3reL
3) http://wiki.polycount.com/wiki/Edge_padding
4) https://dtf.ru/gamedev/202100-kak-uluchshit-kachestvo-tekstur-razbor-metodov-optimizacii-uv
5) https://en.wikipedia.org/wiki/File:Mipmap_Aliasing_Comparison.png
6) https://gtaforums.com/topic/750681-skygfx-ps2-xbox-and-mobile-graphics-for-pc/page/287/
7) https://vk.com/@anatolii994-teksel-prostoi-universalnyi-metod
8) https://www.artstation.com/artwork/x3B5YX
Буду признателен, если вы поможете мне исправить опечатки, а ещё, если есть вопросы, пишите, пожалуйста, на почту: lipindan2003@gmail.com, в телеграмм — @lipa_l1, в дискорд — @lipa_l1.
«Все материалы данного сайта являются объектами авторского права (в том числе дизайн). Запрещается копирование, распространение или любое иное использование информации и объектов без предварительного согласия правообладателя»
Для создания этой статьи были использованы следующие программы и аддон:
* Blender 4.2.0 / Blender 4.3.0;
* UVPackMaster 3.2.2 PRO / UVPackmaster v3.3.0 PRO;
* Marmoset Toolbag 4.06 (4062) / Marmoset Toolbag 5.0 (5008);
* Substance Painter 3D v10.0.1 build 3757.
Если при работе с этими программами у вас возникают какие-либо расхождения с описанными в статье действиями, то для предотвращения проблем рекомендуется использовать максимально схожие версии этих программ.
—————————Udim—————————
U-Dimension, также известная как Udim, — это система оптимизации вашей модели, за счёт увеличения количества UV-плиток, где шеллы заполняют их пространство, увеличиваясь в размере, что даёт возможность не ограничивать себя в использовании высокого Texel Density (далее — TD), и текстура, в свою очередь, будет отображаться качественней.
Udim называют по-разному, но все эти термины являются синонимами. Не стоит пугаться, если вы встретите разные названия в разных источниках: Udim, Udim-схема, Udim-система, плитки, UV-кусочки, квадраты на UV, тайлы и так далее.
Цель Udim — оптимизировать процесс использования высоких текстур. Он зависит от плотности TD. Обычно новички используют только одну UV-плитку для развёртки, запекания текстурных карт и создания самой текстуры. *Исключение — модели малой площади.
Со временем понимание трёхмерной графики растёт, открывая путь к сложным техническим вопросам самой модели. Именно здесь многие сталкиваются с трудностями при создании 3D-модели с текстурами, созданными в Udim.
Почему так важен TD?
Texel Density — значение, которое показывает, сколько будет отображаться пикселей будущей текстуры на 1 сантиметре поверхности модели. *Возможна другая единица измерения: m, mm.
Важно знать принцип работы TD, многие дезориентированы в данном понимании, ведь можно найти довольно много статей и блогов на эту тему, все пытаются рассказать лишь пару процентов информации, в силу отсутствия точных знаний.
TD напрямую связан с расстоянием до модели, чем дальше мы от нашего объекта, тем меньше мы можем его разглядеть, тем самым меньший нужен TD, а чем ближе, тем лучше будут видны изъяны и, соответственно, необходим более высокий TD. Отсюда и возникает вопрос, какой TD необходимо использовать?
Начнём с того, что нельзя в голове вычислить рациональное количество UV-плиток, TD и разрешение будущих текстур, нам нужна стартовая точка, которая и послужит началом. Да, вы можете использовать большое количество плиток с высоким разрешением, но это не будет иметь смысла при лишней трате ресурсов и плохой производительности, поэтому важно подобрать лучшую комбинацию, а из-за разницы в форме, площади поверхности и размере моделей, нельзя ко всем объектам относиться одинаково, тут необходим индивидуальный подход. Нашей начальной точкой и послужит TD.
Как получить нужный TD? Тут необходимо расстояние до нужного объекта и значение искажения линзы (значение фокуса), имеется формула по вычислению значения. Ещё нам нужны значения эталона, снова же, нельзя взять значение из головы, необходимы тесты по поиску лучшего значения или брать уже готовые значения с проектов других художников за эталон.
Формула:

где TD — искомый тексель, px/cm;
TDэ — тексель эталона, px/cm;
L — расстояние от камеры до поверхности модели, м;
Lэ — расстояние от камеры до поверхности модели у эталона, м;
F — фокусное расстояние камеры, мм;
Fэ — фокусное расстояние камеры у эталона, мм.
Разрешение текстуры подбирается под уже подобранный нами TD, который мы вычислили, значение TD остаётся неизменным, и, отталкиваясь от него, вы принимаете решение по разрешению текстуры и количеству UV-плиток.
Как правильно использовать эталон.
Вы нашли удачный рендер, который выглядит и красиво, и оптимизировано, далее нам необходимо узнать у данной части модели, какой TD, расстояние и фокус камеры до поверхности (ближайшей точки поверхности).

Если мы подставим значение, формула сократится до подобного вида:

Где 1.34 — значение, которое у вас получилось при сокращении формулы. Далее вы можете иметь несколько таких значений у себя в закладках для будущих проектов, как отличные примеры, которые могут иметь упор на качество, на оптимизацию, так и на нечто среднее между качеством и достаточной оптимизацией. А далее необходимо лишь в последующих действиях подставить расстояние до поверхности модели и значение фокуса камеры. *Значение 1.34 — выдуманное.
Как правильно измерять расстояние?
В Blender линейка работает отлично, достаточно лишь соединить точку камеры и ближайшую поверхность объекта.

Смотрим значение фокуса.

Имеем расстояние в 1,60266 метров и искажение линзы в 120 мм, после корректировки размеров и применения трансформаций с модификаторами.
Имеется значение, которое вы можете использовать как эталон, оно отлично показывает модель и качественно оптимизировано.
1.15 — такое значение применено на мотоцикле.

Теперь наша модель: по формуле, TD вышел 86,106, подставляем это значение в аддон Texel Density:

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

Если увеличивать разрешение текстуры, не меняя TD, то UV-пространство будет лишь масштабироваться, что будет провоцировать использовать всё больше или меньше UV-плиток, ведь шеллы остаются теми же, не меняясь в размерах. TD, который мы вычислили, ни при каких условиях не меняется, под него уже подстраивается разрешение, Udim будет необходим как поддержка.
Не многие понимают, что ни размер модели важен, ни разрешение текстуры, а лишь расстояние и искажение линзы. Размер модели и правда влияет на TD, но и расстояние до него будет другое при рендере или в играх, оно и компенсирует размер модели.
*Сами расчёты необходимо делать от момента самого близкого расстояния видимости объекта при рендере, включая и самый близкий момент в игре.
*Оверлапы следует убирать при создании UV развёртки с уже необходимым значением TD. Они будут просчитываться как лишние значения площади, что нам точно не нужно, поэтому убираем их и после всех манипуляций возвращаем их в стаки.
Вот этапы для корректной работы:
1) Выставляем корректный размер модели, применяем все модификаторы и трансформации. Отчищаем модель от лишних кривых и другого мусора.
2) Делаем развёртку с оверлапами и уменьшаем шеллы слабозаметных частей модели.
3) Вычисляем по формуле, зная самое близкое расстояние до модели, расстояние от камеры до модели, значение фокуса камеры. Берём за эталон необходимый вариант.
4) Придаём развёртке нужный TD, далее подбираем наилучший вариант из разрешения текстуры и Udim.(2k и 3 uv-плитки, 4k и 1 uv-плитка).
Частые вопросы и ответы:
1) Когда нужно сделать рендер очень близко к модели, при этом она большая, тут действуют те же правила, рассчитывается расстояние, берётся эталон и вычисляем нужный TD, если рендер будет с одной стороны или объект в игре не будет виден со всех остальных сторон, то в развёртке можем использовать лишь те шеллы, которые будут видны в большинстве случаев, остальные уменьшить на ваше усмотрение, таким образом мы получим возможность использования текстур малого разрешения, делать это необходимо ещё до вычислений по формуле.
Шеллы, которые нам не нужны, уменьшаем, что делает видимые части объекта детализированней, как правило, это база, которую вы должны знать, и UV развёртка должна быть уже подготовленная, формула лишь даёт значение, под которое мы подбираем будущее разрешение текстуры, пользуясь Udim.
2) Важно иметь размер модели, равный объектам в нашей реальности, применённые трансформации и отсутствие активных модификаторов, также отсутствие внутренних полигонов, лишнего мусора в виде кривых и полигонов на нашей модели.
3) По логике таких расчётов не сложно понять, что чем меньше модель, тем меньше шеллы, а чем меньше шеллы на UV-пространстве, тем хуже будет смотреться текстура. Отсюда можно понять, что при рендере во весь экран модель, допустим, маленькая, то нам будет необходимо увеличивать шеллы для повышения TD, при больших размерах модели шеллы будут больше, а значит, их нужно будет наоборот уменьшать, ведь TD будет необходим, скорее всего, меньше.
4) TD, который мы получили, уже готовое значение, его больше менять не нужно, под него подбирается уже текстура с помощью Udim. В зависимости от ситуации можно использовать как и большое разрешение текстуры, так и более маленькое.
5) Модель «мусорный бак» редко будет видно в игре, но есть возможность к нему подойти и рассмотреть его вплотную, то с этого расстояния и стоит делать расчёты. Для оптимизации существуют LOD-технология и MipMapping, поэтому можно не волноваться от высокого качества модели вблизи, вдалеке оно будет другое.
6) При создании модели для игры стоит учитывать расстояние и значение фокуса, в каждых играх, в зависимости от лица персонажа и других факторов, расстояние может быть разное, а также поле зрения, стоит учитывать максимальное поле зрения, оно также влияет на расстояние, помимо обычного расстояния. Что не стоит учитывать, так это приближение с помощью сторонних программ и объектов в самой игре (например, прицел СВД).
7) У нас имеется анимация, в которой действия происходят в обычной комнате и в определённый момент перед экраном пролетает комар, какой TD должен быть у него? Не стоит пугаться, берём момент перед камерой как самый близкий и с помощью расстояния, значения фокуса и значения эталона находим нужный нам TD, даже учитывая, что большую часть времени сам комар будет далеко от камеры.
Случаи, когда у нас есть рамки (выставляем корректный размер модели, применяем все модификаторы и трансформации. Отчищаем модель от лишних кривых и другого мусора — ВСЕГДА).
Если есть рамки по TD, то с помощью формулы подбираем корректные значения td, далее уменьшаем или увеличиваем шеллы.
Если есть рамки по текстуре, то с помощью формулы подбираем корректные значения td, используя размер шеллов и Udim, подбираем нужные значения под разрешение.
Если есть рамки по Udim, то с помощью формулы подбираем корректные значения td и меняем разрешение, которое будет соответствовать Udim, а также масштабируем шеллы.
Если рамки по td и разрешению текстуры, то с помощью формулы подбираем корректные значения td и, используя Udim, масштабируем шеллы, изменяя td.
Если рамки по разрешению и Udim, то с помощью формулы подбираем корректные значения td, проверяем, как при Udim и нужном разрешении себя показывает td, при необходимости масштабируем шеллы, меняя td.
Если рамки по Udim и td, то с помощью формулы подбираем корректные значения td, далее уменьшаем или увеличиваем шеллы и подбираем нужные текстуры под Udim.
Рамки со всеми ограничениями — может быть предложение лишь изменение размеров модели или максимальная доработка UV. Включая изменение дальности до самой модели.
При больших рамках к модели, в редких случаях масштабировать саму модель таким образом, чтоб дальше была от камеры.
*Масштабирование шеллов следует начинать делать от слабозаметных частей модели до заметных.
Перед текстурированием можно использовать текстуры-чекеры. Они обычно встроены в программы для 3D-моделирования или доступны как дополнительные плагины (аддоны). Также можно воспользоваться обычной текстурой, чтобы увидеть размытие и артефакты при конечной развёртке с уже применённым TD.
Я, например, использую текстуру-чекер из аддона UVToolkit в Blender 4.3.
Для того чтобы включить Udim в Blender, необходимо следовать указаниям со скринов:










Этот способ лишь создаёт пространство, чтоб мы могли понять, где разделяются плитки, и делать развёртку ровно по плиткам, а не в пустом пространстве, но хорошая альтернатива этому — дополнения для создания UV развёртки на полуавтоматизме: RizomUV, UVLayout и аддоны для самих программ, например, один из лучших — UVPackMaster3PRO, который создаёт отличные развёртки на разных плитках без ранее созданных в Blender пространств Udim.
Как вы уже поняли, Udim играет роль помощника, при уже известном TD мы можем подобрать текстуру 8k, она будет отлично соответствовать нашему TD, но проблема заключается в том, что текстуры такого качества довольно сложно найти, она имеет ещё несколько минусов: оптимизация в игре, больший вес одной текстуры грузится дольше, чем несколько текстур с меньшим качеством, но при этом с таким же размером файлов, сам размер файла тоже влияет, куда выгоднее использовать 3 текстуры по 4k, чем одну 8k.
Давайте рассмотрим преимущества Udim в различных ситуациях:
1) Как и написал выше, найти текстуры высокого разрешения и тем более чтоб они соответствовали вашим желаниям не просто, куда проще и лучше использовать несколько текстур низкого разрешения.
2) С технической точки зрения, если учитывать объём памяти, который занимает сама текстура, то использование трёх текстур размером 2k будет более выгодным, чем одной текстуры размером 4k (при этом у нас увеличится ещё TD, если под наш TD нужно 2.5 текстуры, то берём больше, 3 текстуры, шеллы, соответственно, станут больше, что и даст прирост в TD):

*Не стоит забывать, что в результате запекания у нас получается не одна карта, а около пяти: normal map, thickness и другие. И это только для одной UV-плитки.
2k — 15,941 * 5 карт * 3 UV развёртки для каждой карты = ~233 mb
4k — 58,143 * 5 без Udim = ~283 mb
8k — 207,953 * 5 без Udim = ~1 GB
Теперь давайте обсудим, как модели применяются в разработке игр. Udim даёт нам здесь заметные преимущества. В этом подходе используется так называемый паддинг – техника, которая кроме игровых моделей не применяется в кино, визуализации, медицине и других отраслях, но есть и редкие исключения.
Padding — это расстояние между шеллами. Можно заметить, что мы перешли от обычных Udim к использованию паддинга.
3D-графика — это не только создание красивых моделей. Здесь применяются сложные вычислительные технологии, которые взаимосвязаны друг с другом.
Паддинг связан с TD, TD — с разрешением текстур, а разрешение текстуры — с Udim. Но почему он также играет роль в этой статье?
Это расстояние необходимо для всех UV-плиток моделей, которые загружаются в игровые движки. В движках есть специальная методика оптимизации — MipMapping.
У этой технологии почти нет недостатков. Она не только делает игру более увлекательной, но и улучшает качество изображения на экране.


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

На этой иллюстрации одна текстура как бы перетекает в другую. Там, где были сделаны разрезы на модели, текстура меняется. Это выглядит примерно так:

Если отступы сделаны правильно, результат будет таким, как на третьей строке изображений: цвета смешиваются друг с другом «с умом». Однако не обязательно самостоятельно выполнять такое «умное» заполнение цветов между шеллами. Существуют специальные программы, такие как Marmoset Toolbag и Substance 3D Painter, которые могут сделать это автоматически. Именно поэтому у нас на выходе карты, которые полностью покрыты цветом, а не чисто по шеллам.
Но если вы хотите иметь настраиваемый паддинг, в Marmoset Toolbag имеется такой функционал:

На изображении вы можете заметить промежутки между шеллами. Однако padding — это не только расстояние между ними. Его также могут называть по-разному: расстояние в пикселях, пустое пространство между шеллами и так далее. Но суть остаётся неизменной: если все шеллы будут плотно прилегать друг к другу, текстуры будут выглядеть ужасно. Особенно это заметно, когда на UV-плитке много шеллов, которые прижаты друг к другу. При больших шеллах хотя бы есть небольшое расстояние между ними (из-за сложных форм расстояние образуется само), но дело не в этом. Важно правильно выполнять развёртку.
MipMapping — это технология, которая применяется всегда, и она напрямую связана с паддингом.
Влияние паддинга на TD:
Самый простой пример, чтобы понять это — когда у вас есть большое количество шеллов, и между ними паддинг составляет 16 пикселей. Сам паддинг занимает очень много места.
При использовании Udim у нас есть несколько UV-плиток, и на них везде одинаковый паддинг. В этом и заключается преимущество использования Udim.
Когда у вас много островов, вокруг каждого из них должен быть паддинг 16 пикселей, и шеллы не могут быть больше. Даже если вы увеличите один остров, другие станут меньше из-за паддинга. Но при использовании Udim паддинг остаётся тем же, а UV-острова могут быть больше.
Это всё касалось разработки игр, но большинство моделей создаются для визуализации, моушн-дизайна, кино и других графических проектов, где паддинг не требуется. В таких случаях значение паддинга устанавливается равным 1.


На этих 2 скринах видно отличие: в заполнении пространства и у показателя TD при разном паддинге.
Хочу поделиться важной информацией об использовании небольшого отступа. Проблема заключается в следующем:

На этом изображении модель покрыта картой Material ID. Эта карта позволяет лучше всего увидеть проблему, чем другие. Однако такая проблема будет возникать со всеми картами, так как при дальнейшем текстурировании, текстуры будут отображаться некорректно, особенно на глянцевых поверхностях.
Проблема заключается не в размере паддинга, а в качестве запечённых текстур.

У нас стоит 1x samples. В этом и кроется вся проблема. Когда мы настраиваем паддинг, например, под разрешение 2k, у нас расстояние между шеллами будет 16 px, программа автоматически думает, что качество текстурирования будет соответствовать 2k, в таком случае не стоит менять свои взгляды на качество при запечке, если решили в будущем делать текстуры и под них уже настроили паддинг, значит, при запекании карт стоит обратить внимание на качество запечки. Samples — лишь один пазл при построении качественного изображения, стоит учитывать абсолютно все пазлы, включая и разрешение, и паддинг, и формат битности. Есть также вариант, что в низком качестве запекают только Material ID, ведь тут без разницы, какого качества будет однотонный цвет, но, как вы уже знаете, запекать даже такую не требовательную карту в хорошем качестве смысл есть.
Мы рассматриваем процесс запекания карты цвета от высокополигональной модели. Возможно, некоторые из вас не знали, но высокополигональные модели используются для запекания Material ID (Color ID) — карта цветов, которая будет использоваться для текстурирования низкополигональной модели.
Кроме Material ID, существуют и другие карты для запекания, такие как Group ID, Object ID, UV ID, albedo и Vertex color.
Когда мы запекаем Material ID, Marmoset анализирует цвета и автоматически адаптирует их для низкополигональной модели таким образом, чтобы они были максимально разными на цветовой палитре (чтобы избежать проблем при текстурировании). То есть цвета на низкополигональной модели будут выглядеть иначе, чем на высокополигональной.
На изображении ниже вы можете увидеть, как выглядела покрашенная высокополигональная модель. На изображении выше уже представлены цвета на низкополигональной модели: розовый стал зелёным, синий остался таким же, но стал немного светлее.

Object ID — карта, которая запекает цвета для каждого объекта локально. Например, дом будет иметь на карте 3 цвета (крыша, пол и стены), как простой пример.
UV ID — запекает разные цвета для каждого острова на UV развёртке (для low-poly объекта соответственно).
Albedo — как и вариант запечки Material ID, но только данная карта запекается с такими же цветами, которые вы назначили на high-poly объекте.
Vertex Color — карта, для запечки которой необходимо проделать некоторые манипуляции в программе ZBrush (и в других программах):
1. Выбираем часть объекта.

2. Слева посередине выбираем нужный цвет (мы выбрали зелёный) и нажимаем на кнопку FillObject.

3. Как видим, на выбранной части назначился новый материал.

Принцип работы схож с другими 3D-редакторами.
Если при загрузке моделей в Marmoset Toolbag вы не видите цветов, а все шейдеры выглядят белыми, то проблема будет в следующем:

Необходимо в настройках программы просто включить нужные галочки, в нашем случае — это fbx.
Также хочу дополнить о расстоянии между шеллами. Многие не понимают, как это работает, и могут допустить ошибку, если установят паддинг, равный 16 px, не зная правила mipmapping. В результате они потеряют часть важного пространства в плитке.
256 = 2 px
512 = 4 px
1024 = 8 px
2048 = 16 px
4096 = 32 px
При настройке паддинга важно помнить, что это расстояние внутри плитки между шеллами. Однако расстояние от самой границы плитки рассчитывается по-другому.
Суть в том, что пространство UV повторяется постоянно. Конец правого края плитки становится началом левого края. Поэтому при паддинге в 16 px расстояние между краями и шеллами должно быть в два раза меньше. Если расстояние от шелла до правого края составляет 8 px, то оставшиеся 8 px придутся на левый край. В этом случае паддинг будет выполнен правильно.

Многие дизайнеры либо не используют отступы по бокам, либо устанавливают их одинаковыми — например, по 16 пикселей. Если не использовать отступы вовсе, то текстуры могут накладываться друг на друга, создавая видимость швов и некачественных текстур.
В UVPackMaster3PRO функция для настройки паддинга выглядит примерно так:

Margin — это расстояние между шеллами в программе. В каждой программе оно рассчитывается по своим параметрам. Этот способ нам не подходит.
Ставим галочку на Pixel Margin (расстояние по пикселям).
Pixel Margin — расстояние между шеллами;
Pixel Padding — расстояние между шеллом и границей плитки;
Extra Margin To Others — расстояние между выбранными и не выбранными шеллами;
Texture Size — будущее разрешение текстуры.
Подводя итог, необходимо хорошо понимать, что такое паддинг, td и как правильно упаковывать UV. Ведь даже незначительная кривизна шеллов и нерациональное использование пространства могут повлиять на количество UV-плиток. Мы также не затрагивали вопрос растяжек, которые иногда возникают при использовании идеально ровных и красивых шеллов.
Подходите к упаковке с умом, ведь она не только влияет на внешний вид модели, но и может значительно повысить производительность игры, увеличив fps в 1.3 раза. Ведь таких моделей в сцене сотни. В портфолио также смотрят на вашу развёртку.


На изображениях виден пример правильной развёртки и неправильной (ещё мягко сказано).
3) Использование Udim в играх / в кино — затронули уже данный пункт чуть выше.
Для игр преимущества мы уже знаем, но суть данного пункта заключается в том, что самый большой плюс использования Udim заключается в использовании его в: кино, визуализации, концепт-проектах, логотипах и других изображениях с высокой детализацией.
Основной трудностью является поиск необходимых текстур с большим разрешением. Их не так легко найти или создать самостоятельно. Поэтому лучше разбить их на множество небольших фрагментов и использовать текстуры с низким разрешением — это повысит качество.
Из-за гигантских размеров моделей, шеллы будут иметь тоже большой размер, после вычисления нужного TD нам это всё придётся упаковать в одну UV-плитку с разрешением в 64k, либо использовать Udim-систему, которая будет состоять из, допустим, 20-ти UV-плиток, и каждая плитка будет иметь разрешение 1k.
Поэтому для создания гигантских сооружений для правильной демонстрации качества текстур всегда используются Udim в довольно больших количествах. Даже в играх используется данный метод, когда на модели может быть 20 плиток, и это нормально
При использовании большого количества плиток в кино, качество будет максимально реалистичное, и потерь нет, конечно, рендер будет долгим, но в кино это мелочи, поэтому во всех фильмах на каждой модели очень много Udim-плиток, также для создания логотипов и реалистичных сцен, которые используются как картинки, Udim берёт огромный оборот.
Для примера можете глянуть на следующие изображения:




Как можно заметить, без большого количества тайлов, такой детализации добиться почти невозможно.
4) Оптимизация при использовании в движке:
Главным образом этот плюс будет полезен для Unreal Engine, так как в нём использование Udim более развито, чем в Unity.
Мы будем на примере использовать UE4. Когда идёт подгрузка Udim, то они используются как единый шейдер (материал = шейдер), каждый тип (группа) карт — новый шейдер, то есть у нас будет так же, как и раньше, около 5 основных карт (или же шейдеров), но они уже состоят из Udim-тайлов. Доказательством успешной загрузки карт служит надпись «VT».

Для подгрузки достаточно выбрать лишь первую текстуру по счёту (1001), а все остальные (по типу карт), если они имеются, UE подгрузит сам, для работы Udim не забываем поставить галочку на Enable virtual texture support.

В Unreal Engine 5.5 выглядит она так.

Чем полезен такой подход? Когда вы разбиваете текстуру на части, модель становится более оптимизированной. Это происходит потому, что Udim обладает гибкостью. При использовании этого метода текстура загружается не полностью, а постепенно. Это похоже на открытие одного файла размером 100 GB и десяти файлов по 10 GB. Один файл будет загружаться долго, так как он большой и единый. А при использовании десяти файлов каждый из них обрабатывается отдельно, что позволяет увеличить скорость работы с подобными моделями. В результате мы получаем оптимизацию. Когда вы подходите к модели, подгружаются ближайшие карты.
5) Многие программы поддерживают Udim, кроме тех, что были описаны выше, с Udim отлично работают Houdini, Nuke, Modo, Mari, 3D Coat, ZBrush, Maya, 3ds Max, Cinema 4D, Substance Designer, Marvelous Designer и многие другие.
6) Помимо того, что Udim можно использовать для достижения реалистичности на всей модели, также его можно использовать для распределения разрешения по приоритету на некоторых частях модели, например, если у вас модель будет издалека смотреться в игре и в будущем с ней будет сцена, где видна только лишь голова, то не обязательно делать всю модель с 8k текстурами, так как это будет занимать лишнее место и требовать больше ресурсов, достаточно сделать всю модель хорошего качества, а голову, которая в будущем будет показываться крупным планом, сделать высокого качества.

7) Использование Udim в Marmoset Toolbag 5.
После долгожданного обновления Marmoset Toolbag 5, можно запекать текстурные карты, не заморачиваясь с текстурными сетами, а печь по самим Udim тайлам.
*При использовании оверлаппинга — важно его сделать качественно, иначе можно ждать проблем с шейдингом, это связано с очень чувствительной настройкой в разделе bake — Fix Mirrored Tangents. При текстурных сетах её можно было и не использовать.

8) Удобство Udim в Substance 3D Painter (далее - SP). *Будет рассказано чуть ниже.
———————Текстурные сеты———————
Многие путают их с Udim.
Имеют 3 формулировки.
1) Это одна из функций текстурирования в Substance 3D Painter или специально подготовленные Udim для Substance 3D Painter.
2) Специально подготовленные Udim для Marmoset Toolbag.
3) Так путают Udim из-за схожести, ведь текстурные сеты — это группы из текстур.
Разберём их поближе.
1) Это одна из функций текстурирования в Substance 3D Painter или специально подготовленные Udim для Substance 3D Painter.
Программа Substance 3D Painter уникальна тем, что в ней поддерживаются как и Udim, так и текстурные сеты, но важно понимать, что текстурные сеты — это не другое расположение шеллов, тайлов и т. д., а специально подготовленные Udim (подразумевается, что это те же Udim, но имеют свою специфику, а именно цвет шеллов (ну или частей модели, которые состоят из шеллов) и окрашивается исключительно low poly модель).
Udim для Substance 3D Painter — самая удобная технология, в отличие от близко не стоящих текстурных сетов, которые не эффективны и могут препятствовать текстурированию.
Рассказать это будет довольно сложно из-за большого количества комбинаций текстурных сетов с Udim, поэтому был проведён эксперимент по самому рациональному способу текстурирования, используя Udim, текстурные сеты или не используя их вообще.
https://vk.cc/cH0uAw - ссылка на сам эксперимент. (Можете оставлять комментарии в самом проекте, я на них отвечу).
Как можно заметить, в каждом из 3-ёх способов есть один рабочий как минимум, но Udim получает первое место за уникальность и все удобства, советую использовать его во всех своих проектах, даже при 1 тайле.

На скрине показан пункт с использованием Udim системы.
Текстурные сеты очень неудобны, на собственном опыте не видел тех, кто использовал бы их для текстурирования, итог таков, что не стоит и даже красить свою low poly модель для SP, а если вы и покрасили, то лучше будет удалить назначенные материалы.
2) Специально подготовленные Udim для Marmoset Toolbag.
До выхода 5 версии Marmoset Toolbag, текстурные сеты и стали очень популярны благодаря своему важному функционалу — запекание карт по определённым тайлам.
Тут у нас крашеные low poly модели или созданные текстурные сеты.

Тут уже крашеные high poly модели для запекания ID карт.

Мы получаем такие вот UV-плитки или подготовленные текстурные сеты для запекания.



Далее все наши UV-плитки должны выглядеть похожим образом. Переносим все наши плитки в один тайл под номером 1001. Хоть они все и наложены друг на друга, но у них есть отличие в цвете, поэтому не стоит пугаться. Это необходимо для того, чтоб Marmoset Toolbag увидел их, так как Udim он не видит в Multiple Texture Sets. Если у нас имеются симметричные части модели или копии, то не забываем про overlapping. В самом Marmoset Toolbag (при запечке текстурных сетов) используется тайловое пространство, то есть пространство, которое повторяет текстуру по всем тайлам, исходя из чего мы и переносим оверлапнутые шеллы в сторону на любую плитку, дефектов не будет, но они тоже принимают участие, так как на них потом автоматически накладываются запечённые карты, запечка будет по материалам только в 1001, а карты, которые мы захотим увидеть, накладываются на каждый тайл.

Overlapping будет выглядеть похожим образом:



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

Я отвечу вам «Да». У каждого текстурного сета определённой части модели свой оверлаппинг, нельзя, чтоб шеллы одного сета пересекались между собой, но у нас 3 сета, и тут, что шеллы на 1001 пересекаются между собой, что на 1002, это нормально, данное пересечение видим мы, но не программа. Она видит цвета, по которым и начинает запечку, а оверлаппинг нужен для предотвращения дефектов при запечке и оптимизации по улучшению качества.
Такие дефекты могут быть при игнорировании оверлаппинга (когда шеллы в стаках на 1001).

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

Для лучшего понимания советую прочитать статьи по этому направлению.
Переходим в программу Marmoset Toolbag и начинаем запечку.
Выбираем Multiple Texture Sets.

Здесь мы наблюдаем 3 наших материала (2, которые мы создали сами и назначили, и 1, который на автоматическом уровне создаётся на моделях при 3D-моделировании).

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



После запечки не забываем сделать всем картам правильный нейминг для удобного импорта их в SP, делается это добавлением .1001 и так далее в конце каждой карты и по типу карт.

Далее, для текстурирования у нас не должно быть ни разнесённых оверлаппингов, ни текстурных сетов, поэтому перед переходом в SP возвращаем оверлаппинги на свои места, а сами сеты разносим и убираем с них все материалы. Как мы будем текстурировать, когда у нас некоторые шеллы друг на друге (оверлаппинг)? Текстурирование будет затрагивать все шеллы, но где они друг на друге, там у нас текстура будет повторятся, поэтому не делают оверлаппинг всего, иначе при текстурировании, допустим, крови на нашей модели, эта кровь будет на всех частях модели, поэтому при импорте нашей low poly модели оверлаппинг сохраняем, как и сделали с самого начала. По итогу у нас 3 тайла, и на каждом имеются оверлаппиги.

3) Так путают Udim из-за схожести, ведь текстурные сеты — это группы из текстур.
Из-за малого опыта художников, неправильного перевода, фейковых статей начинаются дискуссии по этому вопросу, и они очень громкие.
Даже всеми известный чат GPT не может дать внятного ответа, так как общество само создало очень много ложной информации в интернете на эту тему.
Я рассказал информацию, что сам лично имею на своём опыте и опыте других художников, подтверждая её фото аргументами, надеюсь, вы не будете путать в будущем эти термины.
Спасибо, что прочитали статью, на неё было потрачено много сил, так как хочется рассказать вам всё на понятном языке, но, как вы видите, Udim затрагивает много других тем, что вызывает сложность в объяснении. Ещё до выхода статьи я получил довольно отличный фидбек, что мотивирует делать для вас ещё больше. Вы точно не потратили 70 минут своего времени впустую. <3
Jijiki
спасибо за статью, подскажите, а свет после любого ригинга с UVmap после Unwrap`а в блендере одинакого будет распространятся на моделях в разных движках или зависит от реализации освещения? или всё таки полигоны положение и размер полигонов имеют значение?
вот у вас монстр гуманоид вы его смотрели в движках(движке какомнить)?, тоесть если свет поставить перед такой моделькой, будут полигоны на распространение света по полигонам играть роль
спросил потомучто очень много времени тратил на руки и там света не было пока не увеличил обьем - соотв размер полигонов
(пысы нормали весь процесс начиная от утонченных рук были в порядке )
Скрытый текст
вот и свет вышел только в такой конфигурации, может я что-то не понимаю вот и спросил
вот а вопрос в том что тут на коленях у модели колечки - и вот на них можно увидеть этот еффект, свет или нормали ломаются просто
Jijiki
вобщем зависит от какого-то софта(имперически проверил), прошу прощения
Lipa_l1 Автор
Довольно специфический вопрос, как и ответили, зависит от софта всё.
Далее про свет: модели должны соответствовать реальным размерам (или предполагаемым), это имеет место быть, но в редких случаях эти проблемы будут, точно могу сказать, что развёртка никак не влияет на освещение. Вам лучше проверить, хорошая ли сетка на модели, правильный ли шейдинг (это обязательный параметр), так же настройки освещения должны быть корректны. Если соблюдать общие стандарты, проблем быть у Вас не должно.