How Bedrock Tinting Works
When Minecraft tints a block, it takes a base greyscale texture and multiplies its pixel values against a color sampled from a colormap (such as the grass or foliage colormap in the resource pack). Because the math is multiplicative, pure white pixels in your texture become the exact biome color, mid-grey pixels become a darker shade of that color, and pure black pixels remain black.
If you draw your texture in full green and then enable tinting, the engine will multiply your green pixels by the biome's green values, resulting in an overly dark, muddy texture. Always author the parts of your texture that will be tinted in greyscale. For blocks that only have partial tinting—like the side of a grass block where the dirt remains brown—you must use custom geometry or careful alpha masking, as a single material instance applies its tint method to the entire texture assigned to it.
Configuring Material Instances
For custom blocks using the modern `minecraft:geometry` and `minecraft:material_instances` components in the behavior pack, tinting is defined directly inside the material instance dictionary. Each face or named material instance can be given a `tint_method` string property.
This approach is far more flexible than the legacy `blocks.json` system because you can tint the `up` face of a block using the grass colormap while leaving the `north`, `south`, `east`, `west`, and `down` faces completely untinted. You can also combine `tint_method` with block permutations to turn tinting on or off dynamically based on block states.
{
"format_version": "1.20.80",
"minecraft:block": {
"description": {
"identifier": "wiki:custom_turf"
},
"components": {
"minecraft:geometry": "minecraft:geometry.full_block",
"minecraft:material_instances": {
"up": {
"texture": "custom_turf_top",
"render_method": "opaque",
"tint_method": "grass"
},
"*": {
"texture": "custom_turf_side",
"render_method": "opaque",
"tint_method": "none"
}
}
}
}
}Available Tint Methods
The `tint_method` field inside `minecraft:material_instances` accepts a specific set of strings that correspond to different biome foliage and water calculations. Choosing different foliage methods changes how the block reacts to temperature and downfall values across biomes, or locks it to a specific vanilla tree type.
When a block with a `tint_method` is held in the inventory or dropped as an item, it does not have a world position to sample a biome from. In these cases, the engine applies a default fallback tint associated with that specific tint method.
| Tint Method Value | What it does | Notes |
|---|---|---|
| none | Disables all biome tinting on this material instance. | This is the default if the field is omitted. |
| grass | Samples the biome's grass color and the grass colormap. | Matches vanilla grass blocks and short grass. |
| default_foliage | Samples the standard biome foliage color. | Matches oak, jungle, and acacia leaves. |
| birch_foliage | Applies the fixed birch leaf tint. | Does not change colour across most biomes. |
| evergreen_foliage | Applies the fixed spruce leaf tint. | Gives a cooler, dark green shade. |
| dry_foliage | Samples the warmer, dry foliage palette. | Useful for savannah or dead bush style blocks. |
| water | Samples the biome's surface water color. | Works best with a translucent or blend render_method. |
Tinting Multi-Part Custom Models
A common challenge is recreating the side of a vanilla grass block, where the dirt stays brown and only the grassy overlay changes color. Because `tint_method` applies to the entire material instance, you cannot taint half of a single flat PNG without advanced shader workarounds.
The cleanest solution in modern Bedrock is to build a custom block model in Blockbench with two overlapping cubes or planes. Give the inner cube a material name like `base_dirt` and the outer overlay elements a material name like `grass_overlay`. Ensure the overlay texture uses transparent pixels where the dirt should show through.
In your behavior pack block file, you then map `base_dirt` with `tint_method` set to `none` and `render_method` set to `opaque`. For `grass_overlay`, set `tint_method` to `grass` and `render_method` to `alpha_test`. Note that if the two faces occupy the exact same 3D coordinates, they may z-fight and flicker; inflating or offsetting the overlay geometry by a tiny fraction (such as 0.01 units) prevents this visual glitch.
{
"format_version": "1.20.80",
"minecraft:block": {
"description": {
"identifier": "wiki:overgrown_stone"
},
"components": {
"minecraft:geometry": "geometry.overgrown_stone",
"minecraft:material_instances": {
"stone_base": {
"texture": "stone_base_tex",
"render_method": "opaque",
"tint_method": "none"
},
"moss_overlay": {
"texture": "moss_overlay_greyscale",
"render_method": "alpha_test",
"tint_method": "grass"
}
}
}
}
}Legacy Resource Pack Tinting
Before `tint_method` was introduced to behavior pack material instances, tinting was configured inside `RP/blocks.json` using the `carried_textures` property alongside shader-level alpha masks. While you may still see `blocks.json` used in older packs or for overriding vanilla blocks, you should avoid mixing `blocks.json` definitions with modern `minecraft:material_instances`.
When a custom block defines `minecraft:material_instances` in the behavior pack, the game bypasses many of the settings in `RP/blocks.json`, and texture shortnames are resolved directly from `RP/textures/terrain_texture.json`. Stick to `tint_method` inside the behavior pack for all new custom blocks.
Which versions this applies to
The `tint_method` property inside `minecraft:material_instances` is stable in format versions 1.20.60 and higher, and does not require any experimental toggles.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| The block texture in-game looks extremely dark, muddy, or nearly black instead of vibrant green. | Your source PNG texture is already colored green instead of greyscale. The game multiplies your dark green pixels by the biome's green color values, darkening the result. | Desaturate your PNG texture in an image editor so that it is bright greyscale (white and light greys), then reload the resource pack. |
| Content Log Error: [Blocks][error]-wiki:custom_turf | minecraft:material_instances - Invalid tint_method value | You used an unrecognized string for `tint_method`, such as `"foliage"` or `"biome"` instead of the exact enumerated strings the schema expects. | Change the value in your JSON to one of the valid strings: `"none"`, `"grass"`, `"default_foliage"`, `"birch_foliage"`, `"evergreen_foliage"`, `"dry_foliage"`, or `"water"`. |
| The tinted overlay texture on a custom geometry block has black or white solid backgrounds covering the base block beneath it. | The material instance for the overlay is using `"render_method": "opaque"`, which ignores the alpha channel of your PNG. | Change the overlay material instance's `render_method` to `"alpha_test"` for hard pixel edges, or `"blend"` for semi-transparent pixels. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
