Quick answer: glTF expects roughness in the green channel of a packed ORM/MR texture, with 0 meaning smooth. If your DCC exported roughness to the red channel, or authored it as glossiness (inverted), Godot reads garbage values and your model looks flat. Repack the texture or override the material on import.

Here is how to fix Godot glTF imports that come in matte when the source was glossy, or chrome when the source was painted. The mesh geometry is correct, the base color is correct, the import succeeds without warnings. Only the PBR response looks wrong — and when you swap materials manually, it looks fine. Something about the import pipeline is misreading your PBR channels.

The Symptom

You export a model from Blender, Substance Painter, Marmoset, or another DCC tool as .glb or .gltf. In the source tool it looks correct: a polished metal surface is glossy and reflective, a painted surface has subtle microsurface variation. You drop the file into Godot. The import runs without errors. When you view the mesh, the shading is completely wrong.

Typical failure modes: painted surfaces look mirror-shiny. Metal looks like rubber. Rough stone looks wet. Clear coat is missing entirely. Sometimes only specific objects within a multi-material glTF are wrong, while others in the same file render correctly. Occasionally the roughness looks inverted — every surface is gradually becoming the opposite of what it should be based on the albedo color.

What Causes This

The glTF 2.0 specification is strict about PBR texture layout. A single packed texture carries three channels:

This layout is often called ORM (Occlusion-Roughness-Metallic) or sometimes MR (metallic-roughness, when AO is excluded or separate). Godot reads the glTF exactly per the spec: green = roughness, blue = metallic.

Three common failure modes break this contract. First, the DCC tool exported a separate roughness map without packing it properly, and the glTF exporter put the raw roughness texture into the metallic-roughness slot. Now green might be empty (fully smooth) or might contain the luminance of a grayscale texture that was meant for a different channel.

Second, the source was authored as glossiness (PBR specular-glossiness workflow) where white = glossy. When exported to glTF as roughness without inverting, white now means fully rough, and everything looks matte. This is especially common with assets from Unity Standard Specular shaders, older Marmoset materials, or any engine that used specular-gloss as the default.

Third, the exporter packed the channels but used a non-standard layout — for instance, putting roughness in red and metallic in green. Godot’s importer follows the spec, so those channels come in as the wrong property and you get extremely strange results like the AO map being interpreted as metallic.

The Fix

Step 1: Inspect the packed texture. Extract the metallic-roughness texture from the glTF (tools like gltf-pipeline or Blender’s glTF addon can extract embedded textures) and open it in an image viewer that shows individual channels. Verify:

If the channels are swapped or the roughness is inverted, the source export is wrong.

Step 2: Fix the export. In Blender, make sure the glTF Settings node is connected in the Principled BSDF group and that you are using the Unite channels option (or equivalent) in the glTF exporter. In Substance Painter, use the glTF PBR Metal Roughness output template, not the specular-glossiness template. In Marmoset, enable Metalness workflow and ensure Roughness is not checked as Glossiness.

Step 3: If you cannot re-export, override the material in Godot. Double-click the glTF file in the FileSystem dock to open the Advanced Import Settings. Select the problem material in the left panel. You have two options.

Option A — use a BaseMaterial3D override with swapped texture channels:

# Swap roughness channel at load time if export is wrong
extends MeshInstance3D

func _ready():
  var mat: BaseMaterial3D = mesh.surface_get_material(0).duplicate()
  # Tell Godot the roughness is in the red channel, not green
  mat.roughness_texture_channel = BaseMaterial3D.TEXTURE_CHANNEL_RED
  # If roughness is authored as glossiness, invert it
  mat.roughness_texture_channel = BaseMaterial3D.TEXTURE_CHANNEL_GRAYSCALE
  mat.roughness = 1.0  # multiplier applied to the sampled value
  set_surface_override_material(0, mat)

Option B — save an external .tres material with the corrected setup, then in Advanced Import Settings point the material entry to that external file. This way every reimport of the glTF reuses your corrected material.

Step 4: For glossiness-authored sources, invert the channel. If the roughness texture was authored where white = glossy (smooth), you need to invert it. The cleanest fix is to reauthor in the DCC, but if that is not feasible, Godot has no built-in invert option for roughness. Either invert the texture in GIMP or Photoshop offline, or write a one-time editor tool script that loads the texture, inverts the green channel, and saves a corrected copy.

If metallic also looks wrong, the exporter likely stuffed specular values into the metallic channel. Specular-Glossiness cannot be directly expressed in Metallic-Roughness without converting — reauthor or use the KHR_materials_pbrSpecularGlossiness extension with a reader that supports it.

Why This Works

Godot’s glTF importer obeys the spec exactly. It reads green as roughness, blue as metallic, and scales the sampled value by the scalar roughnessFactor and metallicFactor declared in the glTF JSON. There is no channel auto-detection; if your texture breaks the convention, Godot renders the wrong result with no warning.

Overriding via BaseMaterial3D lets you tell the renderer which channel actually contains roughness and whether to sample as grayscale. This decouples your material from the importer’s strict channel mapping. Saving the override as an external .tres and pointing the import at it survives reimports, which is what you want when the art pipeline is still under development.

Related Issues

If imported meshes have inverted normals or black shading patches, see Fix: Godot glTF Normal Map Rendering Incorrectly — tangent space generation is a related but separate issue.

For glTF models where skeletal animations drift over time, see Fix: Godot Skeletal Animation Import from Blender Breaks Bones.

Green is roughness. Blue is metallic. Anything else is a broken export.