Wiki 9Minecraft Wiki 9Minecraft

Texture Atlases (terrain_texture.json and item_texture.json)

Map short texture names to image file paths for custom blocks and items in a resource pack.

6Sections
4Code examples
4Known errors

Texture atlases are JSON configuration files in a resource pack that link short reference names to actual PNG files on disk. Whenever you create a custom block or item, your definitions do not point to image files directly; instead, they ask the atlas for a shortname, and the game stitches those referenced images together in memory at startup.

What Texture Atlases Do

When Minecraft Bedrock loads a world, it avoids opening thousands of tiny PNG files one by one during gameplay. Instead, it reads two registry files in your resource pack's textures folder, gathers all the block and item images listed inside them, and packs them into large combined sheets in memory called atlases. Your block and item definitions only ever know the short alias you assign in these files, never the file path itself.

This separation applies exclusively to blocks and items. Entities, particles, and UI elements bypass the atlas system entirely and declare their file paths inside their own client definitions. If you are adding a custom block or a custom item, however, registering its texture shortname in the correct atlas file is mandatory.

File PathAtlas NameUsed By
RP/textures/terrain_texture.jsonatlas.terrainCustom blocks, RP/blocks.json, and minecraft:material_instances
RP/textures/item_texture.jsonatlas.itemsCustom items and the minecraft:icon item component

Item Texture Atlas (item_texture.json)

The item atlas lives at RP/textures/item_texture.json and maps shortnames to 2D icons used by items in the inventory and in hand. Inside the top-level texture_data object, each key you add becomes a shortname that you can pass to the minecraft:icon component in your behavior pack item file (or resource pack item file on older format versions).

Always prefix your shortnames with your pack identifier or namespace, Using an underscore rather than a colon is common practice here, though colons are also accepted. If two loaded resource packs define the exact same key inside texture_data, the pack higher in the stack overwrites the lower one. A generic key like ruby or sword will almost certainly collide with another add-on, whereas mypack_ruby_sword is safe.

File paths inside the textures property are always written relative to the root of the resource pack, starting with textures/, and you must leave off the .png extension. The game resolves the extension automatically.

RP/textures/item_texture.json
{
  "resource_pack_name": "mypack",
  "texture_name": "atlas.items",
  "texture_data": {
    "mypack_ruby": {
      "textures": "textures/items/ruby"
    },
    "mypack_ancient_coin": {
      "textures": "textures/items/ancient_coin"
    }
  }
}

Terrain Texture Atlas (terrain_texture.json)

The block atlas lives at RP/textures/terrain_texture.json and registers every surface texture used by custom blocks. It shares the same basic layout as the item atlas, but includes two extra header values: padding and num_mip_levels. Padding adds a pixel border around each tile in the generated sheet so neighboring textures do not bleed into each other at a distance, while num_mip_levels controls how many scaled-down versions the game generates for distant rendering. Keep padding at 8 and num_mip_levels at 4 to match vanilla behavior.

Once a shortname is defined under texture_data here, you can reference it inside the minecraft:material_instances component of a behavior pack block, or inside RP/blocks.json if you are using legacy per-face texture mappings.

FieldWhat it doesNotes
resource_pack_nameIdentifies the pack that owns the fileInformational string; usually set to your pack shortname or 'vanilla'
texture_nameIdentifies which internal atlas to targetMust be 'atlas.terrain' for blocks or 'atlas.items' for items
paddingPixel buffer between stitched tilesUse 8 for terrain_texture.json; prevents mipmap edge bleeding
num_mip_levelsNumber of downscaled mipmap levelsUse 4 for terrain_texture.json; smooths blocks viewed from far away
texture_dataDictionary of shortname definitionsEach key is a custom shortname; value holds the 'textures' path
RP/textures/terrain_texture.json
{
  "resource_pack_name": "mypack",
  "texture_name": "atlas.terrain",
  "padding": 8,
  "num_mip_levels": 4,
  "texture_data": {
    "mypack_ruby_ore": {
      "textures": "textures/blocks/ruby_ore"
    },
    "mypack_chiseled_basalt_top": {
      "textures": "textures/blocks/chiseled_basalt_top"
    },
    "mypack_chiseled_basalt_side": {
      "textures": "textures/blocks/chiseled_basalt_side"
    }
  }
}

Referencing Atlas Shortnames in Blocks and Items

Defining an entry in an atlas does nothing on its own until a block or item asks for that key. In modern format versions, both block and item textures are linked directly from their behavior pack files using components, without needing an intermediate client file.

For blocks, open your block JSON in the behavior pack and add the minecraft:material_instances component. The wildcard key * sets the default texture for all faces of the block. Set its texture property to the exact key you created in terrain_texture.json.

For items, add the minecraft:icon component inside the components object of your behavior pack item file. In current format versions, you can pass an object containing a textures dictionary, where the default key points to the shortname you created in item_texture.json.

BP/blocks/ruby_ore.json
{
  "format_version": "1.20.80",
  "minecraft:block": {
    "description": {
      "identifier": "mypack:ruby_ore"
    },
    "components": {
      "minecraft:material_instances": {
        "*": {
          "texture": "mypack_ruby_ore",
          "render_method": "opaque"
        }
      }
    }
  }
}

Texture Arrays and Variations

Instead of a single path string, the textures field inside an atlas entry can accept a JSON array of paths. This is used when a single block or item needs to switch between multiple images depending on its data or state, or when defining texture variations.

When you provide a list of paths in terrain_texture.json, each entry in the array is assigned an index starting at 0. Older blocks and certain Aux-value or permutation workflows select a specific image from the array by passing that index number, though for modern custom blocks it is usually clearer to give each state its own distinct shortname and swap them using block permutations.

RP/textures/terrain_texture.json
{
  "resource_pack_name": "mypack",
  "texture_name": "atlas.terrain",
  "padding": 8,
  "num_mip_levels": 4,
  "texture_data": {
    "mypack_crate": {
      "textures": [
        "textures/blocks/crate_empty",
        "textures/blocks/crate_full"
      ]
    }
  }
}

Keeping Consistent Texture Sizes

Because every image in terrain_texture.json is packed onto a single shared sheet and mipmapped together, mixing wildly different resolutions in the same pack can cause visual glitches. If most of your blocks are 16x16 pixels and you drop a single 512x512 image into the terrain atlas, the game has to expand the sheet size in memory, and the mipmap calculations can make lower-resolution blocks look blurry at an angle.

Stick to powers of two for all block and item PNG dimensions (16x16, 32x32, 64x64) and keep the resolution consistent across your pack. Also ensure your PNG files are saved as standard 8-bit per channel RGB or RGBA images; unusual color profiles or 16-bit depth channels will fail to parse into the atlas.

Which versions this applies to

Applies to all Minecraft Bedrock versions. No experimental toggles are required to use terrain_texture.json or item_texture.json.

When it does not work

What you seeWhyThe fix
The custom block renders with a magenta and black checkerboard pattern in the world, or the item shows a purple-and-black square in the inventory.Either the shortname requested by minecraft:material_instances or minecraft:icon does not match any key in the corresponding atlas file, or the file path written inside the atlas does not match the actual PNG location on disk (for example, because you wrote .png at the end of the path string).Check that the shortname is spelled identically in both the block/item JSON and the atlas JSON, remove any .png extension from the path in the atlas, and verify the PNG exists at that exact folder path in the resource pack.
Your custom block texture appears on the wrong block, or another add-on in the world overwrites your item icon.You used an unprefixed, common shortname like 'copper_ingot' or 'crate' inside texture_data. Because Minecraft merges texture_data keys across all active resource packs, another pack with the same key name replaced your entry.Prefix every key inside texture_data with your unique pack namespace (for example, 'mypack_crate') and update the reference in your block or item JSON.
Every custom block or item in your pack loses its texture at the same time after adding a new entry, and the Content Log reports a JSON syntax error in textures/terrain_texture.json.There is a trailing comma after the last item in texture_data, or a missing comma between two entries, causing the entire atlas file to fail to parse.Run terrain_texture.json and item_texture.json through a JSON validator and remove any trailing commas after the final entry.
A custom block has thin colored lines or fringes from unrelated textures along its edges when viewed from a few chunks away.The padding or num_mip_levels fields were left out of terrain_texture.json or set to 0, causing adjacent tiles in the stitched texture sheet to bleed into each other when downscaled.Set "padding": 8 and "num_mip_levels": 4 at the top level of RP/textures/terrain_texture.json.

Reference, straight from the game files

Read out of the game itself, so the ids match the version you are building for.