Работа над ошибками в 3D. Эпилог. Запечка лавочек. ч.2
Не буду долго тянуть с продолжением, дабы не упустить вдохновение и снова не отложить написание поста в долгий ящик.
В предыдущем посте я постарался рассказать, в каких случаях можно отказаться от использования карты нормалей. Однако же, стоит признать, что в случае с "большой" современной геймдев иднустрией, 99% ассетов так или иначе требуют наличия вышеуказанной текстуры. А значит, единственное, что нам остается - это разобраться, как получить качественную нормалку.
Под словом "качественная" я понимаю не только отсутствие артефактов при шейдинге (ибо это само собой разумеется), но и, во-первых, возможность работать с текстурой в дальнейшем, и, во-вторых, возможность при необходимости использовать её для других ассетов.
Основа хорошей нормалки лежит в правильной подготовке low poly. Вообще, существует золотое правило: low poly и без нормалки должна шейдиться корректно. Зависит это от двух основных моментов:
1. Триангуляция
2. Вертексные нормали
Начнем по порядку и поговорим о триангуляции. Важно помнить, что ни один софт по работе с 3D не воспринимает ни один вид полигонов кроме треугольников. Во вьюпорте вы можете видеть и четырехугольники, и пяти, и шести и сколькоугодноугольники. Софт же воспринимает всю модель исключительно как набор трисов. Соответственно, шейдинг модели также будет учитывать наличие треугольников. Для того, чтобы лучше понять тему, возьмем следующий объект:
Это просто углубление в плоскости, на которое накинута одна smooth group. Как мы можем видеть, во вьюпорте эта модель состоит из четырехугольников, однако, шейдится она как состоящая из треугольников. Для наглядности давайте отключим сетку:
Любой четырехугольник имеет два варианта триангуляции, зависящих от того, какие углы соединить. В случае с моделью, разбитой на четырехугольники, мы просто оставляем выбор варианта за софтом. С одной стороны, в этом нет ничего плохого. Карта нормалей спокойно компенсирует артефакт триангуляции. С другой...
Чтобы обнаружить скрытую угрозу, предлагаю вручную триангулировать наш объект в обоих вариантах:
Теперь давайте запечем нормалку. Берем high poly:
Запекать мы будем на low poly с триангуляцией варианта 1. Включаем текстуры, смотрим на low poly с вариантом 1:
Идеально. Как и предполагалось, карта нормалей отлично компенсировала искажения, все поверхности ровные, все хорошо. Но теперь давайте используем ту же карту нормалей в low poly со вторым вариантом триангуляции:
Для тех, кто по прежнему не до конца понял суть проблемы, давайте расскажу. Когда вы работаете с моделью, состоящей из четырехугольников, вы оставляете за софтом право самостоятельно распоряжаться триангуляцией. И софт это делает. Например, вы подготовили low poly, high poly и решили все это запечь. В этот момент софт фиксирует свой вариант триангуляции и компенсирует те нормали, которые он сам и решил. Потом наступает момент, когда вы выгружаете модель в движок. А вот мнение движка по поводу того, как будет выглядеть триангуляция, может разительно отличаться от мнения 3D софта. И, в этом случае, в движке мы получим то, что видим на последнем скриншоте. Артефакты. Тут может помочь только ручная ретриангуляция объекта, что в случае с ассетами на десятки тысяч полигонов может свести вас с ума.
При этом, избежать этого довольно просто. Перед экспортом модель должна быть принудительно триангулирована. И для запекания, и для движка должна использоваться та же самая модель с одинаковой триангуляцией.
Некоторые товарищи, кстати, любят накинуть компенсирующие лупы на low poly перед запеканием, а после со спокойным сердцем их удалить. Так вот. Делать этого не нужно. Любая коррекция сетки после запекания приведет к неверной компенсаци нормалкой. В итоге, объект будет выглядеть не так, как вы запланировали изначально.
Теперь давайте перейдем к вертексным нормалям. Это еще один из столпов правильного шейдинга.
Для разбора возьмем следующий объект:
На нем, по-прежнему, используется одна smooth group. Давайте отключим сетку и посмотрим, как шейдится наш объект.
Нам прекрасно видны изломы по триангуляции, но, как мы помним, карта нормалей отлично справится с компенсацией этих изломов. Собственно, что мы и наблюдаем:
Давайте взглянем на получившуюся карту нормалей:
Мы видим, как нормалка компенсирует переходы и по итогу дает нам ровную поверхность. Для большинства случаев данный вариант вполне себе подойдет, тем более, что изначально мы не оставили софту возможности триангулировать поверхность как-то иначе. Однако, проблема проявится, если нам необходимо будет использовать часть текстуры с данного объекта на другом, отличающимся по форме. Что же делать?
Ответ кроется в настройке вертексных нормалей. Давайте включим их отображение на нашем объекте:
Отлично видно, что нормали направлены в разные стороны. При этом, наш объект имеет относительно ровные формы. Порой, у более сложных объектов нормали вообще могут устраивать дикую пьяную потасовку. Чтобы это исправить, нам следует на плоских поверхностях направить вертексные нормали в одном направлении. Вот так:
Шейдинг low poly при такой настройке будет выглядеть следующим образом:
А нормалка станет выглядеть вот так:
Как мы видим, не считая фасок на гранях, мы имеем почти ровную нормалку. Если настроить вертексные нормали еще и у high poly, то мы и вовсе получим чистую карту нормалей. А это значит, что мы спокойно сможем использовать ее на других ассетах. Плюс на ровных поверхностях это решает проблему с триангуляцией.
Эпилог
Ну, вот, пожалуй и все. Вроде, я рассказал все, что планировал. За время написания этих постов на меня подписалось 270 человек. Довольно неплохое число, учитывая "непрофильность" ресурса. Как бы то ни было, мне очень приятно, что тема интересна большому количеству людей. Это значит, что желание развивать свои навыки у кого-то да есть. Простите, что иногда посты не были структурированы, что приходилось подолгу их ждать, что чукча, в конце концов, не писатель) Надеюсь, что из этих 270 человек, хотя бы двое будут использовать мои советы в своих работах, а главное продолжат искать новые знания везде, где только можно и станет рано или поздно крутым 3Dшником.
Серия "Работа над ошибками в 3D" завершена, но я с удовольствием отвечу на интересующие вас вопросы, которые вы зададите в комментах, ибо я по прежнему остаюсь пикабушником)
Огромное вам всем спасибо за внимание! Любите то что вы делаете и стремитесь делать это хорошо!
С уважением, Fajargo. Специально для Pikabu