{"id":3824,"url":"\/distributions\/3824\/click?bit=1&hash=a0d33ab5520cacbcd921c07a49fc8ac5b78623b57936b992ce15c804b99210d4","title":"\u041a\u0430\u043a\u0443\u044e \u0440\u0435\u043a\u043b\u0430\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u043d\u0430 DTF \u0438 \u043a\u0442\u043e \u0435\u0451 \u0443\u0432\u0438\u0434\u0438\u0442","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"75ec9ef4-cad0-549d-bbed-1482dc44e8ee","isPaidAndBannersEnabled":false}
Gamedev
Empty Node

Плотность Текселей и немного теории текстур от Энтони О'Доннелла

Вступление

Привет и добро пожаловать. Я подготовил данную статью, с целью пролить свет на такую тему как плотность текселей и другие важные элементы теории текстур, которые необходимо понимать всем художникам работающим в области геймдева. Как правило, эти темы не преподаются должным образом, а в сети не так уж и много действительно дельной информации. Я целенаправленно сосредоточился на данной теме , поскольку в начале своей карьеры попросту не понимал всего этого. Исходя из разговоров (за последние 13 лет) со многими художниками, самых разных уровней, я сделал вывод что эта тема не совсем понятна и другим людям. Учитывая это, я решил подготовить данный материал, чтобы попытаться объяснить концепцию плотности текселей и рассмотреть те преимущества, которые она приносит проекту.

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

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

Итак, о плотности текселей

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

Отсутствие постоянной/равномерной плотности текселей на всех поверхностях в первую очередь влияет на финальный внешний вид и общее качество изображения. Об основных причинах сохранения постоянной плотности текселей я расскажу чуть позже.

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

Основы теории текстур

Для начала я расскажу о теории текстур, которая необходима вам для понимания и применения концепций, лежащих в основе плотности текселей.

Что такое тексель?

Тексель (от англ. Texel, texture element/элемент текстуры) — это наименьший элемент текстурной карты (texture map). Например, текстурная карта размером 1024x1024, означает что она 1024 текселя в ширину по осям U и V.

Пример текстурной карты. Ось U (горизонтальная ось) 1024 Текселя и ось V (вертикальная ось) 1024 Текселя

Что такое пиксель?

Пиксель (от англ. Pixel, picture element/элемент изображения) — это наименьший элемент цифрового изображения. С точки зрения игрового арта, пиксель — это наименьший элемент цифрового изображения, отображаемого на экране устройства.

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

Слева: Прмиер того как текстурная карта, расположенная дальше от камеры, приводит к отображению более одного текселя на один пиксель. Это называется минификацией/преуменьшение (Minification).

Справа: Пример того как текстурная карта может находиться рядом с камерой, в результате чего один тексель накладывается (mapped) более чем на один пиксель. Это называется увеличением (Magnification).

Что такое текстурная карта?

Текстураня карта (texture map) — это цифровое изображение применённое к поверхности (накладываемое на поверхность).

Слева направо: 1. 3D модель без текстурной карты. 2. Пример текстурной карты (Albedo/Base Color) 3. 3D модель к которой применена текстурная карта.

UV Маппинг

UV-преобразование или UV-маппинг (UV-Mapping) относится к процессу проецирования текстурной карты на поверхность трехмерной модели.

Это делается через UV (текстурные координаты), которые представляют собой координаты положения в двухмерном пространстве. Данные каждой UV координаты присваиваются каждой соответствующей вершине модели.

Это позволяет правильно нанести тексели изображения на модель или поверхность. В приведенном ниже примере показана 3D модель к которой применена текстурная карта. В этом примере тексели, расположенные в точке UV координат A, наносятся (mapped) на вершину модели, также помеченную как A.

Типы компоновки текстур (Texture Layout)

Тайловые текстуры

Тайловые текстуры (Tiling textures) равномерно (без швов) повторяются по осям U и V и наиболее часто используются при создании элементов окружения.

Трим-шиты

Трим-шиты/обрезанные листы (Trim sheets) состоят из серии бесшовных тайлящихся полос по оси U или V.

Текстура с уникальной разверткой

Текстура с уникальной разверткой (Unique Unwrapped Texture). Текстурные карты с такой компоновкой содержат все UV шеллы (shells) ассета, внутри диапазона от 0 до 1 и не повторяются. Обычно один ассет имеет одну текстуру с уникальной разверткой. Листва, показанная на изображении выше, имеет тенденцию использовать текстуры с компоновкой данного типа.

Текстурный атлас

Текстурный атлас (Atlas Texture). Это текстурная карта состоящая из нескольких текстурных карт. Основная причина её использования — это снижение используемой памяти и уменьшение числа вызовов отрисовки.

Текстуры с мульти-компоновкой

Текстуры с мульти-компоновкой (Multi Layout Texture). В данном примере используется компоновка типа Trim Sheet и элементы с уникальной разверткой. По сути, это карта типа Atlas Texture в которой есть часть в виде Trim Sheet.

Типы текстурных карт

Слева направо: Карты типа Albedo/Base Colour, Normal, Roughness, Ambient Occlusion.

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

Albedo/Base Colour

Это текстура, которая содержит информацию о цвете. Если она создается для PBR пайплайна, альбедо не будет содержать никакой информации об освещении.

Normal Map

В RGB каналах хранятся значения направления, в котором смотрят пиксели. Эти значения обычно получаются посредством переноса этих данных из модели с более высокой точностью (посредством процесса запекания).

Roughness

Текстура шероховатости определяет, насколько шероховатой или гладкой является поверхность. Данные являются линейными в диапазоне от 0 до 1, где 0 - это 100% гладкость, а 1 - полная шероховатость.

Ambient Occlusion (AO)

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

Слева направо: Карты типа Metallic, Gloss, Height, Opacity.

Metallic

В PBR пайплайне текстура типа Metallic определяет, какая часть материала является металлом, а какая нет. Обычно это двоичная черно-белая текстура.

Gloss Map

Карта типа Gloss является инвертированной версией карты шероховатости, где 0 — это полностью шероховатая поверхность, а 1 — полностью гладкая поверхность.

Height Map

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

Opacity Map

Карта непрозрачности/альфа-карта — контролирует уровень прозрачности поверхности: Черный — полностью прозрачен, а белый — полностью непрозрачен.

Цветовые пространства sRGB и Linear

Цель данного раздела объяснить, что нужно знать игровому художнику о цветовых пространствах sRGB и Linear RGB. Основная причина заключается в создании текстур и их влиянии на создание и последующую настройку текстур. Это далеко не самое детальное объяснение, так что дополнительную информацию вы можете найти в сети самостоятельно.

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

Как человеческий глаз воспринимает свет

Человеческий глаз более чувствителен к тёмным оттенкам, чем к светлым, по этому ему легче различать более темные оттенки. Это привело к созданию гамма-кодирования (gamma encoding) как способа сжатия данных, поскольку оно способствует большей точности в более тёмных областях изображения. sRGB является примером гамма-коррекции (gamma correction). Ниже вы можете увидеть эффект, данного смещения значений, который видно в точке Mid Grey (средний серый).

Вверху: Линейный градиент, в котором каждый шаг приращения(инкремента) имеет одинаковое значение от 0 до 1.

Внизу: Тот же самый градиент после преобразования в цветовое пространство sRGB.

Игровому художнику необходимо знать, что любые текстуры, предназначенные для рендеринга и отображения на экране, такие как Base Color/Albedo/Diffuse необходимо установить в режим sRGB (в используемом 3D пакете или движке).

Ниже приведён пример текстуры Base Color, слева в линейном RGB, а справа в sRGB.

Текстуры, которые предоставляют шейдеру данные для расчёта отклика поверхности (surface response) материала, такие как карты Roughness, Height, Metallic, Ambient Occlusion, Gloss, Opacity или Normal должны находится в линейном цветовом пространстве RGB (Linear RGB colour space).

Что такое MIP-карты?

MIP-карты (Mipmaps) — это предварительно рассчитанные уменьшенные варианты текстурной карты. Они сохраняются на уровнях MIP-карты (mipmap levels) текстурного ассета (texture asset). Каждый её уровень в два раза меньше предыдущего. В приведенном ниже примере каждый уровень окрашен по-разному (для ясности).

Использование MIP-карт не только уменьшает шум от часто повторяющихся деталей (плотная детализация) на расстоянии, но и оптимизирует рендеринг. Поскольку нижние MIP-уровни рендерятся на расстоянии, это уменьшает количество текселей, сэмплированных на пиксель(sampled per pixel).

На изображении выше, вы можете увидеть, как рендерятся цветные MIP-карты, когда они уходят вдаль. Зеленый (верхний уровень) рядом с камерой и красный (нижний уровень) дальше всего от камеры.

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

Сделав скриншот в стандартном разрешении 1920x1080 пикселей и увеличив масштаб, вы можете увидеть что версия слева, на которой есть MIP-карты, лучше читается на таком расстоянии, поскольку она сохранила много деталей. Версия без MIP-карт стала более «плоской», потеряв четкость краёв на таком расстоянии.

Сделав скриншот с более высоким разрешением (7680 X 4160 пикселей) и увеличив масштаб, вы увидите это более явно.

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

Упаковка текстурных карт в каналы

Упаковка каналов означает добавление отдельных GreyScale карт в каждый канал текстуры. Это уменьшает количество текстур, сэмплируемых шейдером, и является действительно хорошей оптимизацией для уменьшения объема памяти, которую занимают текстуры в сцене. Поскольку эти текстуры (как правило) являются данными для шейдера, их необходимо использовать в линейном цветовом пространстве RGB.

Плотность текселей

Теперь пора перейти к основной теме данной статьи — плотность текселей (Texel Density).

Что означает «плотность текселей»?

Плотность текселей ознчает число текселей, накладываемых на поверхность.

В примере слева мы видим текстуру 1024x1024, нанесенную на плоскость площадью 1m². Плотность текселей здесь равна 10.24 текселей на СМ. 1024 (текселей) ÷ 100 (СМ) = 10.24 (текселей).

В примере справа мы видим текстуру 256x256, нанесенную на плоскость площадью 1m². Плотсность текселей здесь равна 2,56 текселя на СМ. 256 (текселей) ÷ 100 (СМ) = 2,56 (текселя).

Работа c тайловыми текстурами

Чтобы выяснить, сколько раз наложить/повторить текстуру на поверхность для достижения целевой плотности текселей (target texel density), вам необходимо знать следующее:

  • Выбранная вами плотность текселей на M или CM
  • Размеры площади поверхности в M или CM
  • Размер текстуры которая будет использоваться в текселях, например. 512x512, 1024x1024 и т.д.

Получив эту информацию, вы можете использовать приведенное ниже уравнение.

Целевая Плотсность Текселей x Площадь Поверхности ÷ Размер текстуры = число повторений (тайлинга)

Здесь приведены два примера на основе данного уроавнения: один в CM и один в M, оба работают с плотностью 10.24 текселей на 1CM.

Сохранение постоянной плотности текселей с тайловыми текстурами

Данный пример показывает, как тайлятся (повторяются) текстуры разного размера для поддержания постоянной плотности 20.48 текселей на 1CM.

На поверхности площадью 2m², текстура с разрешением 2048 повторяется дважды, тогда как текстура 1024 должна повториться уже четыре раза, а текстура 512px — восемь раз. Это повторение может быть выполнено посредством масштабирования UV-шеллов или посредством умножения значений UV, непосредственно в шейдере.

Работа с моделями с уникальной разверткой

Чтобы определить подходящий размер текстуры для модели с уникальной разверткой, так чтобы она соответствовала определенной плотности текселей, используйте метод приведенный ниже:

Способ №1

  • Определите общую площадь поверхности (total surface area или сокращенно TSA) формы (для оценки сложных моделей используйте прокси болванку).
  • Получите квадратный корень из общей площади поверхности и убедитесь, что он равен m² или cm².

Получив эту информацию, вы можете использовать приведенное ниже уравнение.

Целевая Плотность Текселей x Площадь Поверхности² = Размер текстурной карты

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

Чтобы вычислить общую площадь поверхности, уравнение выглядит следующим образом:

TSA : 2(WxH) + 2(WxL) + 2(LxH)

В данном примере TSA прокси объекта вычисляется так:

TSA = 2(80x50) + 2(80x20) + 2(20x50) = 13200

Квадратный корень из 13200 равен 114,891

10,24 на CM x 114,89 = 1176,47‬

Округление в меньшую сторону показывает что для данного ассета подойдет текстура с разрешением 1024x1024.

Если бы мы нацелились на более низкую плотность текселей, мы бы получили результат ниже, который составляет около 512x512.

5,12 на CM x 114,89 = 588,24

Модель чемодана (слева) и его упрощенная прокси-модель (справа)

Способ №2

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

  • Разверните модель на UV-шеллы с постоянной плотностью текселей (на картинке в центре).
  • Упакуйте UV-шеллы в пространство UV 0-1
  • Используя удобные вам инструменты для работы с UV, определите плотность текселей на единицу относительно размера текстуры.
  • Это даст вам достаточно информации для принятия решения.

Затем, используя свои инструменты для работы с UV (я использовал Maya), вы можете выбрать UV-шеллы и "получить" ("get") значение текселей на единицу, относительно размера карты, как показано ниже.

Целевая плотность текселей составила 10.24 на 1CM. Ничего не попало в это значение, но 1024 даёт плотность текселей на CM равную 7.5686, что является наиболее близким к целевому значению.

Можно было бы использовать текстуру 2048, которая дала бы TD равную 15.1372 на 1CM. Это может быть подходящим для пропса который имеет важное значение (hero prop).

Способ №3

Ещё более простой, но менее точный метод — развернуть плоскость размером 1m² в UV пространстве 0 до 1 и затекстурить её с помощью контрольной, текстуры в виде шахматного узора (checker pattern) размером 1024x1024. Поскольку единицы измерения сцены в программе задаются в сантиметрах, то данная плоскость будет корректно покрыта текстурой 1K, и мы получим 10,24 текселя на 1CM.

Затем, отмасштабируйте UV-шеллы модели до тех пор, пока шашечки узора не будут соответствовать размеру квадратов на нашей референсной плоскости.

  • Единицы сцены указаны в CM
  • Размер карты установлен на 1024.
  • Плотность текселей составляет 10,24 на 1CM.

Однородность плотности текселей

Модель слева имеет непостоянную плотность текселей по всей модели. Модель справа имеет постоянную плотность текселей по всей модели.

Выбранная плотность текселей составляет 10.24 текселя на CM. Это действует как текстура 2048x2048 на поверхности 2m².

Типы материалов которые используются в данном примере:

Brick (Кирпич), Concrete Blocks (Бетонные блоки), Blue Paint (Синяя краска), Glass (Стекло), Brass (Латунь), U Tiling brick trim (Трим-шит кирпича с тайлингом по оси U).

Как мы говорили выше UV-шеллы можно масштабировать, «сравнивая» их с корректно развернутым эталонным мешем или используя опции текущих инструментов, которые можно найти в большинстве DCC пакетов или используя сторонние плагины. В данном примере (на изображении ниже), выбранный UV шелл отмасштабирован таким образом чтобы площадь его поверхности соответствовала 10.24 текселям на CM.

Ниже показано, как была выполнена UV-развертка данного ассета для поддержания заданной плотности текселей. Здесь мы использовали несколько UV компоновок разного типа, которые предназначенны для использования с разными наборами текстур.

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

Дополнительный совет. Один из полезных трюков с UV-разверткой — группируйте шеллы на основе материала или набора текстур, как показано выше. Это сделает дальнейшее редактирование более удобным.

Используя данную модель в качестве примера и рассмотренные ранее методы определения плотности текселей, я покажу, как это работает. Целевой плотностью будет 5.12 текселей на CM.

В случае с фасадом здания наша цель состоит в том, чтобы вычислить, сколько раз накладывать текстуру 1024x1024, чтобы достичь заданной плотности текселей для «кирпичной» поверхности.

Целевая Плотность Текселей x Площадь Поверхности ÷ Размер Текстуры = Количество повторений (тайлинг)

5.12 x 360 CM ÷ 1024 = 1.8 Значение для оси U (Горизонталь)

5.12 x 310 CM ÷ 1024 = 1.55 Значение для оси V (Вертикаль)

Для двери будет использовано следующее уравнение:

Целевая Плотность Текселей x Площадь Поверхности² = Размер Текстурной карты

5.12 x 150² = 768

Учитывая рассчитаное покрытие текстуры в 768 текселей, нам подойдет текстура 1024 X 1024, оставив место и для других элементов, таких как дверной косяк.

Здесь присутствует небольшое отклонение в плотности текселей для более эффективной упаковки UV. Подобные вещи — это всегда компромисс. Обычно я допускаю отклонения до 20%. Не беспокойтесь об этом.
Это финальный результат, показывающий, что меш с примененными текстурами точно соответствует заданной плотности текселей.

Масштаб деталей

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

В приведенном выше примере мы придерживаемся заданной плотности текселей, при которой 2K текстура накладывается на поверхность площадью 2м². Поверхность выглядит четкой и детализированной, так что это УСПЕХ. Верно?

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

Обычно это «исправляется» посредством тайлинга текстуры по поверхности, как это сделано в данном примере. Теперь, несмотря на то, что 2K текстурная карта повторяется 4 раза на поверхности площадью 2м². Это делает плотность текселей равной 20.48 на 1 CM по сравнению с целевыми 10.24 на 1 CM. Чем чаще текстура будет «повторяться», тем больше будет увеличиваться это значение.

Это текстура с заданной плотностью текселей 10.24 на CM. Здесь мы видим её верхнюю MIP-карту.

Когда текстура тайлится по поверхности четыре раза, то отрисовываются более низкие уровни MIP-карты. Это делает использование опции «более высокого разрешения» для тайловых 2K текстур немного избыточным, поскольку на те самые желанные мелкие детали будет неблагоприятно влиять MIP-маппинг, который необходим.

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

Это пример 2K текстуры на поверхности 2M² с корректной плотностью 10.24 текселей на CM. Преимущество этого заключается в том, что каждый квадрат уникален, что дает нам больше вариаций на поверхности, и это приводит к лучшему тайлингу на больших поверхностях.

В данном примере текстура применена к большой поверхности

На таком расстоянии использование 2K текстуры, которая повторяется четыре раза на площади 2m², не будет иметь заметной визуальной разницы с точки зрения качества, но будет иметь заметные повторяющиеся элементы.

Вблизи между этими двумя примерами видна четкая разница.
Карты детализации (Detail maps) используемые в шейдере, могут иметь большое значение, в тех случаях, когда материалы рассматриваются вблизи. При этом нам не надо нарушать правила плотности текселей или ставить под угрозу разнообразие текстур.

Всегда настраивайте размер элементов в текстурной карте в соответствии с требуемым масштабом. Так чтобы они соответствовали площади поверхности, к которой они будут применяться. Во всех вышеперечисленных случаях текстуры 2048x2048 применяются к плоскости 2m².

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

Приведения к заданной плотности текселей

Давайте рассмотрим два способа приведения к заданной плотности текселей. В обоих случаях будет назначена текстура 2048x2048. Листва будет использовать всё текстурное пространство с UV-разверткой, которая имеет постоянную плотность текселей. В случае с портфелем, мы позволим заданной плотности текселей определить, сколько места он получит.

Здесь мы видим UV развертки наших моделей. Листва полностью заполняет собой пространство с конечным разрешением текстуры, которое будет определено позже. У чемодана UV-шеллы отмасштабированы до соответствующего размера с целью достижения желаемой плотности текселей — 10.24 на 1CM на текстуре 2048. Это приводит к тому, что остается много места для других ассетов, которые могут разделить между собой оставшееся текстурное пространство, например, альтернативные варианты чемодана или какие-то другие пропсы из этой сцены.

После применения текстуры-чеккера в 2K разрешении, становится отчетливо видно что плотность текселей у листвы слишком плотная. В данный момент она составляет 28.09 текселей на CM. Способ решения данной проблемы — уменьшить размер текстурной карты (мы сделаем это чуть позже). В свою очередь портфель, уже выглядит однородно, поскольку шеллы были отмасштабированы должным образом/корректно. Данный метод также работает при создании развертки для моделей которые будут использовать тайловые текстуры.

Понижение разрешения текстуры листвы до 1024x1024 делает её более близкой к желаемым 10.24 на CM — плотность текселей составляет 14.04 текселей на CM. В действительности, я бы оставил её как есть, поскольку в играх листва часто масштабируется, и в данном случаев, её выгодно иметь в более высоком разрешении.

Уменьшение разрешения текстуры листвы до 512 X 512 приводит к слишком низкому значению плотности — 7,02 текселей на CM. Листва — один из тех случаев, когда немного повышенное значение TD, относительно заданной плотности текселей — это неплохо, поскольку в большинстве игр разных жанров, она часто оказывается близко к камере и игроку.

Выбор плотности текселей

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

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

Окончательное решение определяется следующими критериями:

  • Разрешение текстур при приближении к камере
  • Баланс между разрешением и покрываемой площадью поверхности
  • Балансировка ограничений по памяти

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

  • Текстура с разрешением 512x512 использует примерно 171 KB
  • Текстура с разрешением 1024x1024 использует примерно 683 KB
  • Текстура с разрешением 2048x2048 использует примерно 2731 KB

Чтобы наглядно продемонстрировать то, как работают уровни MIP-карт в этих примерах, я раскрасил их в разные цвета (исключительно в отладочных целях). Текстуры самого верхнего MIP-уровня — это 2048x2048 текселей. Цель всего этого — увидеть то, как часто рендерится верхний MIP-уровень и сколько экранной области он занимает.

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

Тестовые сцены на основе стандартных игровых шаблонов Unreal Engine 4.

FPS Example, Third Person Example, Top Down Example

FPS Default Camera Example

На изображении выше, все поверхности развернуты одинаково с плотностью текселей 10.24 на 1CM. Текстура 1024x1024. будет покрывать поверхность площадью 1m², а 2048x2048 поверхность площадью 2m². Обратите внимание, что MIP самого верхнего уровня 2048x2048 "белый/серый" при использовании данного вида (положение камеры) не виден вообще, а второй MIP уровень (оранжевый) 1024x1024 текселей виден только в самой нижней части экрана.

В этом примере плотность текселей равна 5.12 на 1CM. Текстура 512x512 покроет 1m², а 1024x1024 покроет поверхность площадью 2m². Верхний MIP уровень в данном примере — оранжевый, который теперь виден в нижней части экрана. При использовании такого вида разница между плотностью текселей 10.24 и 5.12 текселей на CM, нанесенных на одну ту же поверхность, вообще не заметна.

В этом примере плотность текселей равна 2.56 на 1CM. Текстура размером 256х256 покроет поверхность площадью 1m². Текстура 2028x2048 покроет поверхность площадью 8m². Верхний MIP-уровень (зеленый) теперь заполняет большую часть экрана, что эффективно с точки зрения рендеринга, но это вызовет проблемы с качеством при смене вида (положения камеры).

FPS Example: Сравнение разрешения

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

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

Слева на право: 1024x1024 текселей на 1OOcm (10.24 текселей на CM), 512x512 текселей на 1OOcm (5.12 текселей на CM), 256x256 текселей на 1OOcm (2.56 текселей на CM).

На скриншотах сделанных ранее с использованием стандартного FPS вида, было отмечено, что верхний MIP-уровень, при плотности 10.24 текселей на CM, не был заметен вообще. Теперь же, когда камера наклонена к земле стали видны верхние MIP'ы. С точки зрения качества трудно сказать есть ли разница, когда плотность составляет от 10,24 до 5,12 текселей на CM. Однако, с более низким разрешением 2.56 текселей на 1CM, вы можете заметить что результат становится более размытым.

Слева на право: 1024x1024 текселей на 1OOcm (10.24 текселей на CM), 512x512 текселей на 1OOcm (5.12 текселей на CM), 256x256 текселей на 1OOcm (2.56 текселей на CM).
1024x1024 текселей на 100cm (10.24 текселей на 1CM)

Как мы видим на приведенном выше примере, на крупных планах, камера может снимать под углом вдоль различных поверхностей, таких как стены. В этом случае проявляется верхний MIP-уровень текстуры 2048x2048, которая наложена на поверхность с плотностью 10.24 текселей на 1CM, и занимает значительную часть экрана. Это то самое место, где вы хотели бы иметь приличную плотность текселей.

512x512 текселей на 100cm 5.12 текселей на 1CM

Здесь тот самый случай когда мы видим разницу в разрешении между плотностью в 10.24 текселей на 1CM и 5,12 текселей на 1CM. При такой плотности текселей верхний MIP-уровень распространяется на гораздо большую площадь поверхности.

256x256 текселей на 100cm 2.56 текселей на 1CM

При такой плотности текселей качество падает, а текстура на поверхности стены, которая находится ближе всего к камере, выглядит размытой и имеет низкое разрешение. Несмотря на то, что такая плотность эффективна с точки зрения рендеринга пикселей, она не отличается высоким качеством. Также стоит отметить, что во всех этих примерах здания на заднем фоне всегда использует более низкие MIP-уровни: 64X64 и 32X32 из-за их удаленности от камеры.

Слева на право: 10.24 текселей на 1CM, 5.12 текселей на 1CM, 2.56 текселей на 1CM

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

После рассмотрения различных случаев, 10.24 текселей на 1CM — это лучший выбор в плане качества для игры в стиле FPS.

5.12 текселей на 1CM — это разумный компромисс между качеством и визуальной точностью. Если бы он поднялся до 20,48 на 1CM, возникла бы проблема с тем, что в большинстве случаев верхний MIP-уровень был бы виден только по краям экрана.

С учетом сказанного, когда дело доходит до рендеринга изображений в 4K и 8K с помощью более мощных графических процессоров, в будущем это вполне может потребоваться.

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

Top Down Camera Example

Теперь перейдем к примеру где используется камера типа «сверху-вниз». Данный изометрический вид означает, что диапазон MIP-уровней от земли до камеры значительно сократится, по сравнению с камерой от первого лица или от третьего лица. Как мы видим, в приведенном ниже примере, для большей части сцены рендерятся средние MIP-уровни. Верхние MIP-уровни (белый/оранжевый) и нижние (фиолетовый/синий) не используются.

Слева на право: 10.24 текселей на 1CM, 5.12 текселей на 1CM, 2.56 текселей на 1CM

Приблизив камеру к поверхности здания, можно увидеть, как рендерятся различные уровни MIP-карт. При использовании TD 10.24 текселей на 1CM, верхний MIP-уровень не виден. Он проявляется только если камера находится прямо напротив поверхности.

На нижеследующем изображении почти все MIP-уровни рендерятся по всей сцене. Количество тайлов на фасаде здания кажется разумным. С другой стороны, поверхность земли повторяется слишком часто. Это расточительно, поскольку рендерятся только MIP-уровни 256X256 и 128X128, а более высокие MIP-уровни не используются.

На нижеследующем изображении демонстрируется та же самая проблема, но с применением текстур песка. Решение данной проблемы находится справа. Это то же самое. Текстура размером 2048x2048, но растянутая на большую площадь поверхности. При подобном наложении текстуры на большую поверхность, крайне важно учитывать масштаб деталей текстуры, так чтобы они выглядели согласованно с остальной частью сцены и не выбивались из общей картины.

Слева: 2048x2048 текселей на 2M. Справа: 2048x2048 текселей на 8M.

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

Слева: 2048x2048 текселей на 2M² — TD = 10.24 на 1CM. Справа: 2048x2048 текселей на 8M² — TD = 2.56 на 1CM.

В данном примере, плотность текселей на зданиях составляет 5.12 текселей на 1CM, а текстура 1024x1024 наложена на поверхность площадью 2m². Плотность текселей для земли составляет 2.56 текселей на 1CM, как в предыдущем примере. Текстура 2048x2048, наложена на поверхность площадью 8m².

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

Third Person Camera Example

Слева: Типичное расстояние от поверхностей до камеры в режиме от третьего лица.
Справа: Здесь камера оказалась очень близко к поверхности стены

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

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

2048 Top Mip, 1024 Mip Level, 512 Mip Level, 256 Mip Level.

Это стандартный вид камеры от третьего лица. Отображаемая плотность текселей составляет 10.24 текселей на 1CM. Вы можете видеть как распределяются уровни MIP-карты по всей сцене.

1024 Mip Level, 512 Mip Level, 256 Mip Level.

Снизим плотность до 5.12 текселей на 1CM, в таком случае верхний MIP-уровень будет охватывать большую часть сцены. По качеству заметного падения нет.

512 Mip Level, 256 Mip Level.

Падение до 2,56 текселей на 1CM. Стена слева имеет заметно более низкое разрешение.

Взяв крайний случай, легче увидеть, как разрешение заметно снижается при наложении меньшего количества текселей на площадь поверхности. В данном примере плотность составляет 10.24 текселей на 1CM.

Рядом с камерой, в левой части изображения видно понижение плотности текселей. В остальном сцена выглядит вполне прилично. В данном примере плотность составляет 5.12 текселей на 1CM.

При такой плотности текселей начинает страдать общее качество изображения. В данном примере плотность составляет 2.56 текселя на 1CM.

Итоги

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

Если вы решите использовать плотность текселей 20.48 текселей на CM или ниже, это нормально, но вам нужно будет сбалансировать этот выбор с визуальным качеством и бюджетом памяти выделенным под текстуры.

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

  • FPS - Example: 10.24 текселей на CM
  • Third Person - Example: 5.12 текселей на CM (С использованием Detail Map, чтобы скомпенсировать приближение к поверхностям).
  • Top Down - Example: Смешанная плотность текселей. (Ассеты близкие к камере — 5.12 текселей на CM, поверхность земли — 2.56 текселей на CM).
Поскольку рендеринг 4K и 8K становится все более распространенным явлением, повышенная плотность текселей.станет стандартным для обеспечения чистого и четкого изображения.

Когда стоит отказаться от использования фиксированной плотности текселей

Удаленные/крупные объекты

Одной из наиболее распространенных причин отказа от использования фиксированной плотности текселей является работа с большими или удаленными поверхностями, такими как ландшафт или купол небосвода. Они покрывают гораздо большую площадь поверхности, и лучше иметь текстуру, распределенную по поверхности больше, чтобы получить повышенную вариативность (меньше повторений), так как маловероятно, что игрок когда-либо подойдет к таким объектам слишком близко. Также это позволяет улучшить соотношение текселей к пикселям (texel to pixel ratio).

Поверхности рядом с камерой

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

Масштабируемые поверхности

Другой причиной могут быть поверхности/объекты, которые можно использовать в разных масштабах, например камни. В игровой сцене их размер может варьироваться в диапазоне 100-200% от исходного размера. С этим может справиться шейдер с картами детализации (detail maps), или ассет может иметь более высокую плотность текселей, чтобы обеспечить определенный диапазон масштабирования.

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

Возвывшенные поверхности

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

Модели персонажей

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

Почему плотность текселей имеет значение?

Внешний вид

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

Оптимизация рендеринга

Как объяснялось ранее, MIP-карты — это оптимизация, которая уменьшает количество текселей, выбираемых (sampled) пикселем на расстоянии, что снижает стоимость рендеринга. Эта проблема также может возникнуть, если художник накладывает более высокую плотность текселей на поверхность, например 500 текселей на 1cm, это заставит GPU сэмплировать гораздо большее количество текселей на пиксель. Стоимость не будет астрономической, но стоимость будет накапливаться, если это станет типичной ситуацией в процессе визуализации вашей сцены

Оптимизация потребления памяти

Ещё одно преимущество соблюдения определенной плотности текселей в проекте заключается в том, что это гарантирует использование текстур подходящего и целесообразного размера (относительно размера меша). Это позволяет художникам уверенно назначать ресурсы там, где это необходимо. Например, если статуе с уникальной разверткой нужен набор текстур 2048, который обеспечивает 10.24 текселей на CM, или если небольшой бочке может потребоваться набор текстур с разрешением всего лишь 512 для поддержания постоянной плотности. Художник сможет самостоятельно принять обоснованное решение, вместо того, чтобы бездумно генерировать набор текстур 2048 для каждого ассета.

Единообразие в пределах команды

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

Несколько слов об авторе

Энтони О'Доннелл (Anthony O'Donnell)
Art Director

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

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

Я успел поработать над 6 выпущенными проектами, включая DLC, а также над проектами, которые не дошли до релиза — игры в разных жанрах, для разных платформ и с разным художественным стилем. Я накопил довольно много знаний касательно производства арта для игр. Мне очень повезло поработать с множеством талантливых художников и разработчиков игр, которые внесли определенный вклад в моё развитие (огромное спасибо каждому из вас).

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

Благодарности

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

Посмотрите на их прекрасные работы!

Вот и всё... спасибо за прочтение!

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

Идите вперед и создавайте игровой арт, который все оценят :)

0
10 комментариев
Написать комментарий...
Daniil Monin

Очень годная статья! Спасибо большое! Соглашусь, что про тексель не так много информации. Сам в свое время, когда разбирался не одну неделю потратил.

Ответить
Развернуть ветку
DarkyAndSparky

Вот это полотно, не нужная мне конечно информация, но для общего кругозора понравилось почитать. Спасибо за такой колоссальный труд:)

Ответить
Развернуть ветку
Территориальный корабль

Лучший! Спасибо... Вера в dtf еще не до конца потеряна из-за таких постов.

Ответить
Развернуть ветку
Присущий калькулятор

Это жир! Спасибо :)

Ответить
Развернуть ветку
A3zazel

БОГИ, какая прелесть!
Спасибо! ♥

Ответить
Развернуть ветку
Al.

Не, ну это высший пилотаж!

Ответить
Развернуть ветку
Григорий Крылов

Крутая статья, все четко, по делу, понятно. Про мип мапы особенно благодырь

Ответить
Развернуть ветку
Insane One

Спасибо за материал! Целиком ещё не читал, но в ру-сегменте информации на эту тему действительно мало, да и та - часто недостаточная для понимания.

Ответить
Развернуть ветку
Alex Miles

читал три дня!
спасибо материал огонь!!!

Ответить
Развернуть ветку
Андрей Немо

Очень подробно. И многое стало понятным.

Ответить
Развернуть ветку
Читать все 10 комментариев
null