Как сделать текстуры более четкими
Оптимизация текстур: оверлапы, реюз, декали
Оверлап (overlap или реюз) — это накладывание одинаковых UV-шеллов на UV-развертке друг на друга с целью экономии текстурного пространства.
Эту технику можно использовать на моделях со множеством повторяющихся плоскостей/элементов, для которых не важна уникальность текстуры.
Мы говорим об уникальности, потому что если два элемента лежат на одном месте в UV-пространстве и используют общую текстуру — на них будет отображаться одинаковый набор пикселей.
Это значит, что если ты нарисуешь какую-то деталь на одном из плейнов — она автоматически появится и на остальных. Поэтому оверлапы нужно использовать аккуратно.
Способы создания оверлапов
Разберем два основных способа: один из них удобен при работе с большими массивами деталей, а второй подойдет для создания точечных оверлапов.
Способ 1
Когда ты закончил оптимизацию Low poly модели и приступаешь к работе с UV — удали все элементы и полигоны, которые планируешь оверлапить, и оставь только по одному референсному элементу.
Например: у тебя есть 10 одинаковых винтов. Тебе нужно удалить 9 из них, развернуть один, который остался, а потом сделать 9 копий развернутого винтика.
Дальше можешь работать с UV как обычно. Единственное, что нужно учесть в таком случае, — когда UV будет готова, тебе предстоит раскопировать обратно все удаленные элементы.
Используя этот подход, ты можешь создавать оверлапы для множества разных элементов, и тебе не придется выискивать нужные шеллы в UV-эдиторе. Удобно, если модель простая и нет проблем с расположением копий всех элементов на последнем этапе.
Также, прямо в процессе моделирования, объекты под реюз можно копировать как инстанс. В таком случае будет достаточно сделать развертку для одного элемента, а остальные подхватят эту информацию.
Способ №2
Накладывание существующих UV шеллов друг на друга вручную. Перед этапом финального упаковывания нужные шеллы складываются друг на друга и объединяются в группы, чтобы при автоматическом упаковывании алгоритмы не разъединяли их.
Способ подходит для точечного создания оверлапов, ведь для каждого элемента нужно сделать как минимум 3-4 действия. Если тебе предстоит разворачивать большое количество геометрии под реюз — лучше используй первый вариант.
Преимущества оверлапов на примере ассета
Возьмем ящик для патронов и сделаем для него две развертки: одна без использования оверлапов, а вторая — с ними. Texel density будем держать в районе 512px/m.
В развертке с реюзом нужный тексель удалось сделать при разрешении текстуры 2048х2048. Для текселя такой же плотности без оверлапов понадобится текстура 4096х4096.
Карта Albedo на примере с реюзом весит на 11.2 Мб меньше. На всем текстурном сете можно будет сэкономить
30 мегабайт. А теперь представь экономию в рамках проекта, когда таких сетов сотни. Десятки гигабайт.
Вывод: реюз помогает эффективнее использовать ресурсы проекта.
Теперь остается добавить уникальности текстурам: надписи, несимметричные детали и другие элементы, которые невозможно нанести оверлапами. Для это есть декали.
Декали
Декалями в геймдеве называют текстуры с нарисованными на них надписями / подтеками / элементами. Фон текстур обрезается с помощью альфа канала, а на объект они наносятся либо в самом движке, либо с помощью геометрических плейнов как часть модели.
Абстрактный пример текстуры для декалей. В реальных проектах текстурное пространство используется более рационально.
Так как декали используют свою отдельную текстуру, они никак не привязаны к объекту и их можно использовать для нанесения надписей поверх реюзнутых плоскостей.
Ошибки при использовании оверлапов
Оверлапы нужно использовать осторожно, ведь если реюзаемые плоскости находятся рядом — может возникнуть «эффект бабочки».
Лучше всего реюзать плоскости, которые находятся на разных сторонах объекта. Если же избежать этого нельзя — создавай максимально усредненную детализацию.
Чуть больше о проблемах с оверлапами можно почитать в нашей статье о проверке дополнительных карт.
На этом все. Пользуйся осознанно и старайся искать баланс между уникальностью и оптимальностью. Иногда все же лучше сделать разрешение текстур чуть выше, но сохранить интересный вид объекта. В любом случае, теперь ты еще ближе к работе с текстурами на уровне «PRO».
24 ноября 2014 | Опубликовано в Уроки | 15 Комментариев »
Текстуры — важный элемент дизайна, который можно использовать как фон для вашего проекта, накладывать при помощи режимов наложения, чтобы добиться нужного эффекта, и использовать другими различными способами, чтобы добиться интересных результатов. Любой обладатель фотокамеры может собирать текстуры. Некоторые камеры смартфонов нового поколения также вполне позволяют это делать. Для этого нужно лишь нажать на кнопку, и после обработать изображение в Photoshop. В этом уроке вы найдете три подсказки, которые помогут сделать из такого снимка отличные текстуры.
Выравниваем тона
Одна из главных проблем использования фото-текстур — вариативность тонов. Часто их оказывается слишком много, что накладывает определенные ограничения на использование текстуры. В нашем случае текстура слева светлее чем справа. При наложении, текстура будет работать каждый раз по-разному, а для 3D-моделирования такие файлы вообще не подходят.
Откройте текстуру в Photoshop дублируйте дважды фон, нажав CMD+J.
Выберите первую копию слоя (слой посредине) и в меню выберите Filter > Blur > Average/Фильтр>Размытие>Усреднение.
Выберите вторую копию слоя (верхний слой) и в меню выберите Filter > Other > High Pass/Фильтр>Другой>Цветовой сдвиг. Сдвиньте бегунок на максимальные 250px.
Смените режим наложения слоя с цветовым сдвигом на Linear Light/Линейный свет, чтобы тона вступили во взаимодействие с размытым слоем.
Результат скорее всего окажется слишком контрастным, поэтому снизьте прозрачность верхнего слоя пока не получите желаемый результат.
Так вы сделаете текстуру визуально плоской, что позволит вам использовать ее более широко. В зависимости от типа текстуры, вам может понадобиться подкорректировать Levels/Уровни или Saturation/Насыщенность.
Корректируем искажение линзы
Даже если вы работаете с хорошей камерой, ваши текстуры могут получиться искаженными линзой, что даст легкий эффект рыбьего глаза. Это искажение всегда заметно при сравнении изображений до и после коррекции.
Выберите опцию Lens Correction/Коррекция линз в меню Filter/Фильтр. Откроется меню коррекции.
Здесь уже есть предустановки для большинства моделей камер. Выберите ту что соответствует (или максимально приближена) к вашей камере. Также вы можете создать свой профиль в программе Adobe Lens Profile Creator. Однако и без этого дополнительные настройки позволят вам настроить коррекцию максимально точно.
Инструмент Lens Correction/Коррекция линз автоматически масштабирует ваше изображение, однако это может сказаться на его качестве. Чтобы получить лучший результат, выберите опцию Transparent edges/Прозрачные края и потом вручную кадрируйте изображение.
В нашем случае разница между изображениями до и после коррекции минимальны, однако они все равно заметны в сравнении. Эта коррекция особенно важна для изображений содержащих горизонтальные или вертикальные линии — в этих случаях эффект рыбьего глаза особенно заметен.
Выравниваем текстуру
Текстуры деревянных досок, кирпичей и других элементов, содержащих линейный узор, всегда нужно выравнивать. Это можно сделать вручную, однако есть более простой и действенный способ.
Выберите инструмент Ruler/Линейка в панели инструментов. Этот инструмент спрятан за Eyedropper/Пипеткой.
При помощи этого инструмента нарисуйте линию, которая повторяет естественную линию в узоре текстуры. Затем в меню выберите Image > Image Rotation > Arbitrary/Изображение>Поворот изображения>Произвольно.
Угол поворота будет магическим образом определен благодаря линии. которую мы только что провели. Нам остается только нажать OK.
При повороте будут созданы прозрачные края, которые вам нужно будет обрезать при помощи кадрирования.
Из-за поворота вам придется немного обрезать изображение, зато оно будет идеально ровным, за что дизайнеры, использующие его, скажут вам «Спасибо!».
Корректировка резкости и размытия изображения
某些 Creative Cloud 应用程序、服务和功能在中国不可用。
В Photoshop предусмотрено много разных инструментов, фильтров и масок, которые позволяют более точно управлять резкостью изображения (или размытием).
Рекомендации по увеличению резкости
Регулировка резкости усиливает четкость краев на изображении. Регулировка резкости позволяет улучшить качество большинства изображений независимо от того, каким образом они получены (сняты цифровой камерой или получены сканированием). Необходимая степень резкости зависит от качества цифровой камеры или сканера. Следует помнить, что регулировкой резкости нельзя исправить сильно размытые изображения.
Советы для получения оптимальной резкости.
Резкость изображения следует регулировать отдельно в каждом слое, чтобы при использовании другого устройства вывода ее можно было настроить заново.
При регулировке резкости в отдельном слое для этого слоя следует установить режим наложения по яркости, чтобы избежать смещения цвета вдоль контуров.
При регулировке резкости усиливается контрастность изображения. Если после регулировки резкости света или тени кажутся усеченными, следует изменить режим наложения слоя (если резкость изменялась в отдельном слое), чтобы резкость не изменялась в области светов и теней. См. раздел Задание тонового диапазона для наложения слоев.
Уменьшите шум изображения, прежде чем увеличивать резкость, чтобы не усиливать шум.
Резкость изображения следует регулировать понемногу в несколько приемов. Первоначальным увеличением резкости исправляется размытие, возникшее при захвате изображения (во время сканирования или при съемке фотоаппаратом). После исправления цвета и размера следует повторно отрегулировать резкость изображения (или его копии), чтобы добавить запас резкости в соответствии с устройством вывода.
При возможности резкость следует оценивать по изображению на конечном устройстве вывода. Необходимая степень резкости зависит от устройства вывода.
Используйте фильтр «Контурная резкость (USM)» или фильтр «Умная резкость», чтобы лучше управлять процессом увеличения резкости изображений. Кроме того, в Photoshop можно использовать фильтры «Резкость», «Резкость на краях», «Увеличение резкости», однако это автоматические фильтры, в которых не предусмотрены элементы управления и параметры.
Регулировать резкость можно как для всего изображения, так и для отдельной его части, заданной выделением или маской. Поскольку фильтры «Контурная резкость» и «Умная резкость» можно применять за один прием только к одному слою, то для регулировки резкости всех слоев изображения в многослойном файле придется объединять слои или сводить файл.
Название фильтра «Контурная резкость» происходит от метода темной комнаты, который использовался для работы с фотопленкой. Данный фильтр скорее увеличивает резкость изображения.
Использование «Умной резкости»
В фильтре «Умная резкость» предусмотрены элементы управления резкостью, недоступные в фильтре «Контурная резкость». В нем можно задать алгоритм регулировки резкости или установить интенсивность резкости в затененных областях и в областях светов.
Как улучшить графику в старых играх: HD-текстуры, разрешение и постобработка
Разрешение экрана
Универсального инструмента для «расширения» изображения нет. Если хорошо поискать, можно найти подходящий фикс для нужной игры.
Улучшенные текстуры
Есть разные типы модов на текстуры, каждый из них отличается своим уровнем проработки. Одни пакеты заменяют их во всей игре, другие лишь на некоторых локациях. В любом случае если поискать, вы найдете ту сборку HD-текстур, которая сделает нужную игру несколько симпатичнее.
Главное, строго следуйте инструкции к моду, так как отклонение от нее может сломать игру, и вам придется заново ее устанавливать.
Постобработка с помощью ReShade
ReShade — это бесплатный набор фильтров для постобработки. Инструмент настолько полезен, что при желании можно применить его и к современным релизам, если вам кажется, что эффекты выглядят не так, как должны были.
Для начала бесплатно скачайте ReShade с официального сайта. Советуем сохранить файл где-нибудь под рукой, так как он применяет эффекты только к одной указанной вами игре. Запустите файл и выберите игру, после чего отметьте нужные настройки рендеринга.
После выполнения вышеописанных действий в игре появится масса новых настроек графики, но не спешите делать вашу игру лучше. Во избежание ухудшения картинки, советуем поискать в сети пресеты, которые другие пользователи уже создали и опробовали.
Некоторые шаблоны есть на сайте ReShade, но лучше прогуляться по форумам и специализированным ресурсам. Когда найдете нужный шаблон, сохраните его на своем PC и снова запустите ReShade. После выбора игры и установки нужных настроек нажмите на Edit ReShade Settings, в первом поле открывшегося окошка укажите путь к сохраненному ранее файлу с пресетами.
Помните, что некоторым пресетам ReShade может потребоваться версия утилиты постарше. Все версии программы лежат в репозитории ReShade Mediafire. Учитывая эти факторы, еще раз настоятельно советуем не игнорировать файл readme, который неспроста так называется и порой действительно может вам помочь.
Запустив игру после работы с ReShade, она предложит вам нажать клавишу Home для доступа ко всем добавленным параметрам. Не бойтесь, если у вас начнет рябить в глазах от огромного количества настроек. Благодаря пресетам мы избавились от часов проб и ошибок. У нас уже все установлено. Разумеется, никто вам не запрещает всячески экспериментировать с настройками, но старайтесь делать это как можно аккуратнее.
Фильтры SweetFX
Для того, чтобы установить SweetFX вам необходимо сделать несколько несложных шагов:
Скачать уже готовый пресет просто, но иногда хочется полностью настроить все под себя, а делать это в текстовом файле не самый удобный процесс. Небезразличные моддеры сделали специальную утилиту SweetFX Configurator, которая позволяет из удобного меню включить или выключить необходимые эффекты.
В SweetFX Configurator достаточно просто нажать «Add New Game» и выбрать нужную игру. После этого утилита сама создаст и скопирует в папку все нужные файлы. Теперь вы можете через окно конфигуратора настроить все, как душе угодно. Однако и у такого удобного решения есть свои недостатки.
Сетевые игры могут распознать SweetFX Configurator как чит. Поэтому стоит быть крайне осторожным с настройками в онлайн-проектах.
Реалистичное освещение с помощью ENBSeries
Все, ENBSeries установлена. Осталось лишь ее настроить. Раньше делать это в ENB приходилось с помощью редактирования файла ini., но теперь появилась возможность менять настройки непосредственно в игре. Просто нажмите сочетание клавиш Shift+Enter и поставьте галочки у тех параметров, которые вы бы хотели активировать.
Если вы боитесь своими руками настраивать ENB из-за страха что-то поломать, можете поискать в сети уже готовые пресеты. Готовых сборок много, но внимательно читайте инструкции по их установке, так как они могут отличаться.
Совместная работа ENBSeries и SweetFX
Все, теперь SweetFX и ENBSeries работают вместе.
Улучшение графики с помощью «Панели управления Nvidia»
Если вы обладатель видеокарты от Nvidia, можно обратиться к настройкам в программе «Панель управления Nvidia»:
По большей части тут различные варианты сглаживания и фильтрации текстур, но они действительно способны изменить внешний вид игры, пусть и не сильно.
Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 4. Модели, нормали и развертка
Продолжаем серию уроков о том, как стать художником по поверхностям.
Серия уроков была написана год назад в пяти частях и выложена на «Хабр». Тогда я не дописал последнюю часть, оставив пятую часть без практики и подробных данных о том, как можно минимизировать потребление текстур и вывести текстуры на более высокий уровень.
Начиная выкладывать статьи на DTF, я постараюсь этот пробел закрыть, а так же ещё раз пробегусь по тексту и предоставлю вам более актуальную версию с отредактированным текстом (2-е издание, так сказать).
Итак, котятки, погнали! =)
По моему скромному мнению, художник по текстурам должен отвечать за развертку. Не за саму развертку (ее стоит делать 3D-художникам или вообще отдельным UV-специалистам), а за ее укладку. Он должен определять, как острова должны располагаться, как должны быть повернуты и насколько сильно их можно потянуть в той или иной ситуации в зависимости от требований. И именно он должен определять скейл (масштаб) островов.
В этой части мы рассмотрим модели, развертку и нормали. Создадим текстуры для первой полноценной модели (хоть и простой) и настроим ее в Unreal Engine 4.
Предполагается, что к этому моменту вы разобрались с картой нормалей, и зачем она нужна. Потому что в этой статье мой раб будет очень часто о ней говорить. Если вы все еще плаваете в понимании, как считывается карта нормалей, какие каналы за что отвечают, то я бы настоял на том, чтобы вы сначала заскребли этот пробел и только потом продолжили читать статью. Так же предполагается, что вы уже знаете, что такое «развертка объекта» и «острова развертки«. Но в любом случае, мяу-мяу.
Я не буду рассказывать, как создавать модели или как зачищать / выстраивать сетку. Эту информацию можно получить со множества курсов, которые есть как в свободном доступе, так и в платном. Наша задача сейчас разобрать конкретные ограничения в строениях моделей для игр и какие варианты решений существуют на данный момент.
Но для начала мы затекстурим модель, а за одно посмотрим на ней первое ограничение. Работать мы будем над этой лавкой:
Для этого нам необходимо будет скачать сам меш и заранее подготовленную карту нормалей к нему (ниже я объясню наглядно, зачем мы ее подготовили).
Так же я бы хотел сделать ее основу деревянной, а ножки — металлическими. Ну и немого накидать грязи. Соответственно, нам понадобятся 2 материала:
Ссылка но все это добро здесь.
Грязь мы не будем выносить в отдельный материал, а воспользуемся генератором в Substance Painter и создадим грязь внутри программы.
Итак. Все скачали, и теперь можно начинать практику. И первым делом мы создадим стандартный проект, укажем лавочку, текстуры и запустим его:
Обратите внимание, что в этот раз нам необходимо будет указать Normal Map Format — OpenGL. Мой раб уже писал в прошлой части, что карты нормалей считываются по разному разными программами. И данная карта была сгенерирована под программы, которые используют OpenGL.
Для начала рассмотрим максимально близко лавочку. Особенно нас интересуют грани объекта:
Я выделил для примера одну грань лавочки. Сейчас она максимально идеальная. То есть, две стороны сошлись в одном ребре и создали идеальный угол. Сколько бы мы не приближали этот стык, он всегда будет идеально ровным. В реальности же идеальных углов не существует, и даже лезвие бритвы при должном увеличении будет скруглено. Именно поэтому ребра выглядят сейчас не кинематографично. Такие модели смотрятся очень слабо, и когда мы видим их в игре, то сразу ощущаем всю слабость визуальной картинки, даже если не замечаем эти углы у моделей напрямую.
Это первое ограничение модели.
Раньше, когда ресурсы видеокарт не позволяли обрабатывать миллионы вертексов в одном кадре, решение было найдено в текстурах карт нормалей. В них указывали, как свет должен начать отражаться так, чтобы появилось ощущение, будто у этих границ есть скругление. Конкретно к этой лавочке такая карта нормалей выглядит вот так:
Теперь давайте укажем эту карту нормалей, как основную (то есть, она всегда будет подкладываться к результату, как самый нижний слой без маски). Для этого нам необходимо открыть настройки основных текстур объекта и указать в параметрах карт нормалей нашу текстуру:
И смотрим на результат:
Это первый самый известный и часто используемый метод борьбы с резкими гранями — запекать в карту нормалей фаски. То есть, модель все так же жесткая, но карта нормалей у ее граней начинает искажать свет, что создает иллюзию красивой мягкой фаски. В интернете можно найти кучу информации о том, как это делать. Для простых объектов, как эта скамейка, можно не делать хай-поли модели (и не запекать с нее соответственно), а сгенерировать карту нормалей с фасками в программах. Например, это умеет делать программа Modo. Наша скамейка имеет карту нормали, сгенерированную в Modo.
Но опустим тему запекания фасок и продолжим текстурирование скамейки.
Если у вас фаски не стали такими же гладкими, как у меня, а появилась иллюзия впадин — значит, при создании проекта в Substance Painter вы забыли поменять формат отображения нормали с DirectX на OpenGL.
Далее начинаем фасовать наши будущие материалы по папкам:
Сейчас иерархия слоев нам не важна, так как данные материалы (металл и дерево) между собой пересекаться не будут — у нас не будет ситуации, когда сквозь дерево начнет проступать металл и наоборот. Но маски нам все еще нужны будут, так теперь нам необходимо ограничить видимость слоев на разных островах, поэтому сейчас добавьте черные маски на обе папки:
Кликнем на модели по основной скамье (если вы выделили маску дерева) и получим следующий результат:
Как видно на скриншоте — маска обновилась, и теперь на ней огромная белая полоса, которая расположена на месте острова. Покрасим таким образом всю скамью вокруг:
Сделаем то же самое с маской для металла, отметив видимой зоны с островами ножек. Выделите маску металла и укажите нужные части объекта:
Так же нужно залезть в трудно доступные места на стыках и отметить там нужные нам острова как для дерева, так и для металла:
Если вы внимательно осмотрите ножки, то заметите второе ограничение модели.
Развертка выполнена не корректно, и рисунок металла между сторонами ножек не согласуется — его фактура направлена в разные стороны, что визуально сильно бросается в глаза (направление отмечено стрелочками):
Это именно ограничение, преодолевать которое можно путем выравнивания островов и их растягивания. Сейчас остров, на котором нарисована стрелочка вниз, выглядит так (выделен оранжевым):
Для того, чтобы исправить проблему, необходимо, чтобы остров был выпрямлен в одну идеальную линию:
Если мы все сделали правильно, то мы решили это ограничение, но у нас возникло другое — потяжки:
Потяжки не страшны, если они не сильно заметны, или фактура на них не выдает их. Но с ними нужно быть осторожными, и иногда приходится мириться с тем, что могут возникать несостыковки материалов. Лишь бы это было незаметно =)
В целом, проблема швов на островах в объектах остается до сих пор не решенной до конца. В дальнейшем мы рассмотрим другие варианты того, как избавляться от швов и даже попробуем действительно крутые методы.
Как мы знаем, на всех гранях всех вещей рано или поздно начинает откалываться краска, или кусочки материала. Там появляется большое количество царапин и сколов:
Поэтому давайте создадим маску, которая позволит нам в дальнейшем под ней отображать такие же потертости, царапины и сколы.
Для этого необходимо открыть настройки основной текстуры (где мы указывали карту нормалей), там выбрать Bake Mesh Maps.
В появившемся окне убрать все лишние галочки, оставив только Curvature и запечь ее, нажав на Bake [доп.название] Mesh Maps:
Когда создание текстуры закончится — она станет доступна в shelf под тегом Project:
А так же эта текстура автоматически подключится в качестве основного параметра Curvature в настройках текстуры. Уберем ее оттуда:
Если создать новый слой вверху иерархии и установить в качестве параметра Base Color полученную текстуру, то мы увидим следующий результат:
Теперь удалим этот слой, так как он нам нужен был исключительно для понимания.
Далее создадим папку, назовем ее Folder Dirt и поместим ее в папку с деревом НАД слоем с деревом. В этой папке создадим слой под названием LowLayer_Dirt, а на самой папке создадим черную маску, чтобы слой не накладывался на результат:
Укажем, что маска для грязи должна состоять из эффектов Fill, чтобы добавить текстуру, которую мы создали (curvature), и дополнительным эффектом «Levels».
Для чего нам нужен эффект «Levels» сейчас? Вы, наверное, обратили внимание, что маска для граней слишком светлая? Сейчас нам нужно будет обрезать цвета таким образом, чтобы оставить светло-белым места на гранях, а все остальное сделать абсолютно черным.
Конечный результат у вас должен получиться таким:
Таким образом мы создали «границу дозволенного» для грязи (Зону). Теперь надо ограничить саму грязь. Для этого нужно наложить черную маску на сам слой LowLayer_Dirt. После этого добавить эффект Fill, и в нем указать маску Dirt4, которая спрятана под тегом Procedurals:
Выше на скриншоте обведены так же дополнительные параметры маски Dirt 4. Дело в том, что это не текстура в том формате, в котором мы привыкли представлять ее. Это генератор случайных чисел по определенным правилам.
Иначе говоря, процедурная текстура, пиксели в которой имеют сгенерированную интенсивность. Вы можете поиграться параметрами, например, покрутить Balance и Contrast, чтобы добиться желаемого результата.
Повторюсь. Сейчас наша цель не в качественной идеальной покраске лавочки, а работа с основами и тренировка работы с масками и материалами.
В целом, сейчас мы рассмотрели, как накладывать быстро маски для конкретных материалов, которые между собой не пересекаются.
Как можно догадаться, чтобы нанести лак на дерево — нам нужно создать слой в папке с деревом. Но сейчас мы этого делать не будем, а сама задача остается для домашней работы:
Чтобы в дальнейшем у вас было простое представление, как это все работает, запомните правило: один материал — одна папка для работы с ним. Так вы сможете лучше контролировать ваши маски и слои. Например, поместив слой грязи в папку с материалом вы все еще контролируете на уровне маски папки общую зону видимости этого материала, а теперь еще и грязи на нем (или слоя под ним). Например, в реальности под фактурой (материалом) может лежать другая фактура — под металлическим напылением может прятаться пластик. В данном случае, металл — это основной слой, а пластик — дополнительный слой под металлом (хотя в туторе выше мы слой со сколами и поместили выше дерева, по факту — это более низкий слой в иерархии. Иначе говоря, это ошибка).
Слои материалов, их иерархию нужно просчитывать до того, как вы начнете создавать текстуры. Это важно, поэтому что некорректные расположения слоев в конечном итоге могут привести к тому, что вам придется все начинать сначала и потратить долгие часы на разбирательство того, почему ваша текстура отображает только какой-то один слой. Именно поэтому я предлагал потренироваться сразу с 20 масками, чтобы у вас появилось понимание, насколько сложно контролировать большие текстурные проекты.
На этом мы закрываем большую тему того, как можно текстурировать объекты для игр в рамках PBR. Всё остальное — техники. Моя задача рассказать суть, основу всего этого, чтобы у вас не было в дальнейшем вопросов по типу «А чем отличается карта Roughness от Metallic и Normal map?» (сразу отвечу — ничем), а появились вопросы — «А как это можно усовершенствовать? Как сделать лучше и эффективнее?»
Мы разобрали несколько ограничений, у которых существуют решения.
И то и другое ограничения так или иначе можно обойти. В первом случае мы создаем карту нормалей, которая имитирует изгиб, во втором случае мы тянем острова и жертвуем деталями (создаем потяжки) ради общей картины.
Во втором случае так же нужно помнить о направлениях островов — их нужно разворачивать согласовано, как и направление узора в материалах. Иначе возникнут сложности, описанные выше.
Отложим на время в сторону Substance Painter. Не закрывайте проект, он нам пригодится позже, когда мы будем экспортировать текстуры в Unreal Engine 4.
В этом куске статьи мы рассмотрим развертку объектов, плотность островов и наконец-то изучим такое явление, как плотность текселя.
И начнем с текселя.
Тексель — это текстурный пиксель (ба-дум-с).
Чтобы не путать пиксель монитора (физический элемент реального мира, который всегда фиксированного размера) с пикселем текстуры (визуализированный квадратик, который может менять свои размеры на экране монитора и вообще искажаться в целом), текстурный пиксель стали называть текселем (Текстура и пиксель).
Однако, мы еще раз рассмотрим это явление, потому что в дальнейшем, если мы не осознаем всю идею текселей, то нам будет сложно работать дальше. И уж тем более будет сложно стать художником по поверхностям.
С этого момента, мы начинаем говорить правильно — пиксель и тексель. Пиксель — мониторный элемент. Тексель — текстурный элемент.
Так вот, повторим пройденное, тексель — это мнимая единица отображения информации. Она существует только в цифрах (массив цифр из каналов), но, чтобы нам было проще работать с параметрами рендера, были введены текстуры, как визуальный заменитель массивов цифр.
Думаю, никому не было бы приятно разрисовывать космический корабль одними только цифрами, держа в голове представление, что тексель в 8 ряду и в 453 столбце должен быть на 1 значение меньше, чем тексель в 284 ряду и в 112 столбце. Поэтому для более быстрой работы такие цифры визуализировали в текстурных каналах. Вам же проще тыкать кисточкой в Photoshop’е, правда?
Мяу-Мяу.
Рендеры (системы визуализации) считывают цифры текселей в текстурных каналах, обрабатывают их и отображают их в качестве квадратиков (текселей).
Опять же. Отображение текселя в виде квадратика — дело условное. И зависит оно в частности от плотности и натяжения островов развертки модели.
О плотности островов развертки мы поговорим чуть позже, а сейчас разберемся с натяжением островов.
Представим себе кусок ткани (если представить сложно — возьмите любой кусок ткани, которую можно растянуть). В спокойном состоянии рисунок (или паттерн материала) на ней остается неизменным, как и задумывал производитель. Но если мы начнем растягивать ткань, то и рисунок начнет так же растягиваться. Тот же самый эффект происходит тогда, когда мы растягиваем (или сжимаем) остров развертки модели:
Развертка левой и правой стороны расположилась вот так:
Часто в 3D-редакторах объектов есть возможность проследить, насколько сильно сжат или растянут остров развертки. Например, в Autodesk Maya это выглядит вот так:
Острова должны быть так же отмасштабированы между собой. То есть, площадь, которую занимает остров на модели, должна соответствовать площади другого острова и всех островов между собой. В противном случае, получится так, что один остров реальной площадью 20 кв.см будет занимать 20% площади текстурного пространства, а остров с реальной площадью в 100 кв.см будет занимать 5% площади текстурного пространства. И отсюда получится разногласие в отображении количества текселей на острове:
Остров правой стороны куба очень маленький и способен отобразить лишь 25 текселей, на которых он и располагается. В связи с этим, рендер увеличивает тексели согласно площади острова, и мы видим большие квадраты.
Слева остров очень большой — он покрывает большой кусок текстурного пространства и способен вместить в себя больше текселей, что и получилось на экране. Верхняя сторона имеет усредненный размер.
То есть, чтобы модель правильно текстурировать — нужно выравнивать площадь всех островов, чтобы они были равны по отношению друг к другу, иначе получится, что какая-то часть модели супер-детализирована,а какой-то части тупо не будет хватать текселей, чтобы отобразить красоту.
На самом деле, надо обратить внимание теперь на тексели кубика относительно пикселей монитора. Заметим, что тексели на нем (черные и белые квадратики, в данном примере) очень большие (опять же — условно. Представим, что в текущей текстуре квадратики — это тексели). Даже если мы выровняем все острова, мы все еще видим черные и белые квадратики на сторонах куба:
Это говорит нам о том, что текущий размер текстуры очень низкого качества (разрешения), поэтому мы видим тексели. Но так ли это?
Представим, что текущая текстура (ее обычно называют «чекер» (Checker) — текстура для проверки корректной настройки островов) имеет размерность 63 на 63 текселей. И сейчас мы видим этим тексели, потому что объект расположен к нашей камере настолько близко, что размер одного текселя занимает площадь 30х30 пикселей монитора (условно).
А если мы отдалим куб от камеры подальше?
Попробуйте теперь разглядеть тексели на этом кубе?
Теперь 1 тексель равен по размерам 1 пикселю (но это не точно). И размер такой текстуры является идеальным, так как позволяет отобразить все свои тексели, а так же не отображает ничего лишнего и не прячет ничего лишнего. Это идеальный размер для такого расстояния.
То есть, размер текстур зависит очень сильно от площади, которую занимает развертка модели и от расстояния объекта до камеры. Если объект будет находиться на достаточно большом расстоянии от нас — нет смысла ему выдавать текстуры 8к на ноготок. Даже если вы делаете текстуры для фильма — никто просто не увидит белую полоску на ноготке девушки, рука которой занимает 0.5% от площади экрана.
На эту тему есть еще достаточно полная статья здесь. И перевод здесь.
Важно понимать масштабы моделей и то, где они будут располагаться относительно камеры, чтобы корректно выстраивать размеры текстур. Очень часто я видел игры от инди-разработчиков, которые пренебрегали этими простыми правилами, и в итоге их текстуры были не самого лучшего качества.
Не забывайте выравнивать острова относительно друг друга — это важно и очень сильно влияет на восприятие. Если вы откроете, например, игру Fallout 4 и начнете диалог с каким-нибудь NPС, то заметите, что качество текстур на одежде персонажа очень низкое, а лицо имеет максимального размера текстуры:
Стоит помнить, что в играх часто специально занижают размер текстур в угоду производительности. Да и кто смотрит на одежду, когда у персонажа такое интересное лицо со шрамами?
Большие размеры текстур занимают большое пространство (в памяти, я имею в виду). Поэтому многие разработчики принимают тяжелое решение — что урезать, а что оставить, лишь бы игра не тормозила на вашем ПК / консоли / телефоне. Однако, к этому вопросу мы еще вернемся и рассмотрим новейшие методики, которые позволяют избегать таких неприятностей.
Что такое — запекание текстур?
Запекание текстур — это когда ПО для создания текстур начинает высчитывать конечный результат и сохранять его в отдельные файлы, с помощью которых потом окрашивается модель в игровом движке.
Грубо говоря, в Substance Painter мы накладываем слои за слоями через маски и прочие хитрости, чтобы добиться конечного результата. Мы работаем над тем, как должна выглядеть конечная модель, смешивая различные варианты материалов. Но, если вы заметите — чем сложнее будет ваша комбинация слоев, масок и материалов, тем сложнее будет обрабатывать ваши изменения программа. Дело в том, что Substance Painter (Любая другая программа для текстурирования) сверяет каждое ваше изменение и просчитывает в реальном времени ВСЕ созданные вами слои и каналы (а я напоминаю, что вы можете еще и свои каналы добавлять в слои для всего-чего-угодно), которые приходятся на тексель.
А когда мы довольны результатом и готовы выгрузить его в игровой движок, то мы просим Substance Painter сделать последние расчеты и создать нам текстуры с параметрами для цвета каждого пикселя, и 3 дополнительные текстуры с параметрами Metallic, Roughness и Normal Map. Это позволит нам не выгружать в игру тонны масок и дополнительных материалов, не заставлять движок рассчитывать все заново, а просто предоставить ему готовый результат, который он преобразует в текстуры для модели за мгновение.