Skip to content

Materials

Radik Khamatdinov edited this page Feb 24, 2026 · 29 revisions

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

Quick Video Tutorial

Note

If you create a Godot Material (*.tres) with the same name and path as a *.vmt file, the importer will use Godot's version instead.

VMT/VTF Creation

Option Demo
Convert TRES material into VMT and VTF: convert-to-vmt
Create a VMT and VTF file from some source image: creating-vmt
Create a blend material from two VMT files: creating-blend-material

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
  $texturefilter LINEAR_WITH_MIPMAPS // or NEAREST, LINEAR, NEAREST_WITH_MIPMAPS, NEAREST_WITH_MIPMAPS_ANISOTROPIC, LINEAR_WITH_MIPMAPS_ANISOTROPIC

  $shader "path_to_shader" // This path already includes res:// and by specifying this VMT becomes a ShaderMaterial instead of StandardMaterial3D (example: '"$shader" "shaders/gds/spatial_generic.gdshader"')
  $nextpass "path_to_next_pass_shader" // This path already includes res:// adds VMTShaderBasedMaterial to the `next_pass` property
}

Want to add support for a new material field?

Create a singleton class named VMTExtend in @tool mode and define a function with the name of the property you want to support 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 the 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