Blender — Заметка о запекании нормалей. Baking normals.

21. июля 2018 Blender 0

Данная заметка актуальна для Blender 2.79 и младше.

Опорные уроки:

https://youtu.be/0r-cGjVKvGw

https://youtu.be/M0rbYe9G3ok

https://youtu.be/6D5tBEjS-N0

Примечание: Нейтральное значение нормали по цвету: красный канал — 128; зелёный канал — 128; синий канал — 255.

      1. Убедиться, что выбран Cycles Render.
      2. Создать базовую текстуру в UV/Image Editor:

      3. В появившемся окне настроить параметры:

        Name — любое.

        Width, Height — кратное степени двойки (512х512, 1024х1024 и т.д.). Размер лучше выставлять в два раза больший, чем целевое разрешение. Это связано с тем, что уменьшение текстуры под целевое разрешение в растровом 2D редакторе даёт существенно меньше искажений, чем запекание напрямую.

        Color — любой. Позже он будет заменён на содержимое запечённой текстуры нормали.

        Alpha — отключить, не требуется в большинстве случаев.

        Generated Type Blank, если нужна просто текстура нормали.

        32 bit float — включить глубину цвета 32-бит, что позволит сохранить в формат .exr (32-бит). Этот формат будет промежуточным, потом можно пересохранить в .tif (16-бит). Высокая глубина цвета == повышенная точность, которая даст запас для сглаживания и снижения разрешения без существенных искажений.

      4.  Для низкополигональной модели создать материал с обязательным наличием нода Image Texture. Без него процесс запекания не запустится. Подключить в него ранее созданную в UV/Image Editor «пустую» текстуру. В настройках нода вместо Color выбрать Non-Color Data, что необходимо для текстур нормалей.
      5. Настроить параметры запекания в Properties / Render / Bake.

        Bake Type — выбрать Normal.
        Space — выбрать Tangent.
        Swizzle — если под OpenGL, то оставить как есть, если под DX, то выбрать —Y-.
        Margin — «обводка» по границе UV-острова на запечённой текстуре. Служит для избежания «вылезания» фона текстуры при переключении mip-уровней. Для разрешения 4096х4096 достаточно 16-24 пикселей, для 2048х2048 — 8-12 пикселей. Само собой, между UV-островами и границами UV-пространства должно быть достаточное расстояние, чтобы не было наслоения.
        Clear — включить.
        Selected to Active — запечь информацию с выделенного объекта на активный. В данном примере сначала будет выделена высокополигональная модель, а потом к выделению добавится низкополигональная.
        Cage — использовать дополнительную модель, охватывающую активный объект (модель, на которую производится запекание), из которой будут испускаться лучи. В данном случае применять не будем.
        Ray Distance — подобрать значение, при котором не будет артефактов запечки, при условии, что всё в порядке с моделями и развёрткой. Пробовать значения от 0,05 — 0,1.

      6. У низкополигональной модели должна быть сделана развёртка.
      7. Нормали вершин должны быть настроены (применено сглаживание, обозначены жёсткие рёбра).

      8. Сначала выделить высокополигональную модель, а потом добавить в выделение низкополигональную. Главное не перепутать.

      9. В Properties / Render / Bake нажать Bake. Первый рендер может быть относительно долгим.
      10. Результат будет отображён в UV/Image Editor. На вид с нормалью что-то не так, но не стоит спешить с решением этой «проблемы».

        Ещё бывает, что с нормалью всё совсем не так:

        В данном случае жёлтый цвет указывает, что лучи не пропекли геометрию. Необходимо проверить длину лучей (Ray Distance) или корректность Cage, если применяется.

      11.  Перед какими-либо манипуляциями с результатом необходимо его сохранить в файл, иначе он будет потерян и придётся запекать повторно. Сохранить результат можно с помощью F3 или Image / Save As Image. Сначала нужно сохранить в .exr (32-бит), иначе будут проблемы с переключением в цветовое пространство sRGB.

      12. После сохранения стоит обратить внимание, что в N-панели UV/Image Editor в выпадающем списке Source вместо Generated стало Single Image и появился путь до сохранённой текстуры:

      13. Теперь можно исправить «проблему». Заключается она в цветовом пространстве (Color Space). После сохранения в .exr оно переключается на Linear. В N-панели UV/Image Editor, в выпадающем списке Color Space необходимо переключить с Linear на sRGB. Для корректного результата под игровые движки требуется именно sRGB. Теперь текстура нормали отображается привычным образом.

      14. Теперь нужно вновь пересохранить в «исправленном» виде сначала в .exr, а потом можно .tif (16-бит). В формате .exr текстура нормали не будет работать корректно в Cycles, поэтому нужно пересохранить в формат «попроще». 16-бит точности в формате .tif будет достаточно.

        Итоговый результат в Krita: