The Visual Pipeline
Unlike blocks or items, which can often render with a single texture and a simple definition, entities use a multi-step rendering pipeline. This separation allows a single entity to swap models, change skins, or alter its transparency dynamically based on what is happening in the game world.
At the center of this pipeline is the Client Entity definition file. This file does not render anything on its own; instead, it acts as a directory. It assigns short, local names (aliases) to the actual assets scattered across your resource pack folders. Those aliases are then passed to a Render Controller, which decides which combination of model, texture, and material to draw on any given frame.
| Asset Type | RP Folder | Role in the Pipeline |
|---|---|---|
| Client Entity | RP/entity/ | Binds the entity identifier to resource aliases, scripts, and spawn egg colors. |
| Render Controller | RP/render_controllers/ | Uses Molang logic to pick which geometry, material, and texture aliases to display. |
| Geometry | RP/models/entity/ | Defines the 3D bones, cubes, and UV mappings of the model. |
| Texture | RP/textures/entity/ | The 2D image file wrapped around the geometry's UV coordinates. |
| Animations | RP/animations/ | Rotates, scales, and moves the bones of the geometry over time. |
| Animation Controllers | RP/animation_controllers/ | State machines that trigger animations, sounds, or particles based on Molang queries. |
The Client Entity File
Every custom entity needs a file in the RP/entity/ directory. The identifier in this file must match the identifier in the Behavior Pack's entity file exactly. If they do not match, the entity will still exist and function in the world, but it will be completely invisible (except for its shadow).
Inside the description object, you map short names—like 'default'—to the actual asset paths or identifiers. Using 'default' as your primary key is standard practice in Bedrock because it allows you to reuse built-in vanilla render controllers without writing your own from scratch.
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "wiki:copper_golem",
"materials": {
"default": "entity_alphatest"
},
"textures": {
"default": "textures/entity/copper_golem"
},
"geometry": {
"default": "geometry.copper_golem"
},
"render_controllers": [
"controller.render.default"
],
"spawn_egg": {
"base_color": "#b8674b",
"overlay_color": "#4f9478"
}
}
}
}How Render Controllers Connect Assets
A render controller is the bridge that actually puts the entity on the screen. In the client entity example above, we referenced controller.render.default. This is a built-in vanilla render controller that simply looks for a geometry named 'default', a texture named 'default', and a material named 'default', and draws them together.
When you want an entity to have multiple visual states—such as a sheep with sheared wool, or a golem that oxidizes over time—you write a custom render controller. Render controllers use Molang expressions to pick from arrays of textures or geometries, and apply materials to specific bone groups using wildcard matching (an asterisk means 'apply to all bones').
{
"format_version": "1.8.0",
"render_controllers": {
"controller.render.copper_golem": {
"geometry": "Geometry.default",
"materials": [
{
"*": "Material.default"
}
],
"textures": [
"Texture.default"
]
}
}
}Choosing the Right Material
Materials tell the game's rendering engine how to handle transparency, culling, and lighting on your entity's texture. While you can define custom material files, most add-on creators rely on the standard vanilla entity materials already loaded by the game.
Picking the wrong material is a frequent source of visual bugs. If your texture has transparent cutouts (like wings or tattered cloth) and those areas render as solid black or white in-game, it means you are using an opaque material instead of an alpha-tested one.
| Vanilla Material | Transparency Support | Best Used For |
|---|---|---|
| entity | None (Opaque) | Solid mobs with no transparent pixels, such as pigs or cows. Best for performance. |
| entity_alphatest | Hard edges only (0% or 100% opacity) | Mobs with cutouts, hollow areas, or flat planes like hair and foliage. |
| entity_alphablend | Partial transparency (translucent) | Ghosts, slimes, or stained glass effects. Can cause depth-sorting visual glitches if overused. |
| entity_emissive | None (Opaque, glows in the dark) | Mobs whose transparent texture pixels act as a glow map, ignoring world lighting. |
| entity_emissive_alpha | Hard edges + glow | Mobs that need both cutout transparency and glowing eyes or markings. |
Driving Animations with Scripts
Models are static until animations move their bones. Just like textures and geometry, animations and animation controllers are given short names in the client entity file. However, simply listing them in the animations object does not make them play.
To actually run an animation, you use the scripts.animate array inside the client entity description. This array runs every frame and evaluates Molang conditions or triggers animation controllers. In format version 1.10.0, you can either list the short name directly to make it run constantly, or map the short name to a Molang expression so it only runs when that expression is true.
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "wiki:copper_golem",
"materials": {
"default": "entity_alphatest"
},
"textures": {
"default": "textures/entity/copper_golem"
},
"geometry": {
"default": "geometry.copper_golem"
},
"animations": {
"walk": "animation.copper_golem.walk",
"look_at_target": "animation.common.look_at_target"
},
"scripts": {
"animate": [
"look_at_target",
{
"walk": "query.modified_move_speed > 0.1"
}
]
},
"render_controllers": [
"controller.render.default"
]
}
}
}Which versions this applies to
Applies to Minecraft Bedrock 1.10.0 and newer. Client entities use format_version 1.10.0, render controllers use 1.8.0, and modern geometry files use 1.12.0. No experimental toggles are required for any of these visual systems.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| The entity spawns in the world (you can see its shadow and hear its sounds), but the model is completely invisible. | Either the identifier in the RP client entity file does not match the BP entity identifier, or the geometry identifier in your client entity file does not match the identifier inside your model's JSON file. | Check the Content Log for '[RenderController] Could not find geometry' warnings. Verify that both the entity identifier and geometry.your_model_name match character-for-character across all files. |
| The entity renders with a pink and black checkerboard pattern across its entire body. | The game found the geometry and render controller, but could not locate the texture file at the path specified in the client entity definition. | Check the textures object in your RP/entity/ file. Ensure the path starts with 'textures/...' (do not include the file extension like .png) and that the actual image file is saved in that exact folder. |
| Transparent parts of the texture appear solid black or white on the entity. | The entity is using the standard 'entity' material, which disables alpha channel rendering to save performance. | Change the material in your client entity file from 'entity' to 'entity_alphatest' for cutout transparency, or 'entity_alphablend' for semi-transparent pixels. |
| Content Log Error: [Molang] Error: unhandled request for unknown variable 'Texture.default' | Your render controller is asking for an alias named 'default', but you named the texture something else (like 'skin_1') in the client entity file. | Ensure the short names defined in your client entity's textures, materials, and geometry objects match the exact names called by your render controller. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
