Работа над ошибками в 3D. Часть 5. Сгладь меня полностью. Часть 2.
И вновь доброго вам всем любого времени суток на ваш выбор!
Сегодня, как я и обещал (и даже планирую сдержать свое обещание), мы займемся разбором Smooth groups. Для начала я очень быстренько исправлю свою ошибку по теории из предыдущей части, а потом сразу же погрузимся в мир практики. Никаких внезапных душеизлияний, никакого занудства. Только примеры, только картинки, только хардкор! Полетели!
*ага... полетели... опять теория*
В случае, когда у нас используется одна группа сглаживания, наш софт пытается отобразить его так, будто объект сглажен (здорово, правда?)
Так вот тангент - это плоскость, касающаяся кривой в одной точке. Касается эта плоскость именно кривой, которая определяется сглаженным объектом. Смотрим:
На скриншоте отчетливо видно, что тангент на несглаженной модели соответсвует тангенту на слаженной. Однако, его местоположение по оси Y отличается. И именно относительно этого тангента сглаженной модели будет запекаться карта нормалей. Более отчетливо это станет видно в разборе примеров. И ими-то мы сейчас и займемся.
Первым делом мы возьмем один и тот же объект в четырех вариациях.
Вот этот объект:
Мы поставим эксперимент со следующими его вариантами:
Вариант первый: объект разбит на 2 группы сглаживания (все ребра жесткие - hard), при этом UV также разделена по жестким граням:
Вариант второй: объект по прежнему имеет жесткие грани, но на сей раз UV сшита в один шелл:
Третий вариант имеет одну группу сглаживания (все ребра мягкие - soft). UV разделена:
И, наконец, четвертый вариант. Это объект с одной группой сглаживания (все ребра мягкие) и единым шеллом UV:
Теперь давайте попробуем запечь на каждый из этих объектов карту нормали, используя следующий объект (по сути, тот же, просто с фасками, отбитыми геометрией):
В итоге мы имеем следующие результаты:
Как мы видим, неудачный результат нас ожидает только во втором варианте. Он, напомню, имеет жесткие грани и один шелл UV. Причину, по которой мы получили такой результат, мы сможем понять, посмотрев на нормалку, которую мы получили при запекании:
Отчетливо видно, что на границах плоскостей мы имеем жесткий переход от одного цвета к другому. Вспоминаем, что в случае с жесткими гранями каждая плоскость имеет свои тангенты, причем, в нашем случае они перпендикулярны друг другу. А так как карта нормалей имеет ограниченное разрешение, то компенсироваться переходу попросту негде. В итоге компенсация одной плоскости переходит на другую - и вуаля. Чем меньше будет разница между тангентами, тем менее заметным станет данный косяк и в итоге сойдет на нет, но с прямыми и уж тем более острыми углами всегда будет так. Подробнее расскажу об этом в выводах. Как бы то ни было, этот вариант запекся плохо, а значит, отметаем его как брак.
Остальные три варианта запеклись с одинаково качественным результатом. Но прежде чем приступить к дальнейшему разбору, я предлагаю сразу исключить из гонки третий вариант. Тот, который имеет одну группу сглаживания, но UV разделена на три шелла. Поясню, почему мы это делаем. Мы имеем два объекта с одинаковым сглаживанием и одинаковым результатом бейка, но у третьего варианта 3 шелла, а у четвертого - один. В нашей конкретной ситуации мы получили на 4 координаты UV больше. Следовательно, модель при прочих равных будет тянуть за собой больше информации. А значит, будет больше весить, дольше просчитываться и вообще снижать оптимизацию нашей игры. А это прямая дорога в утиль.
До финала добрались два претендента. И чтобы определить победителя, нам нужно посмотреть на те нормали, которые мы имеем.
Итак, претендент номер раз. Грани жесткие, UV разбита:
В данном случае мы имеем отличную чистую карту, которая прекрасно подойдет для дальнейшего использования.
Но что же покажет нам второй претендент? Встречайте, грани мягкие, UV шелл один:
Тут мы видим менее приятную картину. Почему так получилось? Вспомним следующую картинку:
Так как наша хайполи модель по форме схожа с лоуполи, то и тангенты она имеет близкие именно к ней, но вот если группа сглаживания одна, то тангенты лоуполи-модели сильно отличаются от высокополигональной. А, значит, при запекании нам (ну не прям нам) пришлось компенсировать тангенты почти по всей поверхности модели, что мы и видим по сплошному градиенту, который заполонил карту нормалей.
Ну заполонил, ну и фиг с ним, скажете вы. Не на нормаль же мы будем смотреть в игре, а на модель. И в целом будете правы. Итоговое качество отличное, UV шелл один вместо трех. Заморочек при разбитии на smooth groups никаких. Кинул одну на всю модель и счастлив. Сплошные плюсы... казалось бы, но есть один неприятный минус.
Сейчас некоторые из вас могут нехило так удивиться, когда я скажу, что с картой нормалей можно, а зачастую даже нужно работать вручную. Делается это довольно часто и связано это с тем, что некоторые детали гораздо быстрее нарисовать на нормалке, чем хайполить, а потом запекать. И вот тут-то кроется дьявол. К примеру, мы хотим добавить к нашей нормалке какой-нибудь элемент, например, такой:
В случае с чистой нормалкой "жесткого" объекта мы это делаем без особых проблем:
Но вот в случае со сглаженным объектом нас ждет неприятный сюрприз:
Как мы можем видеть, добавленный нами элемент отражает свет совсем иначе нежели плоскость, на которой он находится. Он смотрится чужеродным. Причем, в динамике (я не умею делать гифки) дело становится еще хуже. Что и логично. У добавленной детали тангенты при запекании были выставлены правильно и не нуждались в компенсации, а вот наш объект вынужден компенсировать тангенты на всей своей поверхности.
Таким образом, мы сделали нашу нормалку непригодной для дальнейшей работы. Вы можете решить, что ничего в этом страшного нет, можно запекать и так, если мы уверены, что нам не придется больше трогать карту и она перенесется в движок в исходном виде. Однако, рабочий процесс подразумевает не только высокую скорость, но и возможность вносить изменения в готовый результат. Много изменений. Очень много. И вы никогда не знаете, когда необходимость изменений наступит и насколько они будут критичны. Так что, оставлять себе пути к отступлению нужно всегда. Иначе вы можете попасть в ситуацию, когда вам придется без малого переназначать группы сглаживания, перепекать весь меш (а это не всегда так просто и быстро как в случае с уголочком), в общем, выбрасывать в урну результат многодневных трудов. И отсюда перейдем к выводам.
А вывод довольно прост и очевиден. В последующих постах вы еще не раз убедитесь в его правильности, но пока запоминайте элементарное правило:
Объект без карты нормалей должен в целом выглядеть так же как и с картой нормалей, просто в чуть более простом виде. Там, где на модели подразумевается гладкая, ровная поверхность, или поверхность с мягким (!) изгибом, там должен быть soft edge. Если на модели должен быть четкий, очевидный жесткий (!) угол, то там должен быть hard edge.
Как и любое уважающее себя правило, это имеет исключения, но все они связаны с овероптимизацией. В идеальных условиях оно работает всегда.
И еще одно правило, вытекающее из предыдущего: где hard edge, там разрез на UV (в обратном порядке необязательно)
Итак, еще раз в упрощенном виде:
Там, где угол меньше 120 градусов, там hard edge. Там, где hard edge, там разрез UV.
Только так. Никак иначе... пока что :)
А уже в следующем посте мы начнем разбирать правила и интересные фишечки при работе с UV.
Всем спасибо за внимание! До встречи)
Лига Разработчиков Видеоигр
6.7K постов22.2K подписчика
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"