$patch is a useful VMT ‘shader’ for creating unified sets of materials.
The $patch ‘shader’ works by specifying an existing material, in this example “materials/glitchvid/plaster/cleanplaster_base.vmt” and allowing you to add, or replace existing parameters, in the $patch’d material. Unifying similar assets, and streamlining your material set.
Real world examples:
cleanplaster_base.vmt
The “base” material defines all of our standardized presets for our set
“LightmappedGeneric”
{
“$basetexture” “ERROR”
“$bumpmap” “glitchvid/plaster/plaster_normalmap”
“$envmap” “env_cubemap”
“$normalmapalphaenvmapmask” “1”
“$envmaptint” “[ 0.25 0.25 0.25 ]”
“$surfaceprop” “plaster”
// “$reflectivity” “[0.5 0.5 0.5]” // VTF is doing fine automatically
“$detail” “glitchvid/detail/plaster_detail_2”
“$detailscale” “5”
// “%notooltexture” “1” // We would use this if it didn’t cause key value issues
}
cleanplaster_white.vmt
And here is the white version
patch
{
include “materials/glitchvid/plaster/cleanplaster_base.vmt”
insert
{
“$basetexture” “glitchvid/plaster/cleanplaster_white”
}
}
As you can see, the ‘insert’ function lets us replace values in the base. Here it sets the basetexture to the white diffuse.
cleanplaster_orange.vmt
patch
{
include “materials/glitchvid/plaster/cleanplaster_base.vmt”
insert
{
“$basetexture” “glitchvid/plaster/cleanplaster_orange”
“$envmaptint” “{204 68 30}”
“$reflectivity” “{382 166 0}” // this value is doubled
}
}
This one is a bit more complex, overriding envmaptint and reflectivity.
Why do it?
$patch allows you to unify basic parameters about materials. In this case I’m making a set of plaster materials, meaning they’re all going to sound like plaster, reflect similar to plaster, and have the same $detail texture. Utilizing $patch allows me to change the detail texture, normalmap, etc on all the materials at once, removing the need to change each sub material individually.