Исправление текстур Dota 2 в SFM
Все помнят статью про добавление моделей Доты в Source FilmMaker, но некоторые модели были нечеткими и на них был странный блеск. Так вот есть решение этой проблемы и хотим представить это решение вам.
Все помнят статью про добавление моделей Доты в Source FilmMaker, но некоторые модели были нечеткими и на них был странный блеск. Так вот есть решение этой проблемы и хотим представить это решение вам.
После быстрого поиска в Google вы думаете что ответ таков "Все, что вам нужно сделать, это изменить в верхней строке VMF от CustomHero и GlobalLitSimple с VertexLitGeneric". После этого вы загружаете модели и видите что некоторые модели все равно не работают.
Минимум что Вам потребуется:
- Любая программа для редактирования VMF (например VTFEdit или даже блокнот).
- Все на своем месте.
Как и большинство других учебников мое первое предложение (конечно после того, как Вы все извлекли и все в рабочем состоянии находится в SFM, т.к. здесь это не будет затрагиваться) первое, что мы должны сделать, это изменить модели шейдеров от CustomHero до VertexLitGeneric.
Файлы материалов Valve скорее всего находятся в:
C:\ProgramFiles(x86)\Steam\steamapps\common\SourceFilmmaker\game\ usermod\materials\Models\heroes\*hero name*
Мы должны также изменить $normalmap на $bumpmap, таким образом карты будут с поддержкой шейдеров в vertexlitgeneric.
Это - основание того, на что должны быть похожи герои, если Вы собираетесь использовать их.
Улучшения
Имейте в виду, эта часть необязательна, но рекомендуется, поскольку модели выглядят гораздо лучше.
Что вам понадобится:
- Vtfeditor.
- Программа для редактирования изображения, которая может работать с альфа (для этой статьи я использовал PhotoShop cs6).
- Разумное кол-во свободного времени.
Обычно, этот процесс занимает немного времени

customhero > vertexlitgeneric > highres > vmfparameters
Оказывается Valve довольно нерешительны в том как должен смотреться герой, неудивительно, hl2e3 никогда не вернется
В этом шаге можно использовать VTF, которые уже есть в Dota 2, но рекомендуется использовать версии высокого качества.(Если Вы используете те которые есть, то пропускайте этот пункт)
Для начала выберите героев, которых будете использовать. Если вы одновременно используете большое количество героев, то сделайте этот шаг после анимации или переключите текстуры по умолчанию, для лучшего FPS и меньшей нагрузки на память.
Скачайте модели для героя(ев) с помощью dota2.com (откроется в новой вкладке).
Поместите где угодно и извлеките папку materialsrc. В этой папке вы найдете очень хорошие TGA файлы. Выделите все файлы -> правая кнопка мыши -> свойства. Отключить "только чтение".
Image not found
Вы можете игнорировать модель, сделанную после загрузки, поскольку мы не будем ее использовать.
Они действительно делают большие изменения. Я не знаю почему люди не пользуются ими.

Время сделать некоторую сортировку. В частности на каждой mask2 и normal map и, возможно, на нескольких оставшихся mask1 и растровых изображениях.
Запустите вашу программу редактирования изображений и откройте пару mask2 и normalmap в той же группе. Mask 2, обычно, будет выглядеть как полный беспорядок, а normalmap будет выглядеть совершенно нормально.
Выберите вкладку "каналы" (channels) и отсортируйте изображения ранее существовавшего канала (не сам канал) в следующем порядке:
-mask2 red в normal alpha (если alpha не существует - создайте)
-mask2 alpha в mask2 red
-mask2 green в mask2 alpha
-mask2 blue инвертировать и переместить в mask2 green
Конечный результат должен быть похож на это, цвета отличаются от героя.
Image not found
Следующий шаг, так же дополнительный
Мы можем поиграть с mask1, если там что то есть.
- Red - "детали" маски, нужно это или нет, решать вам. В некоторых случаях это выглядит хорошо, а в других плохо. Главная задача - анимировать маску в нужных частях героя.
- Green - не трогать. Мы ничего не можем сделать, чтобы заставить его работать.
- Blue - "металлическая" маска, есть несколько вещей которые мы можем сделать, чисто для ваших личных предпочтений.
- Alpha - маска selfillum, selfillum контролирует то что вы получите. Я заметил, что этот слой может иметь много деталей и может потребовать некоторой очистки, если его использовать.
Теперь эта маска может испортить ваш день, если вы попытаетесь идеально воссоздать затенения которые Вы видите в Dota 2, опираясь на исходники alienswarm. На данный момент это невозможно.
Для начала, green не может изменить fresnel warps; даже если он поддерживает fresnel warps. Он поддерживает phong warps, но Вы будете редко его использовать. Однако мы можем использовать его как хотим, если он нам нужен. Мы можем пропустить Blue канал, чтобы не возиться с phong и растровыми свойствами, если вы хотите, то можете попробовать.
Затем красный. Если во время затемнения текстур программа предложит вам преобразовать их в selfillum текстуры (это я сделал с OD, но покажу позднее), но красный цвет может выглядеть очень плохо, поэтому просто проигнорируйте это предложение.(Заметка: вы можете найти рандомные косяки в базовой альфа текстуре. Забейте на них)
Но если вы захотите использовать что либо из этого слоя вы запросто можете это сделать и все зависит только от вас. Смешивая красный, selfillum, и растровый каналы может дать неплохой результат, поэтому не стесняйтесь экспериментировать.
Затем мы проделаем обычную вещь, а именно добавим синий канал в базовую альфа текстуру. Не всегда, но в большинстве случаев Вам придется это делать.
Синяя маска слоя может быть использована, чтобы затемнить базовую текстуру если ее инвертировать и наложить размножением (с прозрачностью около 40 - 50 %).
Вернемся к базовой альфа текстуре, в основном потому что нам нужно добавть envmaps. Просто добавьте envmaps для нескольких героев, а к другим нет. Полученные результаты сравните и решите для себя как лучше. Металический слой хорошо подходит для наложения маски. Я лично удалил их с тела наги несмотря на их присутствие в vmf. Выглядело не очень. Однако вы всегда можете их использовать или удалить.
Возможно вы не обратите внимания, но эти изменения можно заметить на броне наги.
Но прежде чем вы добавите что либо в базовую альфа текстуру вы должны обратить внимания на одну вещь. Если на ней есть что либо, что не является uv map или случайным изображением оно должно быть прозрачным. Тогда мы не обращая на это внимания просто сконвертируем исходную mask1 в envmap маску. Все что нам остается сделать это перенести синий канал (или selfillum, если нет синего) из исходного изображения в mask1. Окончательный результат должен быть черно белым с selfillum маской в альфа слое.
Если в исходном действии у вас envmap и selfillum маска с базовой альфа текстурой добавьте любую, которую хотите или сделайте предыдущий шаг. Единственной что остается это решить куда деть vmf параметры.
Теперь вам придется конвертировать все измененные tga в vtf!
Небольшое предупреждение. Текстуры Valve имеют то же название, что и их загружаемые братья в большинстве случаев. Было бы неплохо проверить все файлы, которые вы скачали на совпадение с игровыми. Все что нужно сделать это изменить название.
Теперь откройте VTFEditor (или экспортируйте их как vtf) затем импортируйте и сохраните каждый файл, который вы поменяли кроме mask1 (но не всегда) и сохраните их с текущим названием без тэга tga. Вам придется над этим посидеть. После полностью оконченной работы в идеале нужно вернуть tga тэги.
Прежде чем мы сделаем копию нового vtm нужно переместить vtf в другую директорию до того как мы добавим более качественные. Я дождался пока видео было готово к рендерингу. Если вы пользуетесь Garrysmod вам нужно заменить дефолтные.
Если вы пользуетесь filmmaker, то должны запустить skd и открыть model viewer, чтобы отследить следующие изменения, которые мы будем делать. Однако некоторые части вы все таки не будете видеть, но вы можете отследить их мерцанием в момент отключение и включения выпуклостей.
Есть загруженный рабочий вариант? Хорошо. Пришло время для материалов Valve.
Сейчас мы перейдем к самой нудной части нашей работы, но она необходима. Эта часть самая обильная, поэтому в ней и будет заключаться вся наша работа. Процесс работы со специфическими героями я выложу позднее. Будут вопросы задавайте.
Я только замечу, что здесь нет цветного освещения, поэтому мы это просто игнорируем.
Для примера я сделал crystal_maiden.vmf., вот так выглядит дефолт
CustomHero
{
$baseTexture "models\heroes\crystal_maiden\crystal_maiden_color "
$normalmap "models\heroes\crystal_maiden\crystal_maiden_norma l"
$maskmap1 "models/heroes/crystal_maiden/crystal_maiden_masks1"
$maskmap2 "models/heroes/crystal_maiden/crystal_maiden_masks2"
$SPECULAREXPONENT 35
$SPECULARSCALE 2
$SPECULARCOLOR "[1 2 3]"
$RIMLIGHTSCALE 1
$RIMLIGHTCOLOR "[1 1 1]"
$cloakPassEnabled 1
Proxies
{
invis_proxy
{
}
status_proxy
{
}
}
}
{
$baseTexture "models\heroes\crystal_maiden\crystal_maiden_color "
$normalmap "models\heroes\crystal_maiden\crystal_maiden_norma l"
$maskmap1 "models/heroes/crystal_maiden/crystal_maiden_masks1"
$maskmap2 "models/heroes/crystal_maiden/crystal_maiden_masks2"
$SPECULAREXPONENT 35
$SPECULARSCALE 2
$SPECULARCOLOR "[1 2 3]"
$RIMLIGHTSCALE 1
$RIMLIGHTCOLOR "[1 1 1]"
$cloakPassEnabled 1
Proxies
{
invis_proxy
{
}
status_proxy
{
}
}
}
До того как мы разобьем все на части нужно удалить пару вещей, а именно:
-mask1 возможно
-envmaps
-mask2, всегда mask2
-rimlighing
-specularcolor
-diffusewarp
-overlays любые
возможно -fresnelwarp
Для CM мне не нужна mask1 и я ее удалил. Также мне не понадобились envmap и ее я тоже удалил. Я только добавил чистый envmap позже. Mask2 былаFor crystal maiden i didn't need a mask1 so it is removed. There is also no envmap so that too was removed. I did add just a plain envmap later though. Mask2 была сделана экспоненциальной маской (поэтому мы изменили все слои вокруг) и должна использоваться всегда из-за затемняющего эффекта. Rimlighting для CM выглядел неплохо. Я немного поднял нижнюю границу, чтобы было больше пространства для освещения, но вам этого делать не нужно. Я добавил особенный цвет как затемняющий, но он практически ничего не меняет из-за эффекта mask2. Эта часть CM не имеет основы, поэтому я ничего не добавил. Никаких перекрытий я не накладывал. Она выглядит лучше без них. Я никогда не добавлял frensewarp, потому что ранее я понял, что в Dota 2 на модель она не оказывает эффекта. f
После этого vmf файл выглядел так
"VertexLitGeneric"
{
"$baseTexture" "models\heroes\crystal_maiden\crystal_maiden_color "
"$bumpmap" "models\heroes\crystal_maiden\crystal_maiden_norma l"
"$PhongAlbedoTint" "1" (for basecolour tinting)
"$phongexponenttexture" "models/heroes/crystal_maiden/crystal_maiden_masks2"
"$rimmask" "1" (this and exponent cannot work together, chose one)
"$rimlight" "1"
// "$rimlightexponent" "4"
"$rimlightboost" "1"
"$phong" "1"
// "$phongexponent" "5" (much like rimmask cannot work together with exponentmask. if both are used this value wins)
"$phongboost" "1"
"$phongtint" "[1 2 3]"
{
"$baseTexture" "models\heroes\crystal_maiden\crystal_maiden_color "
"$bumpmap" "models\heroes\crystal_maiden\crystal_maiden_norma l"
"$PhongAlbedoTint" "1" (for basecolour tinting)
"$phongexponenttexture" "models/heroes/crystal_maiden/crystal_maiden_masks2"
"$rimmask" "1" (this and exponent cannot work together, chose one)
"$rimlight" "1"
// "$rimlightexponent" "4"
"$rimlightboost" "1"
"$phong" "1"
// "$phongexponent" "5" (much like rimmask cannot work together with exponentmask. if both are used this value wins)
"$phongboost" "1"
"$phongtint" "[1 2 3]"
"VertexLitGeneric"
{
"$baseTexture" "models\heroes\crystal_maiden\crystal_maiden_color "
"$bumpmap" "models\heroes\crystal_maiden\crystal_maiden_norma l"
"$halflambert" "0"
"$phongfresnelranges" "[0.005 0 0]"
"$PhongAlbedoTint" "1"
"$phongexponenttexture" "models/heroes/crystal_maiden/crystal_maiden_masks2"
"$envmap" "env_cubemap"
// "$envmaptint" "[1 1 0.6]"
"$envmaptint" "[.4 .4 .4]"
"$basealphaenvmapmask" "1"
"$rimmask" "1"
"$rimlight" "1"
// "$rimlightexponent" "4"
"$rimlightboost" "1"
"$phong" "1"
// "$phongexponent" "5"
"$phongboost" "10"
"$phongtint" "[1 2 3]"
{
"$baseTexture" "models\heroes\crystal_maiden\crystal_maiden_color "
"$bumpmap" "models\heroes\crystal_maiden\crystal_maiden_norma l"
"$halflambert" "0"
"$phongfresnelranges" "[0.005 0 0]"
"$PhongAlbedoTint" "1"
"$phongexponenttexture" "models/heroes/crystal_maiden/crystal_maiden_masks2"
"$envmap" "env_cubemap"
// "$envmaptint" "[1 1 0.6]"
"$envmaptint" "[.4 .4 .4]"
"$basealphaenvmapmask" "1"
"$rimmask" "1"
"$rimlight" "1"
// "$rimlightexponent" "4"
"$rimlightboost" "1"
"$phong" "1"
// "$phongexponent" "5"
"$phongboost" "10"
"$phongtint" "[1 2 3]"
Вот краткий список параметров, которые я использовал чаще всего:
$phongfresnelranges = я знаю для чего это, но не знаю как оно работает, поэтому я просто оставлю линкi https://developer.valvesoftware.com/...Fresnel_ranges
$PhongAlbedoTint = отенки растрового цвета на основе интенсивности зеленого канала на 1 пиксель
$envmaptint = если я использую envmap, то с помощью этой команды я могу задать ее интенсивность
$basealphaenvmapmask или $envmapmask = маска для envmap
$rimmask = использует альфа канал exponentmask, чтобы наложить маску освещения. иногда я пользуюсь ей, а иногда нет
$phongexponent = наложение маски красного канала
$selfillum или $selfillum_envmapmask_alpha = selfillum маска
$selfillummask = используйте эту команду если нужно наложить маску на уже имеющийся слой $selfillum
$selfIllumFresnel и $selfIllumFresnelMinMaxExp = настройка диапозона Френеля. как работает
$lightwarptexture = для наложения текстур освещения
$nocull = для крыльев или шапок
$halflambert = всегда ставлю на 0 по привычке
Если вы хотите использовать одну из этих команд, но я плохо объяснил вам воспользуйтесь google
$PhongAlbedoTint = отенки растрового цвета на основе интенсивности зеленого канала на 1 пиксель
$envmaptint = если я использую envmap, то с помощью этой команды я могу задать ее интенсивность
$basealphaenvmapmask или $envmapmask = маска для envmap
$rimmask = использует альфа канал exponentmask, чтобы наложить маску освещения. иногда я пользуюсь ей, а иногда нет
$phongexponent = наложение маски красного канала
$selfillum или $selfillum_envmapmask_alpha = selfillum маска
$selfillummask = используйте эту команду если нужно наложить маску на уже имеющийся слой $selfillum
$selfIllumFresnel и $selfIllumFresnelMinMaxExp = настройка диапозона Френеля. как работает
$lightwarptexture = для наложения текстур освещения
$nocull = для крыльев или шапок
$halflambert = всегда ставлю на 0 по привычке
Если вы хотите использовать одну из этих команд, но я плохо объяснил вам воспользуйтесь google
Обработка:
Советы
*незаконченная часть, но доделаю со временем*
Эта часть будет обновляться если я буду находить что-то интересное в каком либо герое.
Начнем с outworld destroyer (или obsidian destroyer потому что имена загружаемых файлов у него такие)
Это наглядное сравнение "до и после"
Окончательный вариант:
Вот вам видео с результатом
"VertexLitGeneric"
{
"$baseTexture" "models/heroes/obsidian_destroyer/obsidian_body_color"
"$bumpmap" "models/heroes/obsidian_destroyer/obsidian_body_normal"
"$halflambert" "0"
// "$phongfresnelranges" "[0 0.25 0]"
"$PhongAlbedoTint" "1"
"$phongexponenttexture" "models/heroes/obsidian_destroyer/obsidian_body_masks2"
// "$lightWarpTexture" "models/heroes/obsidian_destroyer/obsidian_destroyer_fresnelranges"
"$selfillum" "1"
"$selfIllumFresnel" "1"
"$selfIllumFresnelMinMaxExp" "[1 2.5 0]"
"$selfillumtint" "[0 1.11 0.78]"
"$BasemapAlphaPhongMask" "0"
"$phong" "1"
// "$phongexponent" "1.5"
"$phongboost" "10"
"Proxies"
{
Sine
{
"resultVar" "$selfillumtint"
"sineperiod" 2
"sinemin" .3
"sinemax" 1
}
}
}
{
"$baseTexture" "models/heroes/obsidian_destroyer/obsidian_body_color"
"$bumpmap" "models/heroes/obsidian_destroyer/obsidian_body_normal"
"$halflambert" "0"
// "$phongfresnelranges" "[0 0.25 0]"
"$PhongAlbedoTint" "1"
"$phongexponenttexture" "models/heroes/obsidian_destroyer/obsidian_body_masks2"
// "$lightWarpTexture" "models/heroes/obsidian_destroyer/obsidian_destroyer_fresnelranges"
"$selfillum" "1"
"$selfIllumFresnel" "1"
"$selfIllumFresnelMinMaxExp" "[1 2.5 0]"
"$selfillumtint" "[0 1.11 0.78]"
"$BasemapAlphaPhongMask" "0"
"$phong" "1"
// "$phongexponent" "1.5"
"$phongboost" "10"
"Proxies"
{
Sine
{
"resultVar" "$selfillumtint"
"sineperiod" 2
"sinemin" .3
"sinemax" 1
}
}
}
Я остался доволен результатом и приступил к Naga Siren
*Продолжение следует*
Источник: Facepunch
Перевод: 25VAMPIR17 и fallenphantom
Так же спасибо GaGaCha, за то что поделился ссылкой.
Источник: Dotavideo.ru
Комментарии