Skip to content

Materials

Radik edited this page Aug 7, 2025 · 21 revisions

This plugin adds almost full VMT/VTF file support with some extensions. VMT files will be imported as regular StandardMaterial3D except some cases.

Quick Video Tutorial

Note

If you create a Godot Material (*.tres) that has the same name and path as some *.vmt file then the importer will use the Godot's one instead.

You can convert all textures you need to VTF via VTFEdit Reloaded

Additional properties for VMT for use in Godot

"LightmappedGeneric"
{
  $roughnesstexture "path_to_vtf"
  $metalnesstexture "path_to_vtf"
  $ambientocclusiontexture "path_to_vtf"
  $roughnessfactor 0.7
  $metallnessfactor 0.3
  $specularfactor 0.6
  $ambientocclusionlightaffect 0.43
  $detailblendmode 1 // See blend modes for detail textures of Godot Material
  $emissioncolor "0 255 0 255"
  $emissionenergy 10.3
  $emissionoperator 0 // 0 - add, 1 - multiply

  $shader "res://path_to_shader" // By specifying this VMT becomes a ShaderMaterial instead of StandardMaterial3D
  $nextpass "res://path_to_next_pass_shader" // Adds VMTShaderBasedMaterial into the `next_pass` property
}

Want to add support a new field for the material?

Create a singleton class named VMTExtend in @tool mode and define a function with a name of the property you need to have or override.

@tool
extends Node

func basetexture(material: Material, value: Variant):
  if "albedo_texture" not in material: return;
  material.albedo_texture = VTFLoader.get_texture(value);

func emissionenergy(material: Material, value: Variant):
  material.emission_energy_multiplier = value;

Shader materials

For ShaderMaterials (VMTs with $shader) all fields from VMT will be moved directly into uniforms:

shader_type spatial;

uniform sampler2D basetexture; // albedo
uniform sampler2D selfillummask; // emission map

void fragment() {
  ALBEDO = texture(basetexture, UV).rgb;
  EMISSION = texture(selfillummask, UV).rgb;
}
Clone this wiki locally