суббота, 22 июня 2019 г.

SpeedTree для Unity. Создаем низкополигональные игровые модели деревьев. Создаем кластера, якоря.

3. Создаем кластера, якоря.

  Вспомним созданное нами дерево, геометрия которого приближается к 70 тысячам треугольников. В играх в сцене одновременно отображается меньшее количество треугольников, естественно, учитывая то, что включено отсечение невидимой геометрии, у объектов сцены работают уровни детализации и в кадре отсутствует главный герой на 100К треугольников )
  Наше дерево нужно упростить, создав кластера. Что такое кластер? Это группа одинаковых или подобных элементов, собранных воедино. В нашем случае это листья. Их довольно много, и каждое из них состоит как минимум из четырех треугольников. Ветка с листьями является кластером, при этом она так же, как отдельный лист может состоять всего лишь из четырех треугольников.
  Есть официальный урок от художника компании SpeedTree Sonia Piasecki, в котором она рассказывает, как создавать кластера:


  Если нет желания изучить урок на английском, я коротко опишу скрипт действий:
  • Заранее подготовим материалы для веток и листьев.
  • Создаем ствол дерева с единственной веткой (Branch tubes). Веток может появиться несколько, поэтому на панели свойств в закладке Gen уменьшаем параметры Frequency и Count до тех пор, пока не останется одна ветка.
  • В окне просмотра в левом верхнем углу меняем вид с Perspective на XY Plane.
  • Выделяем ветку и в Gen/Shared вращаем ее (Rotation) пока она не будет направлена вверх.
  • Щелкаем на пустом месте в окне просмотра, панель свойств изменится. Выберем пункт Windows Properties. В разделе Screenshot Safe Frame отмечаем галочкой Show. Появится красная рамка.
  • Подгоним средней кнопкой мыши ветку в окне просмотра так, чтобы она выходила из короткой красной полоски снизу экрана и чтобы не было видно ствола дерева.
  • Добавим ветке искривлений: Properties/Spine/Noise/Late. Изменяем параметры Amount, Turbulence, Smooth. 
  • Добавим к готовой ветке Big Branches.
  • В закладке Gen выберем режим листорасположения (Phyllotaxy) и стиль переменного двухрядного чередования (Alternating (distichous)).
  • Настроим ветки, используя полученные ранее знания. Изменим длину, толщину, искривления.
  • Продублируем ноду Big Branches и перетянем копию на Big Branches.
  • Настроим новую ноду Big Branches, используя полученные ранее знания.
  Немного отдохнем перед созданием листьев. Помним, что все уровни нод на любом этапе можно настраивать, поправлять, изменять. Поэтому самостоятельно изменим и улучшим промежуточный результат.
  • Добавим ко второй ноде Big Branches листья: +Add/Leaf Mesh.
  • Во вкладке Gen выберем режим Phyllotaxy и стиль Alternating (distichous), отрегулируем межузловую длину (Internode length) и распространение (Spread), зададим границы (Boundaries)
  • Во вкладке All/Local Orientation используем ползунок Align для выравнивания направления листьев вдоль ветки.
  • Во вкладке All/Deformation немного загнем и закрутим листья (Fold, Curl).
...
Пауза. Закончилась лицензия на Speed Tree. Статья будет дописана позже.

пятница, 21 июня 2019 г.

SpeedTree для Unity. Создаем низкополигональные игровые модели деревьев. Собираем базу текстур, создаем сеты текстур.

2. Собираем базу текстур, создаем сеты текстур.

  В предыдущей статье мы очень быстро ознакомились с базовыми функциями SpeedTree для Unity и сделали первое дерево. Теперь перейдем к пункту, с которого надо начинать осмысленную работу.

  Уже зная то, над каким растением предстоит работать, надо задать еще много вопросов:

  • Каким будет бюджет модели по треугольникам.
  • Какая пора года или сезон в области использования дерева.
  • Дерево молодое/старое, живое/засохшее, больное/здоровое, важное/второстепенное...
  • Какая может быть уникальность дерева, его отличительная черта и т.п.
  Пример 1: середина осени, старый, но крепкий одинокий дуб, с желтеющими листьями, поросший мхом и грибами, потерявший пару веток после сильных бурь.
  В примере показан уникальный дуб с толстым стволом, широкой кроной, с желудями, возможно, частично теряющий листья, или местами с зелеными листьями, возможно, с различными наростами на коре или дуплом, или корягообразными засохшими ветками.

  Пример 2: середина весны, крепкий граб в чаще леса, с пышной кроной, дающей плотную тень, растущий в сырой местности.
  В этом примере показан один их многих грабов в этом лесу. Он теснится среди других деревьев и тянется ввысь к солнцу. На одну треть ствол голый, частично покрытый лишайником. Крона узкая, ветки длинные. Имеет цветение в виде "вертолетика".

  Пример 3: горная местность, лето, тонкая молодая чахлая осина, растущая на уступе скалы. 
  Осина, которая, возможно, никогда и не вырастет. У нее несколько тонких веток, частично покрытых желто-зелеными и сухими листьями. Если дерево наберет сил, его повалит сильный ветер, который часто бывает в этой местности.

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

  Сейчас я скачиваю текстуры с двух сайтов: textures.com и texture.ninja, а так же имею и дополняю собственную базу сделанных мною текстур. Очень хорошо при фотографировании текстур получить и референсы дерева, а так же хорошо иметь снимки с разным освещением. Например, фотографии кроны дерева и листвы на просвет впоследствии помогут сделать правильную текстуру подповерхностного рассеивания света.

  Итак, сейчас структура моих папок и файлов выглядит так:

>Trees
    Tree_Cornus
    >Tree_Hornbeam
        >References
            Tree_Hornbeam_01
            Tree_Hornbeam_02
            Tree_Hornbeam_03
        >Textures
            Tree_Hornbeam_Branch_Small_01_diff
            Tree_Hornbeam_Leaf_Summer_01_diff
            Tree_Hornbeam_Leaf_Summer_02_diff
            Tree_Hornbeam_Trunk_01_diff
            Tree_Hornbeam_Trunk_02_diff

  Текстуры ствола (trunk) и ветки (branch) должны быть затайленными (seamless). У листьев черешок должен быть прямым.

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


  Я создаю текстурные сеты в программах Substance B2M и Photoshop.

  Для ствола или веток я создаю такой сет:
Tree_Hornbeam_Trunk_01_diff — диффузный, альбедо или базовый цвет
Tree_Hornbeam_Trunk_01_normal — карта нормалей
Tree_Hornbeam_Trunk_01_gloss — карта глянца
Tree_Hornbeam_Trunk_01_ao — карта затенения от окружающей среды

  Для листьев добавляются еще две текстуры:
Tree_Hornbeam_Leaf_Summer_01_mask — карта прозрачности
Tree_Hornbeam_Leaf_Summer_01_ss — карта подповерхностного рассеивания

Сеты я делаю для каждого элемента дерева кроме тех, к которым можно применить один и тот же сет.

Когда готовы все сеты, можно начинать работу в SpeedTree для Unity.

среда, 19 июня 2019 г.

SpeedTree для Unity. Создаем низкополигональные игровые модели деревьев. Введение, быстрый старт.

Небольшое введение

  Для начала я расскажу о долгом пути к SpeedTree, а потом поделюсь процессом создания моделей деревьев в этой программе.

  Важность растительности в играх я раньше постоянно упускал. Реалистичные деревья было сложно и долго делать, а их применение в играх, как я думал раньше — декоративное заполнение сцен, на уровне пропсов.
  Для первых "игровых" сцен, еще до работы в геймдеве, я использовал CD библиотеки с текстурами и готовыми к ним масками. Текстура дерева применялась к прямоугольной плоскости, а копия плоскости проворачивалась на угол в 90 градусов. Так получалось дерево. Светотень играла по граням и выглядело такое дерево примитивно. С работой, показанной ниже, я пришел на Action Forms в 2003-м году, и первое замечание было о деревьях "крестом". На работу меня тогда не взяли, но не по этой причине )
По мотивам Rally Championship 2000 (2003)

  Спустя несколько лет, уже работая над играми в компании, мой подход к созданию моделей деревьев практически не изменился. Для игры Minesweeper Flags я сделал деревья "крестом" и только для некоторых деревьев попробовал промоделить ствол и крону геометрией. Игра создавалась на Nebula engine, использовалась реалтайм графика и были ограничения по бюджету полигонов.
Minesweeper Flags (XBLA, Microsoft, 2010)

  Следующим был период пререндеренной и обрисованной поверх графики. Создание растительности стало занимать еще больше времени. Я по-прежнему делал деревья и прочую растительность вручную. Если сюда добавить время рендера всех элементов сцены, времени на обрисовку не оставалось.
Artifacts of the Past: Ancient Mysteries (Alawar, 2011)

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

Немного важной информации

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

  • Подписка на SpeedTree для Unity стоит всего $19/мес. Не пользуйтесь варезом. Покупая подписку вы получаете последнюю версию программы, не тратите время на поиск пираток, спокойны за чистоту своего компьютера, поддерживаете разработчика своими небольшими вкладами )
  • SpeedTree для Unity не имеет всего функционала полной версии, доступного для версий из раздела Visual effects, а так же Games Full. Например, в SpeedTree для Unity не получится насладиться скрещиванием фотограмметрии с процедурными операциями.
  • Деревья из SpeedTree для Unity нельзя отредактировать в других программах. Допускаю, что существуют какие-либо конверторы, с которыми пока не приходилось сталкиваться.
Поехали

  1. Быстрый старт.
  2. Собираем базу текстур, создаем материалы.
  3. Создаем кластера, якоря.
  4. Улучшаем, украшаем, обогащаем, добавляем сезонность.
  5. Добавляем силы, объекты коллизий.
  6. Оптимизируем при помощи LOD`ов.
  7. Экспортируем в Unity.
1. Быстрый старт

  Создадим первое дерево не затратив на это много времени.

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

  На панели генерации жмем +Add и выбираем ствол (Trunk). В окне просмотра появился ствол с линейкой, размерами в футах (0,3048 метра) и очень удобным человечком для определения масштабов "на глаз". Первым делом хочется изменить высоту и толщину ствола, и поначалу это непросто. Надо запомнить, что все действия, отвечающие за высоту/длину/кривизну, т.е. за продольные изменения ствола, находятся в закладке Spine (Хребет), а поперечные параметры можно изменить в закладке Skin (Оболочка). Настраиваем высоту и толщину в параметрах Spine/Length и Skin/Radius.

  При активной ноде Trunk снова жмем +Add и выбираем основные ветки (Big Branches).
  Теперь перейдем в закладку Gen на панели параметров. В свободное время самостоятельно изучим параметры всех десяти режимов (Выпадающий список Mode), а пока оставим режим Interval. В разделе Interval настроим частоту пучков веток (Frequency), число веток в пучке (Count) и подвигаем ползунок распространения веток по стволу (Spread) В разделе Shared определим верхние и нижние границы распространения веток. В этом же разделе есть параметр Size scalar — изменение длины веток без генерации поперечных сечений; параметр Sink (погружение), позволяющий управлять локальным смещением веток; график подрезки веток (Pruning); ползунок случайного удаления веток (Knockout) и выпадающий список Extend parent (Продлить родительский объект), о котором будет написано позже.

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

  На ранее заданной высоте геометрия ствола обрывается, оставляя открытый меш. Его можно:
1. Накрыть (Cap). В этом случае выделяем ноду Trunk, жмем +Add, выбираем Cap.
2. Продлить. В этом случае выделяем ноду Big Branches и жмем на выпадающий список на панели свойств: Gen/Shared/Extend parent и выбираем Any.

  Теперь добавим +Add/Little Branches и продлим Big Branches так, как мы продлили ствол. На Little Branches уже можно добавить листья, либо добавить маленькие веточки (Twigs) и назначить листья на две новые ноды сразу, но сначала подготовим пару текстур: кору и лист.

  Регистрируемся на сайте textures.com или другом подобном сайте и скачиваем нужные текстуры. Для первого дерева не важно какие текстуры подобраны. Я скачал лист клена и подходящую кору. Текстура коры должна быть бесшовной (seamless), а для листа нужно сделать отдельный файл с альфа-каналом.


  На панели справа выбираем закладку Material и жмем +/- затем Add new, переименовываем материал на Bark, и, не выходя из меню создаем еще один материал и называем его Leaf. Теперь в выпадающем списке у нас есть два материала. Выбираем материал Bark, ниже жмем на квадрат, подписанный как Color и выбираем текстуру коры. Возле выпадающего списка жмем на кнопку с пиктограммой руки и тянем на ствол дерева. В этом случае текстура назначится на всю геометрию иерархии, от родительского до дочерних объектов.
  Теперь подобным образом подготовим материал листьев. Текстуру с альфа-каналом выберем нажав на квадрат Opacity. В настройках отметим флажком Two-sided.

  Создадим листья выбрав ноду Little Branches +Add/Leaf Mesh. На появившуюся на ветках геометрию перетянем материал Leaf. Скопируем (Ctrl+D) ноду Leaf Mesh и перетянем на ноду Twigs. Теперь листья есть и на Little Branches и на Twigs. Выбрав с Ctrl обе ноды Leaf Mesh мы сможем менять их параметры одновременно.
  На панели свойств во вкладке Gen выберем режим Classic, стиль Absolute и частоту (Frequency) на свой вкус.
  Поздравляю, вы создали свое первое дерево в SpeedTree.

  А теперь посмотрите на темный прямоугольник в верхнем левом углу. Сейчас там отображаются ужасающие цифры. Вспомним о деревьях "крестом", вся геометрия которых состояла из 8 треугольников (tris)
  Примитивное, но не оптимизированное дерево мы делать научились, дальше будем учиться упрощать, улучшать и украшать.

вторник, 26 марта 2019 г.

3ds Max. Известные проблемы и решения

  • Пропали оси перемещения объектов в 3ds Max.
а) Включить или отключить оси можно отметив чекбокс: Customize/Preferences/Gizmos/Transform Gizmos/On.
б) В старых версиях 3ds Max нужно нажать "x"
  • Мерцание геометрии в 3ds Max (Z-fighting)
а) Проверить место нахлеста объектов. При необходимости отодвинуть объекты один от другого.
б) Нажать "+" в левом верхнем углу вьюпорта, выбрать Configure Viewport, отметить чекбоксом Viewport Clipping. В правой части окна просмотра появятся два ползунка, которыми нужно отметить область отсечения геометрии ближнего и дальнего планов.
  • Проблемы с освещением или шейдингом отдельных полигонов модели в 3d Max.
Применить к модели модификатор Normal, конвертировать модель в редактируемую сетку, инвертировать нормали.
  • Модель передвигается рывками в 3ds Max.
а) Переместить объект ближе к нулевым координатам.
б) Использовать изометрию.
в) Использовать ручной ввод координат.
г) Использовать Projection трансформацию вместо Intersection: Customize/Preferences/Gizmos/Move/Rotate Transforms 
  • Как улучшить качество текстур в окнах просмотра 3ds Max (Display Driver Nitrous)
  1. Создать документ для скрипта (F11)
  2. Вставить строку NitrousGraphicsManager.SetTextureSizeLimit 4096 true
  3. Нажать Enter
  4. Вставить строку NitrousGraphicsManager.SetBackgroundTextureSizeLimit 4096 true
  5. Нажать Enter
  6. Сохранить скрипт для автозапуска при последующих включениях 3ds Max:  C:\Users\имя компьютера\AppData\Local\Autodesk\3dsMax\версия 3ds Max\ENU\scripts




    вторник, 17 июля 2018 г.

    Освещение

      В современных играх широко используется глобальное освещение (Global Illumination).
    GI имитирующее при помощи ряда методов сложное поведение и распространение света в игровом мире является дорогостоящим для вычислений процессом. Однако оптимизация этих методов и просчитанное заранее глобальное освещение дадут отличный результат при невысоких затратах.
      Подразумеваем то, что наша игра должна работать в реальном времени, то есть графика на экране должна обновляться в каждом кадре. Однако источники света работающие в реальном времени не рассеивают свет и не дают отскока света от поверхностей. Поэтому мы должны заранее просчитать глобальное освещение.
      Глобальное освещение можно:
    1. запечь в световые карты (lightmaps) и наложить статично поверх текстур (baked GI)
    2. предварительно рассчитать и использовать динамически (realtime precomputed GI)
    Первый метод подходит для мобильных устройств, а второй — для игровых консолей последних поколений и стационарных компьютеров. Также можно использовать оба метода, однако нагрузка от их одновременного использования будет суммироваться.
      Традиционно для просчета глобального освещения используется метод трассировки лучей по поверхности (Ray tracing), но этот метод дорог для просчетов. В Unity мы используем Light transport — метод трассировки лучей между кластерами, которые представляют упрощенную модель освещения мира.

      Запуск предварительных вычислений
      Только статичные (Static) объекты участвуют в предварительных процессах создания GI. Поэтому все нужные объекты помечаются как Static на панели Inspector. Предварительный просчет начнется немедленно. Отключив чекбокс Auto мы сможем запускать процесс вручную. Прогресс выполняемых задач и их количество будут отображены на информационной полосе снизу. По скорости прогресса и выполняемой задаче будет заметно где самое большое падение скорости выполнения процесса. На это следует обратить внимание и в дальнейшем оптимизировать эти задачи. При предварительном просчете Realtime GI выполняется 11 задач, Baked GI —16 задач.
      Данные предварительных вычислений кэшируются для экономии времени повторных вычислений. Кэш можно очистить используя Preference>GI Cache>Clear Cache

    Методы рендеринга
      Forward — быстрый метод с низким требованием к оборудованию можно применять для сцен с небольшим количеством света.   
      Deferred — метод требовательный к оборудованию с предсказуемыми характеристиками производительности.

    Цветовое пространство
      Выбрать цветовое пространство Edit> Project Settings> Player
    Gamma — используется маломощным оборудованием.
    Linear — пространство с повышенной точностью цветов предпочтительнее для реалистичного рендеринга.

    Динамический диапазон
      HDR (High Dynamic Range) позволяет охватывать цвета, находящиеся далеко за пределами цветового диапазона монитора, и в нужных ситуациях эти цвета вытягиваются и отображаются с полутонами. Так, используя эффект Eye Adaptation мы можем разглядеть детали в темной пещере, а переведя взгляд на яркое небо разглядеть детали на нем.
    HDR работает с линейным цветовым пространством и Deferred методом. 

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

    Окружающий свет
      Окружающий свет заполняет сцену и воздействует на объекты со всех сторон при помощи Skybox, градиента или цвета. Объекты на сцене учитывают оттенки окружающего освещения. Изменение цвета в параметрах Skybox влияет на освещение объекта, не изменяя цвета Skybox.

    Типы источников света
      Основные источники света в Unity это направленный свет (Directional light), точечный светильник (Point light), прожектор (Spotlight) и зона света (Area Light).
      Лучи направленного света параллельны. Этот глобальный источник можно разместить в любом удобном месте сцены, а направление света и теней будет зависеть только от поворота этого источника, который  имитирует действия солнечного света.
      Точечный светильник излучает свет во всех направлениях. Его интенсивность меняется от полной в центре до нулевой в пределах, определяемых свойством Range.
      Излучаемый прожектором свет ограничен формой конуса. Затухание света происходит вдоль направления света и к краям конуса, образовывая полутень.
      Световая зона — это запекаемый источник света, излучающий рассеянный свет с мягкими тенями.

    Материал излучающий свет
      Излучающим материалом (Emissive Materials) можно освещать объекты мягким светом подобно источнику Area light. Однако в данном случае форма источника света может быть какой угодно. Также излучаемый материал может работать в режиме реального времени. Свет от этого источника воспринимается статичными объектами и сама геометрия излучателя должна быть статичной. Для освещения самосветящимся материалом динамических объектов нужно использовать световые зонды.

    Световые зонды
      Для освещения отраженным светом динамических объектов в сцене используется сетка световых зондов (Light probes). Зонды помещаются в сцену, и информация, полученная с освещения кодируется в набор значений. Возле границ контрастных цветов, цветовых переходов или света и тени зонды размещаются плотнее.

    среда, 30 ноября 2016 г.

    Моделирование персонажа.


    Пайплайн.
    1. Изучить скетчи, концепты персонажа. Ознакомиться с историей его жизни. Понять, какой именно характер хотел донести художник, пообщаться с ним, обсудить детали.
    2. Внимательно изучить примеры персонажей последних вышедших игр. Ориентироваться на достойное качество. (Тут важно помнить, что игра поточного года выпуска запускалась в производство несколько лет назад). Выделить интересные решения, понять, как это было достигнуто. Использовать личные идеи по улучшению.
    3. Найти подходящие фотореференсы — реальные примеры всегда лучше тех, которые мы сможем достать из своей памяти. Фотореференсы помогут избежать многих ошибок, даже если рука крепко набита на персонажном моделировании. Иметь примеры для всех нужных элементов крупные планы глаз, носа, ушей и т.п.
    4. Изучить топологию. Геометрия лица с так называемой "маской лица", должна быть создана с максимально правильной топологией под морфинг лицевой анимации. Геометрия персонажа должна быть правильно нарезана на модели в местах сгибов суставов, и неизбежное пересечение (проходжение геометрии) должно выглядеть максимально правильно. Нужно предусмотреть появление неизбежных растяжек текстуры, правильно использовать топологию для уменьшения текстурных искажений. При моделировании выдерживать правильные пропорции тела.
    5. Моделировать подетально. Отдельно смоделированные нос, геометрия вокруг глаз, губы, будут выглядеть лучше, если их создавать по отдельности с дальнейшим объединением в одну геометрию.
    6. Использовать ретопологию — технологию создания низкополигональной модели поверх высокополигональной.