Skip to content
← Back to Blog tutorials

Godot 4 Decals: Add Surface Detail Without Rebaking Textures

By BitSoul3D4 min read140 views

Decals solve one of the most tedious problems in environment art: adding localised surface variation — cracks, stains, painted arrows, bullet holes, puddle residue — without touching the base texture or rebaking a single lightmap. Godot 4's Decal node brings this capability to any mesh with almost zero setup cost, and once you understand its PBR channel system, you can use it to punch well above your texture budget.

Godot 4 Decals: Add Surface Detail Without Rebaking Textures

What Decal nodes actually do in Godot 4

A Decal node projects a set of textures onto any mesh that falls inside its box-shaped volume. The projection is orthographic along the node's local -Y axis, so you rotate and scale the box to aim it.

What Decal nodes actually do in Godot 4 — illustrated

Internally, the renderer reprojects the decal texture using the fragment's world position and the decal's inverse transform. This means:

The node sits under Node3D in the scene tree. You can instance it, animate it, toggle visibility, and attach it to moving objects — useful for projected headlights, magic circles, or interactive highlights.

Setting up your first Decal node

Add a Decal node to your scene. In the Inspector you'll see a bounding box defined by Size (X/Y/Z extents). The decal projects downward along local -Y; the box height controls how far the projection reaches before it fades.

# Spawn a decal at runtime — useful for bullet holes or spills
func place_decal(world_pos: Vector3, texture: Texture2D) -> void:
    var d := Decal.new()
    d.texture_albedo = texture
    d.size = Vector3(0.4, 0.2, 0.4)
    d.upper_fade = 0.1
    d.lower_fade = 0.3
    d.add_to_group("runtime_decals")
    get_tree().current_scene.add_child(d)
    d.global_position = world_pos
    d.rotate_y(randf() * TAU)  # randomise orientation

Key properties to know:

PropertyEffect
texture_albedoColour + alpha (alpha drives overall opacity)
texture_normalNormal map blended on top of surface normal
texture_ormPacked ORM: R=Occlusion, G=Roughness, B=Metallic
texture_emissionEmissive mask — useful for glowing markings
upper_fade / lower_fadeSoft falloff at top/bottom of volume
cull_maskLimit which layers the decal affects

Set cull_mask carefully. If your scene uses render layers to separate props from terrain, you can restrict the decal to terrain only — preventing it from bleeding onto unrelated meshes that happen to enter the volume.

Authoring decal textures and PBR channels

Authoring decal textures and PBR channels — illustrated

Decal textures follow the same conventions as any StandardMaterial3D input. For the ORM map, pack your channels in Blender or your image editor:

# Quick ORM pack in Python / Pillow
from PIL import Image

ao    = Image.open("ao.png").convert("L")
rough = Image.open("roughness.png").convert("L")
metal = Image.open("metallic.png").convert("L")

orm = Image.merge("RGB", (ao, rough, metal))
orm.save("decal_orm.png")

For most decals — dirt, stains, cracks — you only need texture_albedo with a clean alpha mask and a subtle roughness boost via texture_orm. Normal maps add convincing depth for damage or raised markings.

Authoring checklist:

Performance limits and distance fading

Godot 4's deferred renderer handles Decals well, but they are not free:

# Auto-fade a decal beyond 15 m
func _ready() -> void:
    $Decal.distance_fade_begin = 12.0
    $Decal.distance_fade_length = 3.0

Budget guideline: in a typical first-person scene, up to ~20 visible Decal nodes runs comfortably on mid-range hardware. For open-world environments with thousands of decals, stream them with your chunk loader and cull aggressively with VisibleOnScreenNotifier3D.

You can grab base environment and prop assets from the BitSoul marketplace and start placing Decal nodes immediately — the GLB models import into Godot 4 with no material conversion needed.


Godot 4 Decals are one of the highest-value techniques in the environment artist's toolkit: real PBR blending, no UV cost, runtime spawnable, and compatible with any mesh in your scene. Start with a simple stain or crack decal, then layer normal and ORM maps once projection is dialled in. Browse ready-to-use environment props at bitsoulhosting.com/marketplace.


This post is part of the Ultimate Guide to Free 3D Game Assets — BitSoul's complete reference for formats, texturing, rigging, optimization, and engine integration.


Need drop-in assets for this workflow? Grab the 70-model Food Bundle on the BitSoul marketplace and drop them straight into your project.

Tags: food

Skip the modeling — download it instead

A free BitSoul3D account gets you 2 GLB downloads every month for personal use plus 25 one-time AI Engine credits, no card required. PBR-textured GLB downloads with a full 3D preview before you buy, for Unreal, Unity, Godot or Blender — OBJ and 3D-printable STL come with any purchase or paid plan.

Browse 1,051 models — from $4.99 → or start free (2 downloads a month)