Эта статья предназначена 3d художникам, техническим художникам, а также всем разработчикам, которые связаны с 3д графикой, текстурами и составлением технических заданий. В ней я покажу чем может быть полезно следование одному текселю, как его считать и на что он может влиять. Основные действующие лица — чеккер, модели, текстуры, мыльцо, UV и прочие радости разработки 3d контента.

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

Blender
Кто знает, подскажите в комментариях, добавлю.

4. Как можно привести ассеты к одной плотности?


1. Редактирование UV, использование тайлов


Слева направо: увеличена развертка UV в два раза, без изменений, уменьшена в 2 раза. Таким образом на иллюстрации все объекты имеют один texel density равный 1024px/m.

2. Изменения размера текстур


Для большого объекта использована большая текстура, для меньшего — меньшая.

3. Изменения размеров объекта. Да, таким образом можно повлиять на texel density, но на практике никто ведь не будет делать автомобиль меньше в два раза лишь оттого, что по texel density не хватает плотности текстуры?

5. Как использовать texel density, выводы и полезные советы


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

2. В документации попробуйте определить важность ассетов и соответственно, качество текстур для них. Ассеты первого плана (например, оружие, руки в FPS, персонаж в TPS, вблизи глаз VR приложения), предметы важные для геймплея (например, броня в Fallout 4, верстак, HL2 аптечка на стене и т.д.), предметы окружения и предметы дальнего плана. Тут не помешает сделать тесты прямо в движке с эталонными текстурами, прикинуть как это будет смотреться. Для каждого типа ассета можно использовать собственный texel density.

3. Продолжать следовать этим значениям и при постановке задачи указывать их в ТЗ.
Следование одному texel density для предметов схожих планов и одной значимости даст возможность сделать арт игры более цельным, из него не будут выпадать отдельные элементы в стиле «Вы плохо прорисованы, вас скоро убьют». Также, при использовании этого подхода, будет меньше вероятность потратить ресурсы нерационально (в симуляторе машиниста, на костыли ЖД полотна использовать текстуры 1024*1024, например).

4. Пока я писал черновик Leonardo Iezzi? сделал отличный урок по texel density. Обязательно ознакомьтесь со статьей Leonardo, если данная тема интересна.
Поделиться с друзьями
-->

Комментарии (6)


  1. maniacscientist
    21.11.2016 20:34

    А хочется сэкономить — наворачивайте антиваномас-защиту: жёсткое DOF-размытие всего, что между передней плоскостью отсечения и ещё одной, отстоящей от неё на пару единиц


    1. Osmandos
      22.11.2016 13:23

      Именно так и делают чтобы замаскировать разбежки в текселе и текстуры низкого разрешения.


  1. Darkxiv
    22.11.2016 13:22

    Важно отметить, что стоит стремиться к тому, чтобы размер текселя на экране совпадал с пикселем. Поэтому, выбирая плотность, стоит также отталкивать от того, сколько места будет занимать тот или иной полигон на экране (на каком-нибудь эталонном 1920х1080).


    1. Osmandos
      22.11.2016 13:26

      Согласен. Для этого нет ничего лучше реальных тестов. Частично именно с этим связан вынос объектов переднего плана в отдельную категорию. Но есть и проблема — сейчас разбежка в разрешении мониторов довольно большая, от FHD до 4K, ситуацию усугубляет также то, что при 4К и так не каждая топовая видеокарта справляется, а если еще дополнительно грузить текстуры высокого разрешения…


      1. maniacscientist
        22.11.2016 14:26

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


  1. damat
    24.11.2016 17:26

    оставлю тут наработочку, которую делал на эту тему много лет назад: