Introduction to paint materials

BeamNG uses a PBR (Physically-Based Rendering) materials system. For the purposes of this page, it means that the car paint has a few basic properties that define the way it looks and reacts to lighting, including:

  • Color
  • Metallic factor
  • Roughness factor
  • Clear coat factor
  • Clear coat roughness factor

You can visit this page for an overview of the PBR material properties.

The material definition, present inside the materials.json file, defines how each of these properties is set:

  • It can be a single value for the entire material. For example, we can set the paint color of a school bus to yellow, and it will not be colorable by the user. In practice, we don’t use this approach for paint materials.
  • It can be a texture overlaid on the vehicle’s UV map, essentially deciding which parts of the vehicle’s 3D model have which paint properties. For example, a school bus paint can have a yellow color for most of the body, and black text and decals on some parts. This approach is used, for example, on non-colorable skins.
  • It can be fully or partially colorable - this means that some or all of the parameters are fully or partially controlled by one or more of the three available color palettes. For example, the player can choose the main paint color of the school bus, but some text and decals always stay black. This is the most common approach used on paint materials, both for the base paint and for skins. This material type is what we will focus on in this page.

One of the color palettes visualized inside the in-game paint selector. The ‘Chrominess’ property is a legacy feature and is not functional with physically based rendering materials.

Colorable paint material

Inside the materials.json file, the instanceDiffuse property decides whether the material is colorable (true) or not (false). If it is set to true, a color palette map will determine which parts of the UV map are affected by which one of the three color palettes. Full RGBA color values are used:

  • Red means the first color palette will be used
  • Green means the second color palette will be used
  • Blue means the third color palette will be used
  • Transparent means no color palette will be used (that part is not colorable)

Example of a color palette map for a two-tone paint setup.

Mixing different colors allows for gradient effects formed by the paint colors chosen by the user on different palettes. Example of a color palette map with a gradient effect.

The color set by the user on the palette is then multiplied by the material properties. For example, the value on the metallic slider will be multiplied by the color value on the metallicMap and the number value in metallicFactor. In practice, for vehicle paints the multiplier colors are set to full white, and the values to 1, in order to prevent unwanted color mixing.

Usually, the way paint materials are set up on a vehicle is that a full red texture is used for the color palette map, overlaid by an opacity map. The white parts of the opacity map dictate which parts of the vehicle are covered by the paint, making them colorable with the first color palette. This setup makes it easy to introduce skins on the second UV map. Check this page for more information.

Color palette map properties

There are some additional properties inside the materials.json file that affect the way the color palette map works:

  • colorPaletteMapUseUV: When set to 1, which is usually the case for paint materials, the second UV map will be used. This makes it easier to lay out skins.
  • paletteBaseColor: Defaults to true, if set to false then the color setting of the color palette will NOT work, and the material will instead use the default color values set for the material in the base color map and/or the base color factor, rather than multiplying it with the one set by the palette. This means that the color palette will only affect the metallic, roughness, clear coat, and clear coat roughness values, rather than the color of the paint.
  • Equivalent properties exist for the other color palette values: paletteClearCoat, paletteClearCoatRoughness, paletteMetallic, paletteRoughness.
Last modified: September 5, 2025

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.