что такое texel density
Texel density. Зачем нужен и как его применять
0. Что такое texel density.
Для начала, что такое тексель. Texel (аббревиатура от двух слов «TEXture» и «ELement» — текстура и элемент) — элемент текстуры, «точка». Текстура, в свою очередь, представляет собой массив текселей. Тексель может представлять собой цветную точку в изображении. Но, поскольку, текстура может быть не только изображением (двумерным массивом цветных точек), а также и другими массивами данных различных типов и размерности, то тексель, как текстурный элемент — более общее понятие.
Texel density (текселерация, тексель (сокращенно, в контексте)) — это величина, которая является отношением размера текстуры (в пикселях) к габаритам 3d модели в сцене. Texel density характеризует плотность, «качество» текстуры, в общем смысле. Выглядит в техзадании примерно так: 256px/m, 128px/inch, и так далее. Таким образом, текселерация определяет какая площадь текстуры будет отдана на модель исходя из ее размеров. Высокий texel density означает большую детализацию текстуре, низкий — меньшую, размытую текстуру.
1. Применимость texel density.
Наибольшее значение работа с текселерацией имеет при работе с окружением. Это связано с тем, что в окружение чаще используются тайленные текстуры, текстурные атласы и на объекты окружения редко выделяют отдельные карты (на пропсы, разве что). Например, к персонажам, абсолютная текселерация не имеет такого важного значения, т.к. в основном, все персонажи имеют схожие физические размеры. В техзадании на персонажа вполне может быть такое: использовать 2 сета текстур, 2048*2048 для тела, 1024*1024 для головы, и задача художника выжать максимальный тексель, правильно сделав UV развертку. Для элементов окружения, обычно указывают абсолютный тексель (например, 256px/m), т.к. они сильно разнятся по размерам (стена дома, автомобиль, дорога, почтовый ящик).
2. Относительная и абсолютная текселерация
Деление условное, но, думаю, будет полезно сделать на этом акцент. Существует относительная текселерация (в пределах одной модели) и абсолютная — в пределах всей игрых/сцены.
Относительная текселерация должна удовлетворять следующим требованиям:
Единый texel density по всей модели (допускается незначительное увеличение текселя на мелких деталях UV) Из этого правила есть ряд исключений: важные детали должны занимать больше места на развертке (и на текстуре), например лицо персонажа должно иметь больший texel density. Те детали, которые не видны или плохо видны должны иметь меньший тексель (например, днище автомобиля, подошвы ботинок у персонажа).
Максимально возможная текселерация на уникальных моделях. Это общее требование к качеству, упомянутое выше.
Пример хорошей и плохой текселерации (Источник: quixel.se/tutorial/uv-mapping-for-the-suite)
Пример исключения. Обратите внимание на разницу между четкостью текстур на лице и одежде — и это правильно, т.к. внимание игрока больше направленно на лицо, а не на одежду. (Источник: Fallout 4)
3. Как рассчитывается texel density
Тексель рассчитывается очень просто: необходимо знать размер геометрии и разрешение текстуры, а потом поделить разрешение текстуры на размер геометрии.
Посмотрите на иллюстрацию. Тут изображен куб размерами 1м*1м и плоскости разных размеров. На все объекты применена текстура 1024*1024 пикселей, соответственно, мы имеем следующие texel density для объектов, слева направо: 512px/m, 1024px/m, 2048px/m. Используется только одна текстура, но объекты разные по размерам и, следовательно, мы получаем разный texel density.
Также 3d художники используют различные скрипты и инструменты для подсчета texel density. Помимо показанного выше способа подсчета (т.е. создание специальной эталонной текстуры и подгонки вручную «под квадратики»), существую ряд скриптов для измерения и установки нужного texel density:
3ds Max
Advanced UV Normalizer
Textools
Maya
Nightshade UV
UV Deluxe
4. Как можно привести ассеты к одной плотности?
1. Редактирование UV, использование тайлов
Слева направо: увеличена развертка UV в два раза, без изменений, уменьшена в 2 раза. Таким образом на иллюстрации все объекты имеют один texel density равный 1024px/m.
2. Изменения размера текстур
Для большого объекта использована большая текстура, для меньшего — меньшая.
3. Изменения размеров объекта. Да, таким образом можно повлиять на texel density, но на практике никто ведь не будет делать автомобиль меньше в два раза лишь оттого, что по texel density не хватает плотности текстуры?
5. Как использовать texel density, выводы и полезные советы
1. Начните с правильных размеров.
В движке, в редакторе, следует установить эталонный масштаб и единицы измерения. Это следует сделать в самом начале разработки и придерживаться до конца.
3. Продолжать следовать этим значениям и при постановке задачи указывать их в ТЗ.
Следование одному texel density для предметов схожих планов и одной значимости даст возможность сделать арт игры более цельным, из него не будут выпадать отдельные элементы в стиле «Вы плохо прорисованы, вас скоро убьют». Также, при использовании этого подхода, будет меньше вероятность потратить ресурсы нерационально (в симуляторе машиниста, на костыли ЖД полотна использовать текстуры 1024*1024, например).
4. Пока я писал черновик Leonardo Iezzi сделал отличный урок по texel density. Обязательно ознакомьтесь со статьей Leonardo, если данная тема интересна.
Texel Density
Эта статья предназначена 3d художникам, техническим художникам, а также всем разработчикам, которые связаны с 3д графикой, текстурами и составлением технических заданий. В ней я покажу чем может быть полезно следование одному текселю, как его считать и на что он может влиять.
Что такое texel density.
Для начала, что такое тексель. Texel (аббревиатура от двух слов «TEXture» и «ELement» — текстура и элемент) — элемент текстуры, «точка». Текстура, в свою очередь, представляет собой массив текселей. Тексель может представлять собой цветную точку в изображении. Но, поскольку, текстура может быть не только изображением (двумерным массивом цветных точек), а также и другими массивами данных различных типов и размерности, то тексель, как текстурный элемент — более общее понятие.
Texel density (текселерация, тексель (сокращенно, в контексте)) — это величина, которая является отношением размера текстуры (в пикселях) к габаритам 3d модели в сцене. Texel density характеризует плотность, «качество» текстуры, в общем смысле. Выглядит в техзадании примерно так: 256px/m, 128px/inch, и так далее. Таким образом, текселерация определяет какая площадь текстуры будет отдана на модель исходя из ее размеров. Высокий texel density означает большую детализацию текстуре, низкий — меньшую, размытую текстуру.
Применимость texel density.
Наибольшее значение работа с текселерацией имеет при работе с окружением.
Это связано с тем, что в окружение чаще используются тайленные текстуры, текстурные атласы и на объекты окружения редко выделяют отдельные карты (на пропсы, разве что). Например, к персонажам, абсолютная текселерация не имеет такого важного значения, т.к. в основном, все персонажи имеют схожие физические размеры. В техзадании на персонажа вполне может быть такое: использовать 2 сета текстур, 2048*2048 для тела, 1024*1024 для головы, и задача художника выжать максимальный тексель, правильно сделав UV развертку. Для элементов окружения, обычно указывают абсолютный тексель (например, 256px/m), т.к. они сильно разнятся по размерам (стена дома, автомобиль, дорога, почтовый ящик).
Относительная и абсолютная текселерация.
Деление условное, но, думаю, будет полезно сделать на этом акцент. Существует относительная текселерация (в пределах одной модели) и абсолютная — в пределах всей игры/сцены.
Относительная текселерация должна удовлетворять следующим требованиям:
— Единый texel density по всей модели (допускается незначительное увеличение текселя на мелких деталях UV) Из этого правила есть ряд исключений: важные детали должны занимать больше места на развертке (и на текстуре), например лицо персонажа должно иметь больший texel density. Те детали, которые не видны или плохо видны должны иметь меньший тексель (например, днище автомобиля, подошвы ботинок у персонажа).
— Максимально возможная текселерация на уникальных моделях. Это общее требование к качеству, упомянутое выше.
Шейдинг — это подложка под запекание нормалки. Чем лучше он выглядит, тем красивее будет финальная модель и 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.
Плотность текселей
В этом уроке мы поговорим о таком понятии как тексели. Разберем что это такое и с чем их едят.
Видеоурок
Текстовый урок
Итак, первая картинка, в принципе, отвечает на поставленный вопрос, но может остаться легкое недоумение. Пиксель — это наименьшая единица информации, которая может отображаться на экране. Все просто и понятно. Наши мониторы состоят из пикселей, чем их больше, тем лучше (для нас, но не нашей видеокарты, но не об этом сейчас 🙂 ). Но текстура тоже состоит из пикселей, ведь мы ищем их большего разрешения, для повышения качества материалов.
Но проводить параллель между пикселем и текселем можно лишь в редакторе изображений или до тех пор, пока вы не наложите свою текстуру на объект. Теперь определение текселей. Тексель — это наименьшая единица информации из которой состоит текстура. Ну вот, то есть пиксель скажите вы. И в принципе, вы будете правы. Так оно и есть.
Но… Один пиксель монитора может быть определен множеством текселей и наоборот, один тексель может покрывать множество пикселей.
Отсюда выплывает следующее определение. Плотность текселей — это количество «пикселей» текстуры на меш-объекте. Люди часто говорят «соотношение пикселей» или «плотность пикселей» подразумевая под этом плотность текселей.
Здесь мы видим несколько кубиков и у всех из них различная плотность текселей. Указанная плотность 10,24px/cm установлена лишь для пола со стенами и за счет этого мы можем видеть на них одинаковую плотность текстуры. Для кубиков плотность либо слишком низкая и от этого текстура мыльная, либо же чрезмерно высокая, от чего большая часть деталей попросту не отображается ввиду относительно низкого разрешение дисплея.
Чтобы рассчитать плотность текселей, нужно разделить разрешение текстуры на площадь покрываемую ею. Все элементарно и просто. Делим разрешение текстуры на квадратный метр и получаем итоговую плотность пикселей на квадратный сантиметр. Чем выше значение, тем качественен будет выглядеть текстура на объекте, но лишь до тех пор, пока не упрется в физические пределы вашего монитора.
Если вы хотите достичь 1024px на квадратный метр (100см), то плотность текселей должна составлять 10.24. Учитывайте, что если вы будет использовать текстуру размером 1024х1024 пикселя, то она будет полностью покрывать все UV-пространст (от 0 до 1 по обеим осям). Если же текстура 2048х2048, то она лишь на четверть должна покрывать UV-пространство.
Сокращение TD расшифровывается как Texel Density (то есть плотность текселей). Поэтому, когда речь идет о текстурах или материалах на CG-шных форумах, знайте, речь идет о плотности текселей на объектах.
Давайте посмотрим на объекты со второго слайда с равномерной плотностью текселей. Для всех объектов она составляет 10,24px/cm. Если посмотреть на эти кубики в ортогональном режиме на виде сбоку или же спереди, они вовсе начнут сливаться со стенами, ввиду равномерной плотности одной и той же текстуры.
Перед тем как вы приступите к созданию окружения или игры, очень важно определится с правильными масштабами текстур, их размерами и плотностью текселей, иначе все вышеперечисленное будет не пропорционально. Выбор плотности текселей позволит избежать создания художниками излишней, либо недостаточной детализации для объектов окружения и несоответствия масштабов текстур и их качества.
В случае использования уникального объекта с уникальной текстурой (как тот, что вы видите на экране) вам нужно лишь подобрать текстуру соответствующего разрешения и отрегулировать масштаб отдельных UV-островов в соответствии с их занимаемой площадью на объекте. Если какая-то часть объекта занимает большую его половину, то и на UV-развертке она должна занимать большую половину. При таком подходе плотность текселей будет равномерной по всему объекту.
Когда вы используете бесшовную текстуру (tileable), вы должны держать в голове плотность текселей и подгонять размер UV-развертки в соответствии с ней.
Формулу вы видите на изображении:
Давайте разберем пару наглядных примеров…
При наличии текстуры с разрешением 512х512 пикселей и требуемой плотности текселей 10,24 нам нужно два повторения текстуры на каждые 100см или же 4 на каждый квадратный метр.
Другой пример… При наличии текстуры с разрешением 256х256 пикселей и требуемой плотности текселей 5,12 нам нужно те же 2 повторения текстуры на каждый метр, но если наш объект имеет длину 2 метра, как в примере, то это дает 4 повторения текстуры.
Все было хорошо и просто ровно до этого момента. Мы всегда знаем размеры наших объектов в сцене и разрешение текстур, поэтому по не хитрой формуле все можем рассчитать. Так то оно и есть ровно до того момента, пока мы не начнем рендерить анимацию или же создавать трехмерную игру.
Дело в том, что в обоих этих случаях площадь монитора покрываемая этими объектами может изменяться. Так как же определить, какая плотность текселей подойдет вашей сцене или игре?
Есть два основных фактора, которые помогут определить плотность текселей. Первый, это насколько большим объект будет на экране и второй, это количество доступной вам памяти. В идеале, вы хотите, чтобы количество текселей равнялось количеству пикселей отображающих ваш объект. Но конечно же, на практике такого почти никогда не бывает, поэтому мы можем лишь приближаться к этим значениям настолько, насколько это возможно.
Стоит отметить такое понятие как Mipmaping. С помощью данной техники можно изменять используемую текстуру (точнее ее размер) в зависимости от площади, которую объект покрывает на экране. Но это тоже не панацея и идеальных результатов она не дает, да и тема эта стоит отдельного и более детального рассмотрения.
В играх от 3-го лица вы не так часто будете приближаться к окружению, зато часто будете видеть своего персонажа. Поэтому для окружения используется примерно 512px на метр, а для персонажа 1024+ и выше.
Можно разделить окружение на 3 категории: близкие объекты с которыми игрок может взаимодействовать (указаны зеленым), средней удаленности, то есть объекты, которые вы видите, но не можете подойти к ним слишком близко (указаны желтым) и объекты фона, которые находятся очень далеко и вы никогда к ним не приблизитесь (указаны красным).
Если мы посмотрим на предыдущий слайд сверху, то результат будет примерно следуюшим:
Зеленые объекты помимо игровой зоны могут иногда использоваться в средней зоне, но точно не стоит использовать их в удаленной зоне. Такой объект будет выбиваться своей высокой детализацией на фоне остальных с низкой плотностью текселей и будет впустую расходовать огромное количество памяти.
Средние объекты иногда можно использовать в удаленной зоне, но не стоит их переносить в игровую зону, так как при близком их рассмотрении они будут иметь низкое разрешение текстур.
Объекты заднего фона стоит использовать лишь в своей зоне и ни в коем случае не в средней и игровой (если вы не создаете пиксель-арт конечно же).
Подобное разделение позволяет вам по максимуму использовать сэкономленную память для максимальной детализации игровых объектов и не тратить ее на фоновые объекты, ведь этого никто даже не заметит.
Надеюсь, теперь у вас есть более четкое представление о том, что такое тексели и какой плотности они должны быть в той или иной ситуации.