Раздел:
2. Ландшафт
Автор оригинала:
Naim2k10
Источник:
http://www.sc2mapster.com/forums/resources/tutorials/14389-tutorial-texture-with-normal-map/

Теория

Движок Starcraft 2 использует отложенный рендеринг, это означает, что вместо того, чтобы делать рендер объекта для каждого источника света на вашей карте, игра делает это лишь единожды. Чтобы результат освещения был правильным для более чем одного источника света, информация об освещении каждого пикселя хранится в RGB каналах текстуры, это наш base map - также известный как diffuse - файл текстуры (количество красного, зеленого, синего света, который отражается пикселем).
С base map'ом мы можем сделать красочную текстуру земли, но она будет выглядеть плоской. У камней или брусчатки бывают трещины, они не одинаковые по форме и размерам. Для большей детализации текстур графический движок игры использует разновидность рельефного текстурирования - Bump Mapping. Для этого метода мы используем еще одну текстуру, которая показывает высоту каждого пикселя, поверх нашей основной. Это довольно удобно, но если мы захотим вращать карту (или задавать время дня для изменения света), то свет на поверхности с Bump Mapping'ом всегда будет отражаться в одном направлении. Чтобы сделать более красивое освещение "на любой случай" нам понадобится информация о каждой из перемещаемых осей (x,y,z). Вот для этого и нужен Normal Mapping. Каждый RGB канал - это карта высот нашей текстуры, где R(красный) = ось x, G(зеленый) = ось y, B(синий) = ось z. Значит, когда мы двигаем наш объект по оси x, R-канал нашей текстуры (normal map'а) сообщает движку, как должен отражаться свет. Выступы будут ярче и отразят больше света, в то время как углубления будут затемнены и отразят свет только под определенным углом, либо не отразят вообще. В Starcraft 2 normal map'ы также имеют альфа канал, который работает как bump map.

Для начала работы нам понадобятся

  • Графический редактор GIMP 2.6 или выше ( скачать можно по адресу www.gimp.org/downloads )
  • Редактор StarCraft 2
  • Текстура земли

Подготовка графического редактора

Для работы с картами нормалей и форматом текстур dds, который необходим для корректного импорта в игру, нам потребуется установить соответствующие плагины к GIMP.
Их можно найти на страницах:
На каждой из них нужно скачать архив, описываемый как Windows 32-bit binaries.
В архивах содержатся файлы Readme с инструкциями по установке.
Процесс установки крайне прост - мне, например, пришлось распаковать все имевшиеся в архивах exe-файлы в папку C:\Program Files\GIMP-2.0\lib\gimp\2.0\plug-ins и все dll-библиотеки в папку C:\Program Files\GIMP-2.0\bin
После этого достаточно перезапустить GIMP, все плагины будут на месте и в рабочем состоянии.

Подготовка изображения

У меня под рукой не было подходящей текстуры, и я просто ввёл в гугл "мостовая" и достал вот эту картинку с первой страницы:
Первым делом изображение придётся урезать, доведя его до размера 512х512. Утверждается, что при импорте текстур других разрешений игра начинает беспощадно растягивать и сжимать их, что приводит к довольно печальным результатам.
Я выбрал участок, на котором было поменьше заметных предметов, вырезал его при помощи инструмента Кадрирование (можно найти на основной панели инструментов) и применил фильтр "Карта"\"Без швов" ("Map"\"Make tileable")
Вообще фильтр "Без швов" не является волшебным решением всех проблем с тайлингом, но в данном случае результат более-менее приемлемый.
Напоследок убедимся, что у текстуры только один слой и нет альфа-канала.

Normal map

Воспользуемся фильтром Normalmap, который мы установили ранее. Его можно найти в меню "Фильтры"\"Карта"\"Normalmap" ("Filters"\"Map"\"Normalmap").
В окне настроек фильтра есть довольно полезная кнопка 3D Preview. Она вызывает отдельное окно, в котором можно посмотреть примерный результат, т.е. то, как будет выглядеть поверхность в 3д.
В окне предпросмотра есть и свои настройки, с которыми тоже имеет смысл поиграть.
Я, например, выставил свой Diffuse color, чтобы поверхность не была совсем белой.
Но вернёмся к настройкам самого фильтра.
Самый важный параметр здесь - список Filter, в котором мы можем выбрать один из методов вычисления карты нормалей. На самом деле в каждом конкретном случае нужно пробовать разные методы и смотреть, какой из них лучше подходит.
В случае с текстурами поверхности также рекомендуется использовать опцию Wrap - она, по идее, должна сделать границы карты незаметными.
Список Conversion предлагает выбрать, из каких компонентов изображения будет вычисляться бамп. В некоторых случаях полезно использовать только один канал.
Теперь нам нужно адаптировать полученную карту для игры, т.к. StarCraft II использует свой формат изображения и почему-то по-своему воспринимает каналы при обработке bump-map.
Откроем окно Каналы ("Окна"\"Прикрепляющиеся диалоги"\"Каналы").
Можно заметить, что если мы отключим все каналы, кроме красного (нажимая на кнопки с изображениями глаз в соответствующих строках списка), то будут видны горизонтальные тени (как если бы источник света находился слева); если оставим только зелёный - тени будут вертикальными.
Синий же канал отображает сразу и то, и другое, но он нам не понадобится, так как комбинация красного с зелёным делает, по сути, то же самое.
Игра берёт информацию из альфа-канала, и теперь нам нужно создать этот альфа-канал из смеси красного и зелёного каналов изображения.
Для этого необходимо кликнуть правой кнопкой мыши по красному каналу и выбрать "Канал в выделение" ("Channel to selection"), после чего кликнуть правой кнопкой мыши по зелёному каналу и выбрать "Добавить к выделению" ("Add to selection").
Нажав правой кнопкой по пустому белому квадрату под существующими каналами, выберем в выпадающем меню "Создать канал..." ("Add channel...").
В появившемся окне следует установить Непрозрачность заливки (Opacity) 100% и отметить опцию "Создать из выделения" ("Initialize from selection").
Выделение нескольких каналов, в зависимости от изображения, может сильно замедлить работу GIMP. Снимем выделение, выбрав в меню "Выделение"\"Снять".
Прежде, чем продолжить работу с новым каналом, необходимо разобраться со старыми.
Для этого откроем Слои ("Окна"\"Прикрепляющиеся диалоги"\"Слои"), выделим единственный слой и в верхнем меню выберем "Цвет"\"Составляющие"\"Микшер каналов" ("Color"\"Components"\"Channel mixer").
В появившемся окне отметим галкой пункт Монохромный, затем установим значения Красный и Зелёный в 50.
Чтобы превратить полученный ранее канал в альфа-канал, вернёмся к окну Слои, кликнем правой кнопкой по единственному слою и выберем "Добавить маску слоя..." ("Add layer mask...").
В появившемся окне следует выбрать опцию Канал и найти в списке созданный нами новый канал (хотя кроме него в списке ничего быть и не должно).
Теперь снова кликнем правой кнопкой по нашему слою и выберем "Применить маску слоя" ("Apply layer mask")
Можно также удалить созданный нами "лишний" канал - он останется в виде Альфа-канала.
Normal map закончена! Осталось сохранить её в формате dds. Для этого достаточно нажать "Файл"\"Сохранить как" и в имени файла указать нужное расширение.
Далее перед нами появится меню "Save as DDS", где следует выбрать Compression "BC3 / DXT5" и отметить галкой пункт "Generate mipmaps".
Игра использует именно такие параметры, так что их нужно выставлять для любых текстур StarCraft 2.
Но подождите пока запускать редактор! Если импортировать текстуру сейчас, мы получим в лучшем случае нечто сплошь чёрное.
Если посмотреть в предпросмотрщике редактора какую-нибудь текстуру поверхности, можно заметить, что все они подозрительно тёмные, хотя в игре такого эффекта не наблюдается.
На самом деле это связано с альфа-каналом самой текстуры, который, наряду с normal map, используется игрой для вычисления освещения.

Base map

Итак, нам нужно вернуться к нашему изображению (у меня оно сохранено как texture-tileable.png).
Здесь нужно добавить альфа-канал, который будет отвечать за то, где и как поверхность будет отражать свет.
Если залить весь альфа-канал белым цветом, в игре поверхность будет сиять однотонным белым, если альфа-канал будет чёрным - текстура будет отображаться без каких-либо бликов и теней, а источники света будут ей полностью игнорироваться.
При этом каждая цветовая составляющая альфа-канала отвечает за отражение света соответствующего цвета.

Надо отметить, что даже серые альфа-каналы понабодятся нам только для очень сильно отражающих поверхностей, вроде слизи или, например, хрома; в большинстве же случаев необходимо выставлять значения между 1 и 40, т.е. почти полностью прозрачные.
Именно поэтому в редакторе текстуры, нарисованные в предпросмотрщике поверх чёрного фона, выглядят практически чёрными.
Пришло время создать альфа-канал. Для этого достаточно в окне Слои нажать правой кнопкой мыши на единственный слой и выбрать "Добавить альфа-канал".
Теперь нужно этот канал чем-нибудь заполнить, желательно чем-нибудь тёмным (по умолчанию он целиком белый, т.е. текстура непрозрачна и в игре отражает сразу всё, что нежелательно).
Для этого можно применить Уровни, особенно если вы перед этим подкорректировали альфа-канал вручную. Откроем "Цвет"\"Уровни" и в качестве Канала выберем *"Альфа"*.
Перед нами возникнет гистограмма, показывающая количество пикселей каждого цвета, имеющихся в данном канале нашего изображения.
В моём случае, гистограмма уже являет собой единственную линию в левой части графика, т.к. альфа-канал равномерно заполнен почти чёрным цветом.
Если вы что-то настраивали вручную, вы можете столкнуться с куда более интересной картинкой. В любом случае, рекомендуется сжать уровни в диапазон 0-40.
Обратим внимание на бегунки, расположенные под надписью "Уровни на выходе". Они определяют диапазон, который будет получен после нажатия кнопки ОК. Трогать сами бегунки не надо - достаточно ввести 40 в поле под правым бегунком (по умолчанию там 255).
Теперь нажмите ОК. Изображение должно стать почти невидимым.
Пришло время сохранить его в формате dds (так же, как и normal map ранее) и отправиться, наконец, в редактор StarCraft 2.

Импорт

Чтобы не изменять существующие ресурсы, мы создадим новый тайлсет как копию какого-нибудь уже имеющегося, и уже туда поместим нашу текстуру.
Но сначала необходимо импортировать файлы в карту.
Для этого следует открыть менеджер импорта (по умолчанию f9), кликнуть правой кнопкой мыши по пустому полю в окне менеджера и выбрать "Import Files...".
При помощи крайне неудобного встроенного браузера нужно найти оба файла dds, отметить их галками (по умолчанию отмечено сразу всё), и нажать Ок.
Обратите внимание, что имена добавленных файлов выделены зелёным цветом. Это означает, что они были только что импортированы и ещё не сохранены в файле карты.
Такие файлы не могут быть корректно использованы редактором!
Чтобы исправить ситуацию, достаточно сохранить карту.
Теперь откроем менеджер данных (f7).
В верхнем меню этого менеджера выберем "Data"\"Edit terrain data"\"Terrain textures".
В левой части окна должен открыться список всех текстур поверхностей, имеющихся в игре.
Найдём, например, "Bel'Shir Bricks Large" и создадим его копию (правый клик по строке с объектом\"Duplicate terrain texture...", ОК в появившемся окне).
Можно дважды кликнуть по новой строке (она будет выделена) и ввести что-нибудь оригинальное в поле Name. Я ограничился "Bel'Shir Bricks Large 2".
Обратим наше внимание на правую часть окна менеджера.
Нас интересуют поля Normal Map и Texture.
Дважды кликнув по значению поля, мы увидим странно оформленный предпросмотрщик и кнопку Browse... в его правом верхнем углу.
Нажав на эту кнопку, следует найти нужную текстуру и нажать ОК.
Пришло время перейти к редактированию тайлсета.
Для этого выберем в меню менеджера "Data"\"Edit terrain data"\"Terrain texture sets".
Выберем в списке слева "Bel'Shir (Jungle)" и создадим его копию (точно так же, как с текстурой).
Теперь нужно найти в правой части окна поле "Textures - Blend +"
и дважды кликнуть на его значение.
Появится интересное окно с двумя наборами текстур и целым рядом кнопок, позволяющих по-разному манипулировать текстурами правого набора. Слева отображаются все текстуры поверхностей, доступные редактору, справа - используемые в данном тайлсете.
Обратите внимание, что в одном тайлсете может быть не более 8 текстур.
Выделим в списке слева нашу новую текстуру, а в списке справа - её оригинал и нажмём кнопку Replace, затем ОК.
Чтобы новую текстуру поверхности можно было применить в редакторе, созданный нами тайлсет необходимо активировать.
Для этого следует зайти в меню "Map"\"Map textures" и в открывшемся окне выбрать "Bel'Shir 2 (Jungle)" в качестве New Texture Set, после чего нажать Modify, затем ОК.
С виду ничего феерического не произошло, несмотря на параноидальное предупреждение редактора о необратимых изменениях.
Однако откроем палитру текстур (по умолчанию Т) в редакторе поверхности (f5) и выберем последнюю текстуру в списке.
О чудо! она называется "Bel'Shir Bricks Large 2" и выглядит подозрительно похожей на нашу.
Впрочем нужно отметить, что в редакторе текстуры отображаются не слишком корректно, так что я разместил несколько источников света и запустил проверку карты.
Получилось так себе! Текстура, похоже, слишком крупная, неверно выбран альфа-канал, тайлинг хромает.
Тем не менее, свет корректно отражается от камней и их граней, что свидетельствует о в целом верной работе Normal map!
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
21
12 лет назад
2
Ничего себе мостовая!
2
15
12 лет назад
2
Норм статья, была идея написать похожею, да как обычно нету времени для этого. Надеюсь след статья, если планируется, будет о чем-то более сложном и интересном, так как в этой нечего не узнал нового...
2
22
12 лет назад
2
Пацаны ваще ребята, молодцы что написали )
2
31
12 лет назад
Отредактирован WebSter
2
Интересная техника, все довольно неплохо объяснено, и наконец-таки правильные настройки текстур. Автор молодец, а переводчики не только прекрасно справились, но и хорошо изменили статью, использовав свой пример, более наглядный. Видно, что тема было пропущена через себя, отличная работа =)
Хотя в теоритической части довольно мутновато описано про Bump Mapping. Особенно это:
свет на поверхности с Bump Mapping'ом всегда будет отражаться в одном направлении.
Глупость какая-то, или движок стара просто криво работает с бампом на основе карты высот. По определению такой бамп маппинг совершеннее карт нормлей, но в случае стара тут все как-то необычно. Даже нормалки для тех же юнитов оранжевые, а для тайлов - черно-белые, об использовании альфа-канала для бампа я вообще молчу. Этот момент в статье не раскрыт, так что надо изучать глубже.
2
30
12 лет назад
2
напишите для юнитов
и как импортировать тоже
0
31
12 лет назад
0
По импорту я скоро напишу, а для юнитов могут быть разные способы в зависимости от того, где моделишь)
2
30
12 лет назад
2
так а причем тут моделишь?
мне надо только текстуры )
я скорее их буду делать сначала, а потом займусь моделированием... для меня это еще сложно, да и контента мало
3
31
12 лет назад
3
Прикол в том, что карты нормалей снимаются с высокополигональных моделей через такие программы, как ZBrush, xNormals или Topogun и т.п. Можно, конечно, воспользоваться плагином от нвидии и тем, что представлено здесь, для создания карты нормалей через карту высот - текстуру, по которой рельефность определяется основываясь на яркости пикселей (от черного до белого).
2
30
12 лет назад
2
а допустим если модель уже готовая...
нужно через збраш рисовать карту нормалей? это имхо бред =\
лучше уже дешевым способом делать... или вообще не делать... мне вообще не особо нра реализация бампа в ск2, кривовато по моему смотрится
2
15
12 лет назад
2
Глупости карты нормалей рисовать... c хайполки снимать надо в браше)) в ск2 вполне норм нормали(бамп), глянь качество портретов, это теже модели с нормалями и прочими плюшками просто более хайпольные чем обычные юниты.
Есть в бездне статья для нормалей с колора... есть ещё кстати не плохой способ в фш можно в ручную сделать, результат не плохой.
2
30
12 лет назад
2
Xin:
Глупости карты нормалей рисовать... c хайполки снимать надо в браше)) в ск2 вполне норм нормали(бамп), глянь качество портретов, это теже модели с нормалями и прочими плюшками просто более хайпольные чем обычные юниты.
Есть в бездне статья для нормалей с колора... есть ещё кстати не плохой способ в фш можно в ручную сделать, результат не плохой.
вручную очень долго возиться надо
я например про марина говорю... текстура там не лучшего качества... сильно квадратит блики и т.д. ну мне намного больше нра без карт этих... хотя хз
если покажете норм через эту прогу карту нормалей на юните, то убедите меня... у меня из-за всего этого текстура простаивает =(
2
15
12 лет назад
2
Tiodor:
вручную очень долго возиться надо
я например про марина говорю... текстура там не лучшего качества... сильно квадратит блики и т.д. ну мне намного больше нра без карт этих... хотя хз
если покажете норм через эту прогу карту нормалей на юните, то убедите меня... у меня из-за всего этого текстура простаивает =(
Ну попробуй сделать по этому гайду текстуру для юнита, есть вся информация на сайте как в максе натянуть текстуру нормали и диффузы. Если думаешь что в ск2 нельзя сделать ок графу напиши в ПМ, я тебе скину пару скринов...
2
31
12 лет назад
2
Tiodor:
я например про марина говорю... текстура там не лучшего качества... сильно квадратит блики и т.д. ну мне намного больше нра без карт этих...
Не, ну ты, конечно, нашел пример) Марин в старике один из самых мелких юнитов, ты с игровой камеры не разглядишь и половины изображенных деталей)
2
30
12 лет назад
2
Xin:
есть вся информация на сайте как в максе натянуть текстуру нормали и диффузы.
почему меня никто не слушает =(
у меня модель стандартная
WebSter:
я например про марина говорю... текстура там не лучшего качества... сильно квадратит блики и т.д. ну мне намного больше нра без карт этих...
Не, ну ты, конечно, нашел пример) Марин в старике один из самых мелких юнитов, ты с игровой камеры не разглядишь и половины изображенных деталей)
ну будь моя воля я бы все модели мелкими сделал, и менее хайпольными...
чтобы бои были масштабными и кровавыми!
2
15
12 лет назад
2
Да поглядите на портреты в ск2, они очень реалистичны, такую же графику можно сделать и в ск2 для всех юнитов, это одно и то же что в варике есть портреты куда качественнее моделей, то есть близы не выжили движок по макс, а наоборот сделали минимум.
2
17
12 лет назад
Отредактирован DragonSpirit
2
последний скриншот хорош
2
30
12 лет назад
2
я верю, но будет ли в этом толк?
2
31
12 лет назад
2
Опять таки все зависит от модели. Если деталей мало и/или они незначительны, то толку будет мало.
Этот комментарий удален
Чтобы оставить комментарий, пожалуйста, войдите на сайт.