Blender: Внедрим в игрострой

Андрей Прахов задумал воскресить динозавров, чтобы повоевать с ними. Однако путь войны — это путь обмана, в том числе визуального.

В прошлый раз мы рассмотрели некоторые особенности моделирования низкополигональных объектов для игровой индустрии. Помните основное правило? Нужно придерживаться золотой середины между качеством модели и количеством элементов. Если для других целей количество используемых полигонов прямо пропорционально времени ожидания результата рендера, то для realtime, обработки в реальном времени, вывод картинки должен осуществляться без существенной задержки. Вот и приходится игровым программистам бороться за каждый тик процессора. Но мы же не звери и должны как думать о нуждах ближних, так и удерживаться в рамках техзадания!

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

В целом, процесс вывода 3D-картинки на экран происходит в несколько этапов: создание геометрии, наложение текстур, обработка света и теней, постэффекты. Самое ресурсоемкое — свет и геометрия. Причем они взаимосвязаны. Больше полигонов — выше качество картинки и меньше FPS (Frame Per Second, частота кадров в секунду), ну и наоборот. Программисты всего мира вздохнули с облегчением, когда в бытовых видеоакселераторах появились шейдеры (Shader — микропрограмма, выполняемая ядром видеоплаты, что на порядки быстрее вычисления центральным процессором, CPU). В настоящее время с их помощью реализуются технологии использования текстур для имитации мелких неровностей на поверхности объектов — bump, normal, parallax. Данные текстуры хранят в себе информацию, потребную шейдерам для имитации выпуклостей и впадин на полигонах. Фактической деформации геометрии объекта при этом не происходит. То, что мы видим — это игра светотеней. Вот только для создания такой текстурной карты требуется еще одна модель — высокополигональная, которая содержит необходимые мелкие детали.

Скульптурная лепка

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

Во-первых, рабочей функцией Multiresolution должна являться Simple. Ее алгоритм позволяет изменять детализацию объекта без нарушения начальной формы, в отличие от Catmull-Clark, которая дополнительно выполняет сглаживание. Однако использование Simple в высоком разрешении оставляет характерные резкие грани, которые уже невозможно сгладить с помощью стандартной функции Smooth. Зато сохраняется начальная форма объекта, а полученные грани легко исправить в режиме скульптуры.

Во-вторых, до работы с высокополигональной моделью нужно убедиться в качестве базовой сетки: проверить ее на отсутствие скрытых, внутренних элементов; убрать дублирующие вершины (функция Remove Doubles); развернуть нормали в правильном положении. К последнему следует отнестись крайне аккуратно, иначе при генерации текстур можно столкнуться с неприятными артефактами. По умолчанию элементы объекта всегда имеют нормали, развернутые наружу. Но в процессе редактирования вполне возможно получить элементы с обратными, внутренними нормалями. Такое оставлять нельзя. Они все должны «смотреть» в одну сторону. Для подстраховки от неприятностей достаточно выделить элементы модели в режиме редактирования и в меню Mesh/Normals окна 3D View (также в панели Tool Shelf) выбрать подходящую функцию — Recalculate Outside [Пересчитать наружу] или Recalculate Inside [Пересчитать вовнутрь].

Скульптурный режим [Sculpt Mode] предоставляет модельеру набор инструментов для деформации сетки объекта. Понятное дело, чем выше ее разрешение, тем качественнее детализация модели. Наращивание уровня осуществляется кнопкой Subdivide в настройках Multiresolution, а вот на каком значении остановиться — дело сугубо личное. Обычно хватает 4-6 уровней.

Главное правило, которым следует руководствоваться при создании высокополигональной копии — это умеренная деформация модели. Допустимо, например, на гладкой поверхности сферы выдавить губы, глаза, но лепить уши или нос уже нежелательно. Перепад между низкополигональной [Low-Poly] и высоколигональной [Hi-Poly] моделями будет настолько велик, что полученная карта Normal Map просто не сможет правильно имитировать такие детали. Посмотрите на экранные снимки динозаврика. На них отчетливо видно, что с помощью лепки были созданы мускулы, кожа, шрамы, и все они как бы накладываются на основную форму модели, не изменяя ее.

В Blender имеется большое количество кистей, которые по-разному могут деформировать поверхность объекта. Но на самом деле, достаточно знать всего пару, чтобы выполнить большую часть работы:

» Кисть Smooth Именно ею можно сгладить ненужные грани, которые не скрываются основной функцией Smooth. » Кисть SculptDraw Это основной инструмент, который позволяет придать нужную форму модели.

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

» Группа Stroke [Мазки] Фактически после первого выбора SculptDraw (эта группа есть и для некоторых других кистей), кисть выполняет непрерывное деформирование, пока движется мышь и нажата ее левая кнопка. Однако можно выбрать иной метод рисования в меню Stroke Method. Так, можно заставить ее рисовать пунктиром, а не сплошной линией, или воспользоваться режимом Drag Dot [Перетаскивание точки], при котором созданная точка может перемещаться вслед за мышью до своего закрепления.

» Группа Curve [Кривая] Это ничто иное, как настройка поведения кисти. С помощью имеющихся заготовок можно выбрать стиль рисования, от жестких границ до деформаций с плавными очертаниями.

» Группа Symmetry [Симметрия] Здесь всего несколько опций, но как они облегчают жизнь! Достаточно выбрать нужную координатную ось, и программа в точность повторит все ваши действия. Похожий эффект демонстрирует модификатор Mirror [Зеркало]. Так что, симметричное моделирование продолжается и на этапе скульптурной лепки.

Помимо стандартных способов деформации, что настраиваются в закладке Curve, можно использовать обычную или процедурную текстуру. Работа с ними также выполняется в стандартной панели Textures [Текстуры] окна Properties [Свойства]. За одним исключением: такие текстуры не сопровождаются материалами. Подготовленную текстуру нужно разместить в одноименной закладке в настройках кисти.

Конечно, такая опция расширяет возможности художника. Представьте, что вам нужна стена с рельефом. Ничто не мешает взять качественную фотографию оригинала и использовать ее как текстуру для скульптурной кисти. Единственно, уровень разрешения сетки в Multiresolution нужно установить не менее девятого.

Подготовка UV

Низкополигональная модель готова, есть и ее более точный эквивалент, пора… Стоп, если у вас действительно в проекте две модели, то можете смело удалить одну из них (оставляйте высокополигональную, ведь ее легко превратить в Low-Poly, просто убрав модификатор Multiresolution). Дело в том, что для корректного наложения текстур еще нужно провести своеобразную разметку, а точнее, привязку полигонов к двумерным координатам. Такой процесс называется UV mapping [развертка UV]. Разумеется, обе модели должны иметь одинаковую развертку.

Если вы выполняете развертку для Hi-Poly-объекта, то отключите модификатор Multiresolution. Вполне достаточно использовать основной меш [mesh].

Blender предлагает несколько вариантов создания UV-координат: ручной, автоматический и на основе проекций примитивов. Последний вариант сразу исключайте: игровой объект заведомо сложнее простых объектов, и ничего хорошего не получится. Для убыстрения работы можно воспользоваться автоматикой.

Нужная опция находится в меню UV Mapping (вызывается клавишей <U> в режиме редактирования объекта) и называется Smart UV Project.

Данная команда буквально разорвет объект на мелкие полигоны, но зато верно и без ошибок спроецирует их на двумерную поверхность (при условии, что нет нарушений в структуре модели). Правда, такой результат совсем не впечатляет, особенно если в дальнейшем предполагается ручная раскраска текстуры в редакторе типа GIMP.

Куда более перспективно выглядит ручная развертка с помощью команды Unwrap (в том же меню UV Mapping). Вот только предварительно нужно разделить модель на логичные части. В меню Edges [Ребра], вызываемом клавишами <Ctrl>+<E>, находится опция Mark Seem [Отметить шов]. Пользоваться ею просто — выделяете нужные ребра модели и выбираете эту команду. Выделенные ребра отмечаются красным цветом и служат своего рода разрезами при выполнении развертки. К примеру, для удобства работы модель персонажа можно разделить на следующие части: голова, конечности, туловище. Конечно, все зависит от объекта и поставленной задачи. Ничто не мешает продолжить «прокладку» швов в нужных местах для более детальной работы. После подготовки выполняется собственно разметка, с помощью команды Unwrap (меню UV Mapping).

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

Еще одним желательным этапом проверки может служить тестовая текстура. По умолчанию, Blender предлагает создать текстуру черного цвета типа Blank [Пустая]. Если в меню Generated Type [Тип генерации] панели New Image [Новое изображение] выбрать UV Grid, то программа сгенерирует черно-белую текстуру с квадратами, расположенными в шахматном порядке. Достаточно включить режим просмотра Texture в окне 3D View, чтобы Blender отобразил ее на модели. Внимательный осмотр объекта может выявить сомнительные места развертки UV.Работа с текстурами

Игровая модель может быть обернута большим количеством текстур. Мы рассмотрим только две широко распространенные: Diffuse Map+Ambient Occlusion (AO) и Normal Map.

Первая — это основная окраска модели с уже наложенной AO, вторая — генерируемая, рельефная карта. В принципе нет особой разницы, с какой карты начинать. Однако я предпочитаю сначала генерировать Normal Map, по одной простой причине: раскраску Diffuse удобнее выполнять по псевдовыпуклостям рельефной карты, нежели рисовать по миллионам полигонов Hi-Poly-модели.

Создание Normal Map на языке Blender носит название «выпечка [Bake]». Как вы помните, рельефная карта создается на основе сравнения двух объектов — низкополигонального и высокополигонального. В сцене уже имеется Hi-Poly-объект. Чтобы создать Low-Poly, достаточно выполнить дублирование модели командой Duplicate (<Shift>+<D>) и удалить у нового объекта модификатор Multiresolution. Запомните, менять масштаб и расположение объектов уже нельзя!

Карта будет выпекаться со стороны Hi-Poly и накладываться на второй объект. Поэтому для низкополигональной модели нужно создать текстуру: D Открыть UV Image Editor.

В Выделить в режиме редактирования все элементы объекта (клавиша <A>).

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

Дальше все просто. Выделяете сначала Hi-Poly, затем Low-Poly, удерживая клавишу <Shift>, и открываете вкладку Render окна Properties.

Здесь имеется группа с характерным названием Bake. Если открыть меню Bake Mode, расположенное тут же, то программа предоставит обширный список карт, которые может генерировать Blender. В нашем случае нужен будет пункт Normals. Тут всего несколько настроек, но они очень важны для качественной карты Normal Map. Первым делом установите галочку Selected to Active. Это заставит программу проецировать карту на текстуру последнего выделенного объекта. Установите несколько выше параметр Margin, ответственный за границы выпечки (не менее 8 единиц) и нажмите клавишу Bake. Это все, карта нормалей должна создаться. Только не забудьте сохранить готовую текстуру в окне Image Editor! Вы же помните, что Blender не предупреждает о необходимости сохранения?

Полученную Normal Map нужно проверить на правильность. В идеале не должно быть резких перепадов цвета (только оттенки синего). Иногда бывает, что полученная рельефная карта имеет не привычно-синие цвета, а ярко-желтые или даже красные — это говорит о том, что нормали у обоих объектов смотрят в разные стороны. Можно попробовать развернуть их в другую сторону командами в меню Mesh/Normals окна 3D View.

Normal Map может быть также создана на основе одного высокополигонального объекта, но при одном условии: разрешение его сетки было изменено с помощью модификатора Multiresolution. Необходимо создать текстуру для модели Hi-Poly указанным выше способом, установить уровень предпросмотра [Preview] в настройках модификатора в 1, включить галочку Bake from Multires в настройках Bake и спокойно выпекать текстуру.

Какой способ использовать — это на ваше усмотрение. Но по моему опыту, лучше пользоваться вторым вариантом. Готовая текстура получается с меньшим количеством артефактов.

Приступим к созданию Diffuse Map+Ambient Occlusion. По сути дела, это две отдельные текстуры. Первая содержит основные цвета объекта, а вторая — тени от глобального освещения в сцене. Подобную технологию очень любят использовать в мобильных играх, поскольку такая текстура получается весьма рельефной, позволяя отказаться от Normal Map и даже от источника света.

Blender позволяет просматривать объекты с использованием технологии Normal Map. Это уникальная возможность увидеть модель так, как она будет выглядеть в игровом движке. Кроме того, рисовать Diffuse поверх рельефной карты, а не реального Hi-Poly гораздо быстрее и удобней.

Итак, чтобы заставить Blender показывать текстуру в режиме Normal Map, нужно выполнить следующие шаги: D Переключить режим отображения окна 3D View из Multitexture в GLSL. Это выполняется в плавающей панели окна, вызываемой клавишей <N>, в группе Display.

В Добавить материал и текстуру для низкополигонального объекта. В параметрах текстуры указать файл с рельефной картой. В Настроить проекцию текстуры в параметрах Mapping. В меню Coordinates поставить UV.

В В группе Image Sampling установить галочку в Normal Map. 5 В группе Influence снять галочку у параметра Color и включить Normal.

Технология Normal Map будет работать только при наличии источников света в сцене. Поэтому необходимо добавить достаточное количество обычных точечных ламп, чтобы осветить весь объект.

Однако рисовать нужно поверх Normal Map, но не на самой рельефной карте. Для этого понадобится создать еще одну текстуру в UV Image Editor указанным ранее способом. Кроме того, созданную текстуру Diffuse нужно поместить в любой свободный текстурный слот материала объекта (панель Properties, закладка Textures).

Вот теперь можно открыть режим рисования Texture Paint окна 3D View и спокойно рисовать прямо на трехмерном объекте. Этот режим напоминает рассмотренный скульптурный. Можно выбрать и настроить кисти, установить базовый цвет и даже использовать текстуру.

Последним шагом будет создание карты Ambient Occlusion и совмещение ее с Diffuse Map. AO генерируется точно таким же способом, как и Normal Map. Единственное, для нее понадобится новая текстура, созданная в UV Image Editor, и выбор пункта соответствующего меню в группе Bake. Никаких дополнительных настроек, отличных от рассмотренных в случае с нормалями, не требуется.

Давайте разберемся с окончательной подготовкой Diffuse Map + AO. Это можно сделать как в Blender, так и в GIMP. Причем в данном случае я предлагаю именно второй вариант. Все-таки совмещение карт в Blender выглядит на удивление запутанно.

Создание основной текстуры с освещением окружения в GIMP состоит из нескольких шагов:

Открыть основную текстуру в программе и загрузить как слои Normal Map и Ambient Occlusion.

В Обесцветить Normal Map. Выберите пункт Обесцвечивание в меню Цвет. В качестве Основ оттенка отметьте значение Светимость.

В Выбрать для рельефной карты режим смешивания — Умножение в панели Слои. Установить для карты AO режим смешивания Умножение. Вот и все. По этому рецепту вы получите качественные текстуры для вашей игровой модели. Конечно, многое зависит от личных художественных способностей, но вы теперь уверены — технологии софта Open Source не уступают альтернативным коммерческим пакетам!

Like this post? Please share to your friends: