Material Examples

This page contains practical material examples for vehicle and prop creation. The examples focus on modern version: 1.5 physically based materials.

You can create and edit materials manually in main.materials.json, or by using the in-game Material Editor:

World Editor (F11) → Window → Material Editor

See Vehicle Art Materials for vehicle material naming conventions and standard material slots.

Using vanilla content as reference is highly recommended. Common reusable textures and materials can be found in folders such as:

/vehicles/common/
/vehicles/common/generic_mat_tex/

These include useful shared textures for carbon fiber, leather, fabric, carpet, stitches, orange peel paint, generic lights, grilles, and more.

When creating textures, use PNG source files with the naming scheme described in the Texture Cooker page. For released mods, include the cooked DDS files so users do not need to cook textures on their own machine.

Basic material structure

A typical material definition looks like this:

"example_material": {
  "name": "example_material",
  "mapTo": "example_material",
  "class": "Material",
  "Stages": [
    {},
    {},
    {},
    {}
  ],
  "dynamicCubemap": true,
  "materialTag0": "beamng",
  "materialTag1": "vehicle",
  "version": 1.5
}

Common fields

Field Description
name Internal material name. Usually matches the JSON key.
mapTo Name of the material assigned in Blender. This tells the game which mesh material this definition replaces.
class Should normally be "Material".
Stages Material layers. Up to 4 layers are supported.
activeLayers Number of layers used. If omitted, the material uses one layer.
dynamicCubemap Allows the material to use dynamic/level reflections depending on settings.
materialTag0 / materialTag1 Optional organizational tags.
version Use 1.5 for modern PBR materials.
If you manually edit a material, remove persistentId lines. They are no longer used by game engine.

Texture naming

Use the modern texture suffixes:

*.color.png   Base color / color palette
*.normal.png  Normal maps
*.data.png    Linear data maps such as roughness, metallic, opacity, AO

Examples:

vehicle_main_b.color.png
vehicle_main_nm.normal.png
vehicle_main_r.data.png
vehicle_main_m.data.png
vehicle_main_ao.data.png
vehicle_main_o.data.png

Materials should reference the PNG path. If a cooked DDS exists, the engine will load it automatically.

"baseColorMap": "/vehicles/example/example_main_b.color.png"

Do not reference the DDS directly in the material.


Main vehicle material

The main vehicle material is usually the most important material on a car. It often contains both:

  • Paintable body panels
  • Fixed-color details such as trim, vents, mechanical parts, seals, badges, etc.

Modern vehicle materials should avoid masking the main paint layer. Instead, the recommended layout is:

Layer 1: Paint layer, unmasked
Layer 2: Fixed details layer, masked
Layer 3: Optional additional detail layer
Layer 4: Optional additional detail layer

This avoids color bleeding at texture mip levels, especially on lower Texture Quality settings.


Recommended main material layer setup

Layer 1 — Paint layer

The paint layer should be unmasked and act as the base layer. It usually contains:

  • Normal map
  • Optional detail normal map for orange peel
  • Ambient occlusion map
  • Color palette map
  • Clear coat map

Example:

{
  "ambientOcclusionMap": "/vehicles/vivace/ardente/ardente_main_ao.data.png",
  "clearCoatFactor": 1,
  "clearCoatMap": "/vehicles/vivace/ardente/ardente_main_cc.data.png",
  "colorPaletteMap": "/vehicles/vivace/ardente/ardente_main_p.color.png",
  "detailNormalMap": "/vehicles/common/orange_peel_n.normal.png",
  "detailNormalMapStrength": 0.3,
  "detailScale": [128, 64],
  "metallicFactor": 1,
  "normalDetailMapUseUV": 1,
  "normalMap": "/vehicles/vivace/ardente/ardente_main_nm.normal.png"
}

This layer is fully paintable and should generally not use an opacity mask.

Layer 2 — Details layer

The details layer goes on top of the paint layer and is masked with an opacity map. It contains parts that should not be affected by the player paint color.

Typical maps:

  • Base color map
  • Metallic map
  • Normal map
  • Roughness map
  • Opacity map
  • Ambient occlusion map

Example:

{
  "ambientOcclusionMap": "/vehicles/vivace/ardente/ardente_main_ao.data.png",
  "baseColorMap": "/vehicles/vivace/ardente/ardente_main_b.color.png",
  "clearCoatFactor": 1,
  "metallicFactor": 1,
  "metallicMap": "/vehicles/vivace/ardente/ardente_main_m.data.png",
  "normalMap": "/vehicles/vivace/ardente/ardente_main_nm.normal.png",
  "opacityMap": "/vehicles/vivace/ardente/ardente_main_o.data.png",
  "roughnessMap": "/vehicles/vivace/ardente/ardente_main_r.data.png"
}

The opacity map defines where this layer appears:

  • White = details visible
  • Black = layer hidden, paint layer remains visible

Why not mask the paint layer?

Masking the base paint layer can cause bright edges or seams due to texture filtering and mipmaps. This becomes especially visible on lower texture quality settings, where smaller mip levels are used.

The recommended setup avoids this by keeping the paint layer continuous and only masking the detail layers above it.

Old setup with white edge bleeding Old setup with white edge bleeding

New setup with unmasked paint layer New setup with unmasked paint layer


Full main material example

"ardente_main": {
  "name": "ardente_main",
  "mapTo": "ardente_main",
  "class": "Material",
  "Stages": [
    {
      "ambientOcclusionMap": "/vehicles/vivace/ardente/ardente_main_ao.data.png",
      "clearCoatFactor": 1,
      "clearCoatMap": "/vehicles/vivace/ardente/ardente_main_cc.data.png",
      "colorPaletteMap": "/vehicles/vivace/ardente/ardente_main_p.color.png",
      "detailNormalMap": "/vehicles/common/orange_peel_n.normal.png",
      "detailNormalMapStrength": 0.3,
      "detailScale": [128, 64],
      "metallicFactor": 1,
      "normalDetailMapUseUV": 1,
      "normalMap": "/vehicles/vivace/ardente/ardente_main_nm.normal.png"
    },
    {
      "ambientOcclusionMap": "/vehicles/vivace/ardente/ardente_main_ao.data.png",
      "baseColorMap": "/vehicles/vivace/ardente/ardente_main_b.color.png",
      "clearCoatFactor": 1,
      "metallicFactor": 1,
      "metallicMap": "/vehicles/vivace/ardente/ardente_main_m.data.png",
      "normalMap": "/vehicles/vivace/ardente/ardente_main_nm.normal.png",
      "opacityMap": "/vehicles/vivace/ardente/ardente_main_o.data.png",
      "roughnessMap": "/vehicles/vivace/ardente/ardente_main_r.data.png"
    },
    {},
    {}
  ],
  "activeLayers": 2,
  "dynamicCubemap": true,
  "materialTag0": "beamng",
  "materialTag1": "vehicle",
  "version": 1.5
}

Color palette maps

Color palette maps define which paint slot affects which area.

See Introduction to Paint Materials for how color palette maps and instance colors work with vehicle paints.

Common channels:

Channel Paint slot
Red Paint 1
Green Paint 2
Blue Paint 3

For most single-color paint materials, use a common null red palette texture:

/vehicles/common/nullcolormaskR.color.png

Use custom palette maps when the vehicle needs factory two-tone or three-tone paint behavior.

For skins and liveries, color palette maps usually use UV1, the unmirrored skin UV set.

Detail maps on vehicle paint

Vehicle paint can use a shared detail normal map for orange peel:

See Common Detail Maps for reusable paint, interior, fabric, and carbon-fiber detail setups.

"detailNormalMap": "/vehicles/common/orange_peel_n.normal.png",
"detailNormalMapStrength": 0.3,
"detailScale": [128, 64],
"normalDetailMapUseUV": 1

This adds subtle surface imperfection visible in highlights and reflections.

Keep the strength low. Orange peel should not look like dents or heavy damage.


Additional detail layers

Layers 3 and 4 can be used for optional material details, such as:

  • Carbon fiber
  • Vinyl overlays
  • Patterned trim
  • Special livery materials
  • Tiled metallic/roughness effects

Example from a carbon fiber material:

{
  "baseColorFactor": [0.318, 0.318, 0.318, 1],
  "clearCoatFactor": 0.926,
  "clearCoatRoughnessFactor": 0.047,
  "detailMap": "/vehicles/common/carbonfiber_d.color.png",
  "detailMapUseUV": 1,
  "detailNormalMap": "/vehicles/common/carbonfiber_n.normal.png",
  "detailNormalMapStrength": 0.77,
  "detailScale": [80, 80],
  "normalDetailMapUseUV": 1,
  "roughnessFactor": 0.09
}

Standard opaque material

Use a standard opaque material for fixed non-colorable parts such as mechanical components, engine bay parts, suspension components, interior plastics, or trim.

"example_mechanical": {
  "name": "example_mechanical",
  "mapTo": "example_mechanical",
  "class": "Material",
  "Stages": [
    {
      "ambientOcclusionMap": "/vehicles/example/example_mechanical_ao.data.png",
      "baseColorMap": "/vehicles/example/example_mechanical_b.color.png",
      "metallicFactor": 1,
      "metallicMap": "/vehicles/example/example_mechanical_m.data.png",
      "normalMap": "/vehicles/example/example_mechanical_nm.normal.png",
      "roughnessMap": "/vehicles/example/example_mechanical_r.data.png"
    },
    {},
    {},
    {}
  ],
  "dynamicCubemap": true,
  "materialTag0": "beamng",
  "materialTag1": "vehicle",
  "version": 1.5
}

Important map behavior

Map Notes
Base Color Should not contain baked lighting or strong shadows.
Metallic Usually black or white. Avoid gray values unless physically justified.
Roughness Controls reflection sharpness.
Normal Adds surface relief.
Ambient Occlusion Darkens areas where indirect light is blocked.

Simple single-color material

A simple material can be made without texture maps by using factors only:

"example_single_color_material": {
  "name": "example_single_color_material",
  "mapTo": "example_single_color_material",
  "class": "Material",
  "Stages": [
    {
      "baseColorFactor": [0.11, 0.16, 0.20, 1],
      "roughnessFactor": 0.4,
      "metallicFactor": 0
    },
    {},
    {},
    {}
  ],
  "dynamicCubemap": true,
  "materialTag0": "beamng",
  "materialTag1": "vehicle",
  "version": 1.5
}

This is useful for quick prototypes, but textured materials usually look better.


Transparent glass material

Transparent materials are commonly used for glass and light lenses.

"example_glass": {
  "name": "example_glass",
  "mapTo": "example_glass",
  "class": "Material",
  "Stages": [
    {
      "baseColorMap": "/vehicles/example/example_glass_b.color.png",
      "metallicFactor": 0.75,
      "opacityMap": "/vehicles/example/example_glass_o.data.png",
      "roughnessFactor": 0
    },
    {},
    {},
    {}
  ],
  "castShadows": false,
  "dynamicCubemap": true,
  "translucent": true,
  "translucentBlendOp": "PreMulAlpha",
  "translucentRecvShadows": true,
  "version": 1.5
}

Glass settings

Field Description
translucent Enables transparency.
translucentBlendOp Use PreMulAlpha for glass.
opacityMap Controls transparency.
castShadows Usually disabled for vehicle glass.
translucentRecvShadows Allows transparent surfaces to receive shadows.

Interior glass material

The interior side of glass often uses a separate material with reflections set to black cubemap. This prevents the inside of the glass from reflecting the road or exterior environment unrealistically. Make sure to enable shadow receiving to avoid interior glass being too bright vs rest of interior.

"example_glass_int": {
  "name": "example_glass_int",
  "mapTo": "example_glass_int",
  "class": "Material",
  "Stages": [
    {
      "baseColorMap": "/vehicles/example/example_glass_b.color.png",
      "metallicFactor": 0.75,
      "opacityFactor": 0.061999999,
      "roughnessFactor": 0
    },
    {},
    {},
    {}
  ],
  "castShadows": false,
  "cubemap": "BlackSkyCubemap",
  "translucent": true,
  "translucentBlendOp": "PreMulAlpha",
  "translucentRecvShadows": true,
  "version": 1.5
}

Damaged glass material

Damaged glass usually uses separate base color, opacity, roughness, and normal maps.

"example_glass_dmg": {
  "name": "example_glass_dmg",
  "mapTo": "example_glass_dmg",
  "class": "Material",
  "Stages": [
    {
      "baseColorMap": "/vehicles/example/example_glass_dmg_b.color.png",
      "metallicFactor": 0.75,
      "normalMap": "/vehicles/example/example_glass_dmg_nm.normal.png",
      "opacityMap": "/vehicles/example/example_glass_dmg_o.data.png",
      "roughnessFactor": 0
    },
    {},
    {},
    {}
  ],
  "alphaRef": 20,
  "alphaTest": true,
  "castShadows": false,
  "dynamicCubemap": true,
  "translucent": true,
  "translucentBlendOp": "PreMulAlpha",
  "translucentRecvShadows": true,
  "version": 1.5
}

The opacity map should contain holes and crack transparency. The normal map should contain crack relief.


Emissive materials

Emissive materials are used for lights, gauges, screens, indicators, and illuminated controls.

Modern emissive materials should use nits for brightness instead of overbright color values.

For vehicle light switching and fading, see Glow Maps and Smooth lighting emissive materials and light props .

"example_lights_on": {
  "name": "example_lights_on",
  "mapTo": "example_lights_on",
  "class": "Material",
  "Stages": [
    {
      "ambientOcclusionMap": "/vehicles/example/example_lights_ao.data.png",
      "baseColorMap": "/vehicles/example/example_lights_b.color.png",
      "emissiveFactor": [1, 1, 1],
      "emissiveIntensityNits": 15000,
      "emissiveMap": "/vehicles/example/example_lights_g.color.png",
      "metallicFactor": 1,
      "metallicMap": "/vehicles/example/example_lights_m.data.png",
      "normalMap": "/vehicles/example/example_lights_nm.normal.png",
      "roughnessMap": "/vehicles/example/example_lights_r.data.png"
    },
    {},
    {},
    {}
  ],
  "dynamicCubemap": true,
  "materialTag0": "beamng",
  "materialTag1": "vehicle",
  "version": 1.5
}

Emissive workflow

  • Keep emissive texture colors within SDR range.
  • Use emissiveIntensityNits for brightness.
  • Full white/color in the emissive texture means 100% of the set nits value.
  • Darker texture values reduce emitted brightness proportionally.

Example:

1000 nits material:
white pixel = 1000 nits
50% gray pixel = ~500 nits
black pixel = 0 nits
Do not use overbright emissive colors to force bloom. Use physically based nits values instead.

Retro reflective materials

Retro reflectivity is used for surfaces that should become bright when viewed near a local light source, such as road signs in headlights, license plates, reflective decals, and reflector lenses. It is a version: 1.5 layer property and is separate from cubemap reflections.

"example_reflector": {
  "name": "example_reflector",
  "mapTo": "example_reflector",
  "class": "Material",
  "Stages": [
    {
      "baseColorMap": "/vehicles/example/example_reflector_b.color.png",
      "metallicFactor": 1,
      "normalMap": "/vehicles/example/example_reflector_nm.normal.png",
      "retroreflectivity": 1,
      "retroreflectiveColor": [1, 1, 1],
      "roughnessMap": "/vehicles/example/example_reflector_r.data.png"
    },
    {},
    {},
    {}
  ],
  "dynamicCubemap": true,
  "materialTag0": "beamng",
  "materialTag1": "vehicle",
  "version": 1.5
}
Currently retro reflective materials do not support translucent materials.

Retro reflectivity workflow

  • Use retroreflectivity between 0 and 1. Road signs commonly use 1; license plates can use lower values such as 0.5.
  • Omit retroreflectiveColor, or use [0, 0, 0], when the whole base color should retroreflect.
  • Use retroreflectiveColor to limit the effect to matching base-color areas. [1, 1, 1] is useful for white sheeting, while red or yellow values are useful for colored reflectors.
  • Do not use reflectivityMap for this. That field belongs to the old cubemap reflection workflow, not headlight-style retro reflectivity.

Decal-style materials

Decal-style materials are simple meshes with transparency, often used for badges, lettering, labels, stickers, or trim. Should use Z-Write to not float above surface where possible.

"example_lettering": {
  "name": "example_lettering",
  "mapTo": "example_lettering",
  "class": "Material",
  "Stages": [
    {
      "ambientOcclusionMap": "/vehicles/example/example_lettering_ao.data.png",
      "baseColorMap": "/vehicles/example/example_lettering_b.color.png",
      "metallicFactor": 1,
      "metallicMap": "/vehicles/example/example_lettering_m.data.png",
      "normalMap": "/vehicles/example/example_lettering_nm.normal.png",
      "opacityMap": "/vehicles/example/example_lettering_o.data.png",
      "roughnessMap": "/vehicles/example/example_lettering_r.data.png"
    },
    {},
    {},
    {}
  ],
  "dynamicCubemap": true,
  "translucent": true,
  "translucentRecvShadows": true,
  "translucentZWrite": true,
  "version": 1.5
}
Using Alpha Testing instead of Z-Write will cause decal materials to look as if they were floating since Screen Space Shadows will add additional shadow detail for them.

Dummy materials

Dummy materials were empty material definitions used when another system, such as glowmaps, replaces the material at runtime.

Dummy materials are no longer needed to be included.
"example_dummy": {
  "name": "example_dummy",
  "mapTo": "example_dummy",
  "class": "Material",
  "Stages": [{}, {}, {}, {}]
}

Dynamic texture materials

Dynamic texture materials are used when the game needs to replace some textures at runtime, for example dynamic vehicle liveries.

See Skins for the JBeam setup and Vehicle Skin System for skin material naming and configuration.

Dynamic texture materials usually use the same setup as the base material, but with selected textures replaced by dynamic texture references.

Example:

"example_main.skin.dynamicTextures": {
  "name": "example_main.skin.dynamicTextures",
  "mapTo": "example_main.skin.dynamicTextures",
  "class": "Material",
  "Stages": [
    {
      "ambientOcclusionMap": "/vehicles/example/example_main_ao.data.png",
      "baseColorMap": "/vehicles/example/example_main_b.color.png",
      "metallicFactor": 1,
      "metallicMap": "/vehicles/example/example_main_m.data.png",
      "normalMap": "/vehicles/example/example_main_nm.normal.png",
      "roughnessMap": "/vehicles/example/example_main_r.data.png"
    },
    {
      "ambientOcclusionMap": "/vehicles/example/example_main_ao.data.png",
      "baseColorMap": "@DynamicTextureBaseColor",
      "colorPaletteMap": "@DynamicTextureColorPalette",
      "colorPaletteMapUseUV": 1,
      "clearCoatFactor": 1,
      "clearCoatMap": "/vehicles/example/example_main_cc.data.png",
      "instanceBaseColor": true,
      "metallicFactor": 1,
      "normalMap": "/vehicles/example/example_main_nm.normal.png",
      "opacityMap": "/vehicles/example/example_main_o.data.png"
    },
    {},
    {}
  ],
  "activeLayers": 2,
  "dynamicCubemap": true,
  "materialTag0": "beamng",
  "materialTag1": "vehicle",
  "version": 1.5
}

Common dynamic texture references include:

@DynamicTextureBaseColor
@DynamicTextureColorPalette
@DynamicTextureMetallic
@DynamicTextureRoughness

Best practices

  • Use version: 1.5 for modern PBR materials.
  • Keep paint layers unmasked when possible.
  • Mask detail layers above the paint instead.
  • Use cooked DDS textures in released mods.
  • Reference PNG paths in materials.
  • Use .color.png, .normal.png, and .data.png suffixes.
  • Use common detail maps where appropriate.
  • Avoid baked shadows in base color textures.
  • Use nits for emissive brightness.
  • Use retro reflectivity for signs, license plates, reflective decals, and reflector lenses.
  • Test materials on lower Texture Quality settings to catch mip bleeding.
  • Test materials under different lighting and exposure conditions.

Common issues

White seams around body panels

Usually caused by masking the paint/base layer. Use an unmasked paint layer and place masked details above it.

Metallic map has no effect

Make sure metallicFactor is set to 1.

Paint color selector does not work

Check that the paint layer uses instance color / palette setup correctly.

Emissive is too bright or blooms incorrectly

Do not use overbright emissive colors. Use emissiveIntensityNits.

Reflective signs or plates do not brighten in headlights

Use retroreflectivity on the material layer. Cubemap reflection settings and legacy reflectivityMap fields do not create a headlight-style retroreflective response.

Detail maps shimmer

Reduce detailScale, reduce detail strength, or check mipmaps/cooked DDS output.

Texture looks wrong on lower settings

Check mipmaps, texture padding, UVs, and whether layers are masked correctly.

Last modified: July 30, 2026

Any further questions?

Join our discord
Our documentation is currently incomplete and undergoing active development. If you have any questions or feedback, please visit this forum thread.