Все о формате VMT

Материал из Наша Wiki - Наша энциклопедия Half-Life
Перейти к: навигация, поиск


В статье Создание текстур и материалов под Source мы сделали простейший файл материала wall.vmt; разберем его содержимое:

LightmappedGeneric          Шейдер
{                           {
"$baseTexture" "wall"       "$Параметр" "значение параметра"
"$surfaceprop" "concrete"   "$Параметр" "значение параметра"
}                           }

Что такое файл материала? Это текстовый файл c расширением .vmt; его содержимое начинаеться с названия используемого шейдера, далее в в фигурных скобках идут параметры (их может быть несколько десятков); имя vtf-текстуры являеться всего лишь одним из параметров. Вы можете указать имя и путь к любой текстуре, в том числе и находящейся в GCF-файле вашей игры. Точно также можно подключить любую карту нормалей или отражений к вашей текстуре - т.е. файл материала может быть очень гибким и удобным инструментом, позволяющим скомбинировать что угодно с чем угодно. В списке текстур хаммера отображаеться имя файла материала vmt, а не имя подключенных в нем текстур.

Разберем по порядку шейдеры, параметры и дополнительные опции и фичи.

Шейдеры

Шейдер - это программа рендеринга текстуры. Вписав имя нужного шейдера в файл материала мы определим как текстура будет обрабатываться Source и рендериться в игре, какие параметры будут доступны. Для каждой задачи есть оптимальный шейдер - выбирайте какой вам нужен из списка:

LightmappedGeneric.jpg
LightmappedGeneric - "С наложением карты освещения; базовый тип". Предназначен для текстур, накладываемых на браши/дисплейсмент (на 3D-моделях не работает). На текстуре будет реалистичное освещение, тени. Почти все браши, которые вы видели в Half-Life2, используют этот шейдер.
VertexLitGeneric.jpg
VertexLitGeneric - "Вертексное освещение; базовый тип". Предназначен исключительно для текстур, используемых на 3D-моделях. Отсутствуют собственные тени (модель не может отбрасывать тень на саму себя), рассчет освещенности/затенения такой текстуры выполняется по упрощенным алгоритмам. Почти все модели, которые вы видели в Half-life2 используют этот шедер. Если наложить текстуру с таким шейдером на браш - в игре яркость текстуры будет меняться от черной до белой, т.е. будет некрасивый глюк.
UnLitGeneric.jpg
UnLitGeneric - "Без освещения; базовый тип". Текстуры с этим шейдером игнорируют освещение (никакого изменения яркости и без теней - как нарисуете текстуру в фотошопе, так она и будет выглядеть в игре; карты нормалей также с этим шейдером не работают). Используется в "неоновых" текстурах, лампах и текстурах неба (skybox); работает как на 3D-моделям(требуется параметр "$model" 1 в vmt) так и на брашах/дисплейсменте.
WorldVertexTransition.jpg
WorldVertexTransition - "Управляемое смешивание двух текстур". Этот шейдер предназначен для смешивания двух текстур на дисплейсменте в hammer. С помощью Paint alpha tool вы можете кистью стирать верхнюю текстуру в нужных местах - под ней будет видна нижняя текстура. Таким образом делается плавный переход от одной текстуры к другой (от земли к листьям например). Работает только на дисплейсментах; хотя в общем то работает и на брашах - но в консоли пишется о скором отключении этой возможности в движке Source.
Water.jpg
Water - "Вода". Этот шейдер предназначен для текстуры воды - соответственно может быть использован только тем же образом и с теми же тонкостями, как и штатные текстуры воды. Имеет большой набор параметров; работает только на брашах в hammer (см. статью Создание воды).
Refract.jpg
Refract - "Преломление". Этот шейдер предназначен для создания прозрачных преломляющих текстур типа рельефного стекла или витража. Имеет большой набор параметров. Работает и на брашах(требуется превратить браш в ентитю func_brush) и на моделях.

Полный список шейдеров (на англ.) c официального сайта по SSDK. Если вы можете описать какой-нибудь из них и привести картинку-пример - это будет хорошим делом, т.к. вышеописанные шейдеры - это все что я знаю :D.

Параметры

Параметры - определяют какую текстуру использовать и какие эффекты на неё накладывать; "файл материала" потому так и называеться, что в нем с помощью параметров мы воссоздаем реальный материал, подключая по мере надобности различные эффекты (отражения, прозрачность, изменения цвета, анимацию и т.п), текстурные карты и задаем численными значениями силу их действия.

"$basetexture" "путь/имя_текстуры" - подключает указанную vtf-текстуру. Путь всегда указываеться относительно папки "materials"; по этому если текстура просто лежит в папке "materials" - достаточно вписать имя текстуры, в нашем примере "$basetexture" "wall"(расширение ".vtf" указывать не надо). Однако если мы положим vtf-текстуру в какую-нибудь подпапку (например в "my_textures"), нужно будет указать путь к ней - "$basetexture" "my_textures/wall". Если вы хотите подключить какую-нибудь текстуру, лежащую внутри gcf-файлов - укажите путь к ней относительно папки "materials" внутри gcf, например "$basetexture" "Wood/cabinets01a". Главное помните, что если вы делаете карту под half-life2 - вам доступно содержимое gcf-файлов только от HL2. Пробелы и русские символы в именах файлов и папок не допустимы; если вы неправильно укажете путь/имя текстуры - в игре вы увидите фиолетовую "шашечную" текстуру-заплатку.
"$basetexture2" "путь/имя_текстуры" - подключает вторую указанную vtf-текстуру. Этот параметр нужен только для шейдеров, использующих две текстуры (как вышеописанный WorldVertexTransition).
"$surfaceprop" "материал" - задаем материал, который ближе всего подходит к нашей текстуре. Впишем "metal"(металл) - и браш с такой текстурой будет давать искры при попадании в него пули, звук хотьбы по такому брашу будет соответственно "металлический", пули будут плохо пробивать даже при малой толщине, оставляя характерные вмятины, в помещении из такой текстуры будет "металлическое" эхо, сила трения будет средняя и т.д.; впишем "glass"(стекло) - и вместо вмятин от пуль будут характерные трещины, звук хотьбы по такому брашу будет "стеклянным", пули будут пробивать его значительно лучше, эхо другое, сила трения другая и т.д. Список поддерживаемых Source материалов:
  • Бетон, камни, скалы: Baserock Boulder Brick Concrete Concrete_block Gravel Rock
  • Жидкости: slime water wade
  • Металлы: canister chain chainlink combine_metal crowbar floating_metal_barrel grenade gunship metal metal_barrel metal_bouncy Metal_Box metal_seafloorcar metalgrate metalpanel metalvent metalvehicle paintcan popcan roller slipperymetal solidmetal strider weapon
  • Разное: brakingrubbertire cardboard carpet ceiling_tile combine_glass computer default default_silent floatingstandable glass glassbottle item jeeptire ladder no_decal paper papercup plaster plastic_barrel plastic_barrel_buoyant Plastic_Box plastic player player_control_clip pottery rubber rubbertire slidingrubbertire slidingrubbertire_front slidingrubbertire_rear
  • Органика: alienflesh antlion armorflesh bloodyflesh flesh foliage watermelon zombieflesh
  • Снег, лед: snow ice
  • Земля, трава, грязь: antlionsand dirt grass gravel mud quicksand sand slipperyslime tile
  • Древесина, ящики: wood Wood_Box Wood_Crate Wood_Furniture Wood_lowdensity Wood_Plank Wood_Panel Wood_Solid

Если не указывать в файле материала параметр "$surfaceprop" "материал" то Source автоматически задаст этой текстуре свойства материала "default"(рус. "по умолчанию"). Если вы делаете свой мод, вы можете сами создавать дополнительные материалы и назначать им свойства и звуки - см. файлы scripts/surfaceproperties.txt, scripts/surfaceproperties_hl2.txt и scripts/surfaceproperties_manifest.txt (в этих же файлах можно посмотреть полный список свойств каждого материала).

  • "$envmap" "env_cubemap"
  • "$envmaptint" "[.число .число .число]"
  • "$envmapmask" "путь/имя_карты_отражений"
  • "$basealphaenvmapmask" "1"
  • "$normalmapalphaenvmapmask" "1"
  • "$envmapcontrast" "число"
  • "$envmapsaturation" "число"
  • "$envmapmaskframe" "номер_кадра"
  • "$envmap" "путь/имя_текстуры_отражения"

Группа параметров, подключающих и настраивающих отражения (блеск, зеркальность) на вашей текстуре. Подробно описаны в статье Отражения (env cubemap).

  • "$alpha" ".число"
  • "$translucent" "1"
  • "$alphatest" "1"
  • "$translucent_material" "путь/имя_материала"
  • "$additive" "1"
Группа параметров, тем или иным способом делающих текстуру прозрачной. Подробно описаны в статье Прозрачные текстуры. Альфа-канал.

  • "$selfillum" "1"
  • "$selfillumtint" "нет_данных"
  • "$hasselfillum" "1"
Группа параметров, включающих излучение света этой текстурой. Подробно описаны в статье Светящиеся текстуры
"$bumpmap" "путь/имя_карты_нормалей" - Подключает карту нормалей для создания рельефа на текстуре.
"$bumpmap2" "путь/имя_карты_нормалей" - Подключает вторую карту нормалей; Этот параметр нужен только для шейдеров, использующих две текстуры (как вышеописанный WorldVertexTransition) - вторая карта нормалей наложиться на вторую текстуру.
"$color" "[.число .число .число]" - Изменяет цветность и яркость текстуры - эти три числа управляют RGB. Например впишите "[.2 .2 .2]" - и текстура будет всего 20% яркости (R=0.2 G=0.2 B=0.2). Впишите "[1 0 0]" - и текстура станет красного цвета (R=1 G=0 B=0). Этот параметр пригодиться в том случае, если сама текстура находиться в gcf-файле (просто создайте к ней vmt-файл и измените в нем цвет этой текстуры - вуаля, готова "новая" текстура). Персонально я использую этот метод для экономии веса карты под CSS - зеленую текстуру радара можно сделать с помощью этого параметра из нормальной текстуры радара :) - прописав "$color" "[.4 1 .4]" в втором vmt-файле вместо того, чтобы в фотошопе делать еще одну текстуру зеленого цвета.
"$detail" "путь/имя_текстуры" - накладывает детальную текстуру (микрорельеф). Подробнее см. статью Детальные текстуры (detail textures).
"$detailscale" 5 - задает количество повторений детальной текстуры на одно повторение основной текстуры.
"$nocull" "1" - текстуры с таким параметром рендеряться с обоих сторон полигона. Используеться для листвы деревьев или крошащихся стекол.
"$decal" "1" - указывает на то, что данная текстура будет декалью.
"$decalscale" "число" - размер декали в игре. Т.к. декали (в отличие от оверлеев) не могут быть масштабируемы в hammer - размер декали как раз и задаеться этим параметром. В качестве "числа" могут использоваться целые числа (1-2-3-10 и т.п.) и дробные (0.1, 0.25 и т.д.).
"$model" "1" - указывает на то, что данная текстура накладываеться на 3D-модель или брашевую модель (на func_brush к примеру).

  • "$bluramount" "число"
  • "$refractamount" ".число"
  • "$refracttinttexture" "путь/текстура"
  • "$dudvmap" "путь/имя_DUDV_карты"
  • "$refracttint" "{число число число}"

Группа параметров, специфичных для вышеописанного шейдера Refract. Подробно описаны в статье Преломляющие текстуры(refract).

  • "$abovewater" "1_или_0"
  • "$bottommaterial" "путь/материал"
  • "$dudvmap" "путь/имя_DUDV_карты"
  • "$fogcolor" "{число число число}"
  • "$fogenable" "1_или_0"
  • "$fogend" "(число_в_юнитах_хаммера)"
  • "$fogstart" "(число_в_юнитах_хаммера)"
  • "$forcecheap" "1_или_0"
  • "$forceexpensive" "1_или_0"
  • "$reflectamount" (float)
  • "$reflectentities" "1_или_0"
  • "$reflecttexture" "источник_отражений"
  • "$reflecttint" "{число число число}"
  • "$refractamount" "число"
  • "$refracttexture" "источник_преломлений"
  • "$refracttint" "{число число число}"

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

Здесь вы можете ознакомиться с полным списком всех доступных параметров (на англ.).

Proxies

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

На текущий момент известно, что proxies могут:

  • Анимировать многокадровую текстуру с указанной частотой кадров(основное их применение)
  • Вращать/скроллить обычную текстуру с указанной скоростью
  • Анимировать многокадровую текстуру normal map (например волны на воде в half-life 2 или преломляющие стекла с движущимся преломлением (комбринские блок-посты))
  • Менять скейл текстуры без перекомпиляции карты
  • Менять скейл normal map/specular map относительно текстуры, на которую они наложены
  • Менять прозрачность текстуры в зависимости от расстояния до игрока (!) - это вы видели в half-life2, энергетические барьеры сделанны именно так.
  • Анимировать многокадровую текстуру по команде от триггера (см. статью Переключающаяся текстура на браше (Toggle Texture))
  • Делать разбиваемую текстуру (крошашиеся стекла).

Прокси вращения текстуры:

LightmappedGeneric
{    
"$basetexture" "путь/имя_текстуры" 
"$myRotation" 10 //скорость вращения, градусов в секунду (?).
"Proxies" 
{ 
"Sine" 
{ 
"resultVar"    "$myRotation" 
"sineperiod"   20 
"sinemin"      -180 
"sinemax"      180 
} 
"TextureTransform" 
{ 
"rotateVar" "$myRotation" 
"resultVar" "$basetexturetransform" 
} 
} 
} 

Прокси изменения скейла карты отражений (specular map) относительно основной текстуры (т.е. повторение карты отражений n раз на один повтор основной текстуры):

LightmappedGeneric
{
"$basetexture" "путь/имя_текстуры"
"$envmap" "env_cubemap" 
"$envmapmask" "путь/имя_карты_отражений"
"$envmapmaskscale" "5" //количество повторений карты отражений
"Proxies"
{
"TextureTransform"
{
"scaleVar" "$envmapmaskscale"
"resultVar" "$EnvmapmaskTransform"
}
}
}

Прокси изменения скейла normal map относительно основной текстуры (т.е. повторение карты нормалей n раз на один повтор основной текстуры):

LightmappedGeneric
{
"$basetexture" "путь/имя_текстуры"
"$bumpmap" "путь/имя_карты_нормалей"
"$bumpscale" "4" //количество повторений карты нормалей
"Proxies"
{
"TextureTransform"
{
"scaleVar" "$bumpscale"
"resultVar" "$bumpTransform"
}
}

Служебные параметры

Служебные параметры - будучи добавленными в фаqл материала вашей текстуры обеспечивают дополнительные функции:

  • "%detailtype" "имя_группы_травы_из_файла_detail.vbsp" - этот параметр сделает спрайтовую траву на вашей текстуре (работает только на дисплейсментах, на обычных брашах трава не появиться). Подробнее вы можете узнать в статье Спрайтовая трава.
  • "%keywords" "ключевое_слово" - заданное "ключевое_слово" используеться для облегчения поиска в списке текстур Hammer-а; ключевых слов может быть несколько, указываються через запятую. Например у Valve все текстуры разложены по папкам с названиями материала текстур ("wood","rock","concrete" и т.п.) - а ключевые слова описывают, на какой карте/эпизоде они используються: "%keywords" "c17downtown,c17industrial" . Если не понятно - не важно, эти ключевые слова становяться полезными только при действительно большом обьеме текстур.
  • "%tooltexture" "путь/имя_изображения" - вы просто рисуете картинку-символ в фотошопе, сохраняете её в формат vtf и подключаете этим параметром в нужном файле/ах материалов - и в списке текстур Hammer-a видите её, а не изображение текстуры. Эта подключенная картинка видна ТОЛЬКО в списке текстур hammer-a, в игре/окне 3D-вида ваша текстура будет видна как обычно.
  • "%notooltexture" "1" - исключает текстуру из списка текстур в hammer.
  • "%compilepassbullets" 1 - указав этот параметр в файле материала вы сделаете его "прозрачным" для пуль в игре. По брашу, окрашенному такой текстурой можно ходить, от него отскакивают гранаты, он выглядит также как и обычный - но пули пролетают его насквозь без сопротивления и эффектов столкновения (искры и т.п.). Используеться в текстурах, накладываемых на кустарник или тонкие решетки заборов.
  • "%compileskip" 1 - сделать аналог текстуры toolsskip ; используеться также, как служебная текстура toolsskip.
  • "%compilesky" 1 - нет информации. Предположительно браш, окрашенный такой текстурой, будет рендериться также, как служебная текстура "toolssky".- т.е. размер текстуры на нем будет постоянным, вне зависимости от того, на сколько близко/далеко вы от этого браша.
  • "%compilenonsolid" 1 - браш, окрашенный такой текстурой, будет иллюзией (через него можно будет ходить, стрелять и т.д.).
  • "%compileclip" 1 - сделать аналог текстуры toolsclip ; в игре эта текстура не рендериться, но физбокс от неё остаеться - через неё не проходят пули и гранаты, игроки и NPC.
  • "%compilewater" 1 - этот параметр обязательно должен быть указан в файлах воды; по практическому применению нет информации, но предположительно - браш окрашенный такой текстурой будет работать также как и вода; т.е. снаружи будет выглядеть согласно главному файлу материала воды, а когда игрок зайдет в него ("погрузиться в воду") - будет запущен другой файл материала, указанный в главном файле материала. Законы физики в воде также другие, игрок может находиться там ограниченное время (иначе задохнеться) и т.д.
  • "%compilefog" 1- сделать аналог текстуры toolsfog ; по практическому применению нет информации.
  • "%compilehint" 1 - сделать аналог текстуры toolshint ; эта текстура будет использоваться для нарезки листьев видимости и не будет видна в игре.
  • "%compileladder" 1 - сделать аналог текстуры toolsladder ; эта текстура будет использоваться для создания лестниц и не будет видна в игре.
  • "%compilenodraw" 1 - сделать аналог текстуры toolsnodraw ; эта текстура будет использоваться для создания NODRAW-поверхностей, которые режут уровень на листья и обладают всеми свойсвами обычного браша, но не рендеряться - что повышает производительность.
  • "%compilenpcclip" 1 - сделать аналог текстуры toolsnpcclip; в игре браш, окрашенный такой текстурой, будет "стеной" с точки зрения NPC - для игрока же он будет невидим и не ощущаем.
  • "%compileorigin" 1 - сделать аналог текстуры toolsorigin ; в игре используеться также как и служебная текстура toolsorigin.
  • "%compileplayercontrolclip" 1 - сделать аналог текстуры toolsplayercontrolclip; в игре используеться также как и служебная текстура toolsplayercontrolclip.
  • "%compiletrigger" 1 - сделать аналог текстуры toolstrigger; в игре используеться также как и служебная текстура toolstrigger.
  • "%compiledetail" 1 - нет информации (func_detail!?).
  • "%compilewet" 1 - нет информации.

Сдесь вы можете найти более подробное описание tool textures (на англ). Приветствуеться любая проверенная информация по теме вышеописанных параметров.

Fallback-параметры

"Fallback material" - рус. "Обратно-совместимый материал". Они нужны для того, чтобы ваш навороченный материал(например с преломлениями, с картами нормалей и т.д.) имел запасной вариант для тех пользователей, видеокарты которых не поддерживают современные версии DirectX (как следствие - не умеют работать с картами нормалей, преломлениями и т.д.). Общий синтаксис таков:

"Шейдер"
{
"$Параметр" "значение параметра" //Это содержимое вашего типичного файла
"$Параметр" "значение параметра" //материала. Код fallback-совместимости
"$Параметр" "значение параметра" //вставляеться после всех параметров.
    "Шейдер_DX81"               
    {
    "$fallbackmaterial" "путь/имя_материала_совместимого_с_DirectX8.1"
    }
    "Шейдер_DX80"
    {
    "$fallbackmaterial" "путь/имя_материала_совместимого_с_DirectX8"
    }
    "Шейдер_DX70"
    {
    "$fallbackmaterial" "путь/имя_материала_совместимого_с_DirectX7"
    }
    "Шейдер_DX60"
    {
    "$fallbackmaterial" "путь/имя_материала_совместимого_с_DirectX6"
    }
}

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

Шейдер
{
"$Параметр" "значение параметра" //Параметры, поддерживаемые всеми 
"$Параметр" "значение параметра" //версиями DirectX (от 6й до 9.х)
"Шейдер_DX9"
{
"$Параметр" "значение параметра" //Сюда впишем параметры, которые 
"$Параметр" "значение параметра" //поддерживаються только в DirectX 9 
}
"Шейдер_DX8"
{
"$Параметр" "значение параметра" //Cюда впишем параметры, которые
"$Параметр" "значение параметра" //будут совместимыми с DirectX 8
}
"Шейдер_DX7"
{
"$Параметр" "значение параметра" //Cюда впишем параметры, которые
"$Параметр" "значение параметра" //будут совместимыми с DirectX 7
}
"Шейдер_DX6"
{
"$Параметр" "значение параметра" //Cюда впишем параметры, которые
"$Параметр" "значение параметра" //будут совместимыми с DirectX 6
}

У некоторых шейдеров нет разницы между directX 8.1 и 8.0 или там 6.0 и 7.0 - у них не будет поддержки параметра "Шейдер_DX81", а будет только "Шейдер_DX80" или "Шейдер_DX60" - список поддерживаемых параметров по каждому шейдеру можно посмотреть тут (на англ).

Так как отражения(к примеру) при включенном HDR становятсья неестественно яркими - есть возможность задавать свои параметры для HDR-режима с помощью синтаксиса:

...
"Шейдер_DX9_hdr"
{
"$Параметр" "значение параметра" //Cюда впишем параметры, которые
"$Параметр" "значение параметра" //будут лучше подоходить к HDR-освещению.
}
...

Дополнительная информация

  • Порядок поиска движком Source ресурсов при загрузке карты: сначала - внутри самого файла карты (внутри BSP), потом - внутри папок игры (materials, models, sounds и т.п.), в конце - внутри gcf-файлов игры. Если необходимый ресурс (текстура, модель, звук и т.п.) находитсья в одном из этих мест - поиск останавливаеться и Source загружает этот ресурс, потом переходит к поиску следующего ресурса по тому же алгоритму и так пока все не загрузит.
  • Допустим вы хотите заменить текстуру у модели. Все бы хорошо, но модель - стандартная и лежит соответственно в gcf-файле игры. И текстура к ней лежит там же. Можно вытащить модель и текстуры к ней, декомпилировать модель, скомпилировать её заново, указав использовать новые текстуры. Но заменить текстуру можно проще - если вы создадите одноименные файлы материалов и положите их в одноименные папки - при загрузке уровня Source использует их, а не те, что лежат по такому же пути в gcf. Скачайте любой "скин" из интернета и посмотрите на это вживую.
  • Точно также можно подменить модель или звук, лежащие в gcf-файлах: просто поместите по такому же пути файлы с такими же названиями - (звуки - в папке sounds, модели - в папке models и т.п.).



--Uragan Lex 04:13, 19 мая 2007 (MSD)