How Materials Fit into Resource Packs
Every rendered surface in Bedrock passes through a material. The material links the geometry and textures to the underlying shader pipeline and sets fixed-function GPU states, such as whether the back side of a flat plane should be drawn or discarded, how alpha channels blend with the background, and whether depth testing is active.
With the introduction of the RenderDragon engine, custom shader code is no longer loaded from resource packs, meaning you cannot write new vertex or fragment shaders from scratch. However, material definitions remain the standard way to configure how existing vanilla shaders behave on your models. In day-to-day add-on development, you will spend ninety percent of your time picking the right vanilla material name, and the remaining ten percent writing small overrides in your pack's materials folder.
Assigning Materials to Entities and Render Controllers
Connecting a material to a custom entity happens in two steps. First, you declare a short alias mapped to the actual material identifier inside the client entity file. Second, you assign that alias to specific geometry bones inside a render controller.
In the client entity definition, the materials object maps your chosen short name (often just "default") to a vanilla or custom material string. In the render controller, the materials array pairs bone name patterns with `Material.<short_name>`. You can use an asterisk wildcard to apply a base material to every bone, and then follow it with specific bone names to override individual parts—for example, giving a robot entity an opaque body while its glass visor uses a blending material.
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "example:copper_automaton",
"materials": {
"default": "entity",
"visor": "entity_alphablend",
"eyes": "entity_emissive_alpha"
},
"textures": {
"default": "textures/entity/copper_automaton"
},
"geometry": {
"default": "geometry.copper_automaton"
},
"render_controllers": [
"controller.render.copper_automaton"
]
}
}
}Applying Multiple Materials in a Render Controller
When your client entity declares multiple materials, the render controller determines which bones receive which material. The engine evaluates the array in order from top to bottom, meaning later entries overwrite earlier ones if a bone name matches both patterns.
Below is the matching render controller for the entity defined above. It applies `Material.default` to all bones using the `*` wildcard, then overrides the `head_visor` and `eye_*` bones with their respective transparent and glowing materials.
{
"format_version": "1.8.0",
"render_controllers": {
"controller.render.copper_automaton": {
"geometry": "Geometry.default",
"materials": [
{ "*": "Material.default" },
{ "head_visor": "Material.visor" },
{ "eye_*": "Material.eyes" }
],
"textures": [
"Texture.default"
]
}
}
}Common Vanilla Entity Materials
Before writing a custom material file, check whether a built-in vanilla material already solves your problem. Vanilla materials are pre-compiled and cover the most common rendering scenarios for mobs, projectiles, and armor.
Choosing the wrong transparency material is a frequent source of visual bugs. If your texture only has fully opaque and fully invisible pixels (like cutouts on foliage or tattered cloth), use an alpha test material rather than alpha blend. Alpha blending is meant for smooth gradients like stained glass, and using it unnecessarily often causes sorting issues where distant bones draw on top of closer ones.
| Material Identifier | What it does | Notes |
|---|---|---|
| entity | Fully opaque rendering with standard backface culling. | Ignores the texture's alpha channel completely. Best for solid models. |
| entity_alphatest | Pixels with alpha below 0.5 are discarded; others are drawn fully opaque. | Disables backface culling by default, so flat 2D planes render on both sides. |
| entity_alphablend | Supports partial transparency (translucent pixels). | Prone to Z-sorting artifacts when multiple translucent cubes overlap. |
| entity_emissive | Opaque model where the alpha channel controls glow brightness. | Pixels with an alpha value below 1.0 ignore world lighting and glow in the dark. |
| entity_emissive_alpha | Combines alpha-test cutouts with emissive glowing pixels. | Fully transparent pixels (alpha 0) are invisible; partial alpha pixels glow; solid alpha (255) renders with normal lighting. |
| entity_nocull | Opaque rendering that draws both the front and back faces of polygons. | Useful for hollow cubes or flat planes that do not need alpha cutouts. |
| entity_multitexture | Layers a second texture over the first. | Used by vanilla mobs like horses and villagers to stack markings or clothing. |
Materials in Custom Blocks
Custom blocks in the behavior pack do not use client entity files or `entity.material` definitions. Instead, they configure their rendering directly inside the `minecraft:material_instances` block component, which maps block faces or geometry material names to textures and a simplified set of render methods.
The `render_method` field inside a material instance serves the same purpose as an entity material, selecting a pre-defined pipeline for the block. You can also toggle `face_dimming` and `ambient_occlusion` booleans inside each instance to make block faces appear self-lit or flatly shaded.
| Block render_method | What it does | Notes |
|---|---|---|
| opaque | Solid surface with no transparency. | Default if omitted. Culls adjacent solid block faces. |
| alpha_test | Hard-edge cutout transparency, like glass panes or leaves. | Backfaces are culled unless you use a single-sided variant. |
| alpha_test_single_sided | Alpha test that explicitly culls backfaces. | Good for hollow block models where you do not want the inside faces visible. |
| blend | Smooth translucent blending, like stained glass or water. | Keep geometry simple to avoid sorting glitches with water or clouds behind the block. |
| double_sided | Opaque rendering with backface culling disabled. | Draws both sides of 0-thickness planes without enabling alpha cutouts. |
{
"format_version": "1.20.80",
"minecraft:block": {
"description": {
"identifier": "example:tinted_lantern"
},
"components": {
"minecraft:geometry": "geometry.tinted_lantern",
"minecraft:material_instances": {
"*": {
"texture": "tinted_lantern_frame",
"render_method": "alpha_test"
},
"glass": {
"texture": "tinted_lantern_glass",
"render_method": "blend",
"ambient_occlusion": false,
"face_dimming": false
}
}
}
}
}Defining Custom Entity Materials
When none of the vanilla entity materials match your needs—for example, if you want an `entity` material that disables backface culling while also using additive blending for a ghost effect—you can define a custom material in `RP/materials/entity.material`. This file merges with the vanilla material registry.
Custom materials use an inheritance syntax: `"custom_name:parent_name"`. By inheriting from a vanilla parent such as `entity_static` or `entity_alphatest`, your material automatically receives the correct RenderDragon shader and vertex definitions. You can then add or remove pipeline states using `+states` and `-states`, or alter how source and destination pixels combine using `blendSrc` and `blendDst`.
| Property / State | What it does | Notes |
|---|---|---|
| DisableCulling | State that renders both front and back faces of every polygon. | Added by default on `entity_alphatest`. Remove it with `-states` to cull backfaces on cutout models. |
| DisableDepthWrite | State that stops the surface from writing to the depth buffer. | Helps prevent translucent effects (like energy shields or ghosts) from occluding other translucent objects behind them. |
| Blending | State that enables the GPU blend equation. | Required if you want `blendSrc` and `blendDst` to take effect on an opaque parent material. |
| blendSrc / blendDst | Sets the blend factors for source (fragment) and destination (screen) colors. | Common values include `SourceAlpha`, `OneMinusSrcAlpha` (standard transparency), and `One` (additive glow). |
{
"materials": {
"version": "1.0.0",
"example_ghost:entity_alphablend": {
"+states": [
"DisableCulling",
"DisableDepthWrite"
],
"blendSrc": "SourceAlpha",
"blendDst": "One"
},
"example_solid_cull:entity_alphatest": {
"-states": [
"DisableCulling"
]
}
}
}Which versions this applies to
Client entity materials, render controllers, and RP/materials/entity.material work in all current Bedrock versions (1.8.0+ format) without experimental toggles. The block minecraft:material_instances component is stable in format_version 1.19.40 and above.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| Transparent parts of an entity texture render as solid black or white, or the entire model is opaque. | The client entity is still using the default `entity` material, which ignores the texture's alpha channel, or the render controller is referencing a material alias that was not declared in the `.entity.json` file. | Change the material in your client entity description to `entity_alphatest` (for cutout pixels) or `entity_alphablend` (for semi-transparent pixels), and verify the render controller uses the matching `Material.<alias>` name. |
| Content Log shows: "[Render][error]-RenderController '...' references material 'Material.glow' which was not found in entity" | The render controller asks for `Material.glow`, but the `materials` object inside the entity's `.entity.json` file either lacks a `"glow"` key or has a typo in the key name. | Open the `.entity.json` file and add `"glow": "entity_emissive_alpha"` (or your intended material identifier) under `description.materials`. |
| Glowing textures using `entity_emissive` or `entity_emissive_alpha` cause the entire mob to glow at full brightness in the dark. | Emissive materials treat any pixel with an alpha value below 255 as glowing. Many image editors export PNGs with slight alpha variations (like 254) or strip colour data from transparent pixels. | Ensure all non-glowing parts of your texture have a strict alpha value of 255 (100% opaque), and reduce the alpha slightly (for example, to 200–250) only on the exact pixels that should emit light. |
| See-through entity bones flicker or hide other parts of the same entity behind them depending on camera angle. | The entity uses `entity_alphablend`, which writes to the depth buffer while blending. If the game draws a front translucent bone before a back bone, the back bone is culled by the depth test. | Switch to `entity_alphatest` if you do not strictly need smooth partial transparency. If you must use blending, create a custom material inheriting from `entity_alphablend` and add `"DisableDepthWrite"` to `"+states"`. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
