Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2.

И вновь доброго вам всем любого времени суток на ваш выбор!


Часть 1

Часть 2

Часть 3

Часть 4

Часть 5.1

Интермеццо


Сегодня, как я и обещал (и даже планирую сдержать свое обещание), мы займемся разбором Smooth groups. Для начала я очень быстренько исправлю свою ошибку по теории из предыдущей части, а потом сразу же погрузимся в мир практики. Никаких внезапных душеизлияний, никакого занудства. Только примеры, только картинки, только хардкор! Полетели!


*ага... полетели... опять теория*


В случае, когда у нас используется одна группа сглаживания, наш софт пытается отобразить его так, будто объект сглажен (здорово, правда?)


Так вот тангент - это плоскость, касающаяся кривой в одной точке. Касается эта плоскость именно кривой, которая определяется сглаженным объектом. Смотрим:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

На скриншоте отчетливо видно, что тангент на несглаженной модели соответсвует тангенту на слаженной. Однако, его местоположение по оси Y отличается. И именно относительно этого тангента сглаженной модели будет запекаться карта нормалей. Более отчетливо это станет видно в разборе примеров. И ими-то мы сейчас и займемся.


Первым делом мы возьмем один и тот же объект в четырех вариациях.


Вот этот объект:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

Мы поставим эксперимент со следующими его вариантами:


Вариант первый: объект разбит на 2 группы сглаживания (все ребра жесткие - hard), при этом UV также разделена по жестким граням:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

Вариант второй: объект по прежнему имеет жесткие грани, но на сей раз UV сшита в один шелл:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

Третий вариант имеет одну группу сглаживания (все ребра мягкие - soft). UV разделена:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

И, наконец, четвертый вариант. Это объект с одной группой сглаживания (все ребра мягкие) и единым шеллом UV:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

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

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

В итоге мы имеем следующие результаты:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост
Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост
Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост
Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

Как мы видим, неудачный результат нас ожидает только во втором варианте. Он, напомню, имеет жесткие грани и один шелл UV. Причину, по которой мы получили такой результат, мы сможем понять, посмотрев на нормалку, которую мы получили при запекании:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

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


Остальные три варианта запеклись с одинаково качественным результатом. Но прежде чем приступить к дальнейшему разбору, я предлагаю сразу исключить из гонки третий вариант. Тот, который имеет одну группу сглаживания, но UV разделена на три шелла. Поясню, почему мы это делаем. Мы имеем два объекта с одинаковым сглаживанием и одинаковым результатом бейка, но у третьего варианта 3 шелла, а у четвертого - один. В нашей конкретной ситуации мы получили на 4 координаты UV больше. Следовательно, модель при прочих равных будет тянуть за собой больше информации. А значит, будет больше весить, дольше просчитываться и вообще снижать оптимизацию нашей игры. А это прямая дорога в утиль.


До финала добрались два претендента. И чтобы определить победителя, нам нужно посмотреть на те нормали, которые мы имеем.


Итак, претендент номер раз. Грани жесткие, UV разбита:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

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


Но что же покажет нам второй претендент? Встречайте, грани мягкие, UV шелл один:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

Тут мы видим менее приятную картину. Почему так получилось? Вспомним следующую картинку:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

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


Ну заполонил, ну и фиг с ним, скажете вы. Не на нормаль же мы будем смотреть в игре, а на модель. И в целом будете правы. Итоговое качество отличное, UV шелл один вместо трех. Заморочек при разбитии на smooth groups никаких. Кинул одну на всю модель и счастлив. Сплошные плюсы... казалось бы, но есть один неприятный минус.


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

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

В случае с чистой нормалкой "жесткого" объекта мы это делаем без особых проблем:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

Но вот в случае со сглаженным объектом нас ждет неприятный сюрприз:

Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2. 3D, Gamedev, Длиннопост

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


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


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


Объект без карты нормалей должен в целом выглядеть так же как и с картой нормалей, просто в чуть более простом виде. Там, где на модели подразумевается гладкая, ровная поверхность, или поверхность с мягким (!) изгибом, там должен быть soft edge. Если на модели должен быть четкий, очевидный жесткий (!) угол, то там должен быть hard edge.


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


И еще одно правило, вытекающее из предыдущего: где hard edge, там разрез на UV (в обратном порядке необязательно)


Итак, еще раз в упрощенном виде:


Там, где угол меньше 120 градусов, там hard edge. Там, где hard edge, там разрез UV.


Только так. Никак иначе... пока что :)


А уже в следующем посте мы начнем разбирать правила и интересные фишечки при работе с UV.


Всем спасибо за внимание! До встречи)

Лига Разработчиков Видеоигр

6.7K постов22.2K подписчика

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

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


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"