Работа над ошибками в 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.8K постов22.2K подписчиков

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

ЗАПРЕЩЕНО:

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

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

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


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

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

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

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

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

Автор поста оценил этот комментарий

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

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Мне бы тоже хотелось услышать, с каких пор трипланар стал богомерзким. Чем он вам не угодил?)

показать ответы
Автор поста оценил этот комментарий

Кст на вашем примере это тоже заметно.

Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий

Согласен. Мы получили бленд по шву. У вас он сильнее заметен из-за направленности текстуры, у меня чуть меньше. Вообще конечно сфера - довольно паскудный объект. Заставляет немного попрыгать вокруг себя) Но вот с другими формами я проблемами не сталкивался. Если у вас такое случалось, расскажите. Может проведу пару экспериментов. Со сферой тоже подумаю. Если что отпишусь.

показать ответы
Автор поста оценил этот комментарий

Далеко не на всех материалах такой хороший результат...

Слева трипланар, справа - юв.

Иллюстрация к комментарию
Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий

А можно посмотреть текстуру и UV?

показать ответы
Автор поста оценил этот комментарий

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

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

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

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


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

раскрыть ветку (1)
Автор поста оценил этот комментарий

Мне кажется, что где-то в процессе работы скрыта ошибка. И скорее всего она связана с недопониманием принципа работы трипланара. Если UV сферы имеет ровный тексель и не сильно растянута по швам, то никаких проблем не будет. Но важно помнить, что трипланар в первую очередь рассчитан на использование с бесшовными текстурами и масками. Тем более основной смысл существования трипланара именно в том, что он должен компенсировать швы UV, с чем он кстати по моему опыту справляется почти идеально. Да, иногда косяки всплывают, но их, на мой сугубо личный взгляд, исправить можно гораздо быстрее и проще, чем возюкаться с идеальной подгонкой UV.


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

Иллюстрация к комментарию
показать ответы
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
Автор поста оценил этот комментарий

Шов не будет виден, если не начинать вносить изменения в нормалку в месте стыка. Что касается текстурирования, то аккуратным надо быть :) Если рисовать текстуру в PS, то наверное идеально подогнать не получится, а если работать в Painter'е или Coat'е, то любые нестыковки можно легко исправить. В итоге, даже если шов и будет заметен, то в глаза он точно не бросится.

показать ответы