How the Fog Stack Works
Bedrock Edition does not simply apply one fog setting at a time; instead, it evaluates a prioritized list called the fog stack. Every player has an individual fog stack managed by the client. At the absolute bottom of this stack sits the default fallback fog, which only renders if no biome or command provides valid settings. Directly above the default layer is the biome fog layer, which updates automatically as the player walks across chunk borders into different biomes.
Above the biome layer sits the command layer, controlled via the /fog command or script APIs. When you push a fog ID to a player using a command, you must also supply a user-defined ID string. This string acts as a handle, allowing you to pop or remove that specific fog instance later without accidentally clearing other environmental fogs. If multiple fogs are pushed to the command layer, the most recently pushed fog takes priority at the top of the stack.
Finally, active status effects like Blindness or Darkness override the standard stack behavior for distance rendering, forcing the fog start and end planes immediately in front of the camera regardless of what biome or command fog is currently active.
Overworld Fog IDs
The Overworld relies heavily on biome-specific fog definitions to subtly shift the sky and horizon color between cold, temperate, and warm regions. While most standard surface biomes share the exact same distance values in vanilla, they remain separated by unique identifiers so resource pack creators can customize individual regions without affecting the entire dimension. For example, replacing the swampland fog allows you to create a murky, close-range atmosphere in swamps while leaving adjacent plains completely clear.
When referencing these in commands or custom biome files, always include the minecraft: namespace. Omitting the namespace in a custom biome client definition will cause the game to look for a custom fog under a missing namespace and fall back to the default engine fog.
| Fog Identifier | Associated Biome / Usage | Visual Notes |
|---|---|---|
| minecraft:fog_default | Global fallback | Standard blue-white horizon used when a biome lacks an explicit mapping. |
| minecraft:fog_plains | Plains, Sunflower Plains | Standard clear visibility across air and water. |
| minecraft:fog_forest | Forest, Wooded Hills | Identical to plains in vanilla, isolated for resource pack overrides. |
| minecraft:fog_taiga | Taiga, Cold Taiga, Mega Taiga | Slightly cooler sky tint in certain lighting configurations. |
| minecraft:fog_swampland | Swamp, Swamp Hills | Murkier water fog settings with reduced underwater visibility. |
| minecraft:fog_desert | Desert, Desert Hills | Warm atmospheric haze during weather transitions. |
| minecraft:fog_extreme_hills | Mountains, Gravelly Mountains | Standard high-altitude clear visibility. |
| minecraft:fog_jungle | Jungle, Jungle Edge, Bamboo Jungle | Increased humidity density for volumetric configurations. |
| minecraft:fog_savanna | Savanna, Savanna Plateau | Warm horizon blend matching arid sky colors. |
| minecraft:fog_mesa | Badlands, Eroded Badlands | Warm dust tint on the far distance plane. |
| minecraft:fog_ice_plains | Snowy Tundra, Ice Spikes | Crisp distance rendering with icy water fog properties. |
| minecraft:fog_mushroom_island | Mushroom Fields | Isolated ID for mycelium island atmospheres. |
| minecraft:fog_ocean | Ocean, Deep Ocean | Standard open water visibility. |
| minecraft:fog_lukewarm_ocean | Lukewarm Ocean | Lighter cyan underwater fog color and slightly further end distance. |
| minecraft:fog_warm_ocean | Warm Ocean | Brightest and clearest underwater fog settings in the Overworld. |
| minecraft:fog_cold_ocean | Cold Ocean | Darker blue underwater haze with tighter visibility limits. |
| minecraft:fog_frozen_ocean | Frozen Ocean, Deep Frozen Ocean | Very dark underwater visibility under ice sheets. |
| minecraft:fog_river | River, Frozen River | Freshwater tint, distinct from ocean blue. |
| minecraft:fog_beach | Beach, Snowy Beach, Stone Shore | Transitional coastal atmosphere. |
| minecraft:fog_cherry_grove | Cherry Grove | Soft pastel horizon tinting introduced for cherry biomes. |
| minecraft:fog_mangrove_swamp | Mangrove Swamp | Dense greenish-brown underwater fog and humid air settings. |
| minecraft:fog_deep_dark | Deep Dark | Standard underground air values; darkness pulses are handled by effects, not this ID. |
| minecraft:fog_lush_caves | Lush Caves | Underground atmospheric lighting support. |
| minecraft:fog_dripstone_caves | Dripstone Caves | Standard subterranean distance planes. |
Nether and End Fog IDs
Unlike the Overworld, where fog primarily blends the far render distance border into the skybox, Nether fogs are aggressive and close-range. They use fixed distance values rather than render-distance multipliers in certain modes, obscuring terrain to create a claustrophobic atmosphere and hide unloaded chunks inside the dimension ceiling. Each Nether biome uses a distinct fog color to dramatically shift the mood as players travel.
The End dimension uses a single identifier across the central island and outer void islands, producing a dark, starless purple-black horizon.
| Fog Identifier | Associated Biome | Visual Notes |
|---|---|---|
| minecraft:fog_hell | Nether Wastes | Classic dull red haze at medium-close distance. |
| minecraft:fog_crimson_forest | Crimson Forest | Rich, saturated dark red atmosphere. |
| minecraft:fog_warped_forest | Warped Forest | Deep cyan and purple-tinted alien haze. |
| minecraft:fog_soulsand_valley | Soul Sand Valley | Bright turquoise fog that contrasts with soul fire. |
| minecraft:fog_basalt_deltas | Basalt Deltas | Thick, desaturated lilac-gray ash atmosphere with reduced visibility. |
| minecraft:fog_the_end | The End | Dark void purple horizon with standard distance limits. |
| minecraft:fog_powder_snow | Powder Snow Block | Pushed dynamically by the engine when a camera enters a powder snow block. |
Defining a Custom Fog in a Resource Pack
You can create completely new fog identifiers or override the vanilla IDs listed above by placing a JSON file in the RP/fogs/ directory of your resource pack. The file name does not dictate the identifier; the identifier inside the description object is what commands and biome files actually read.
A fog definition is split into two primary parts: distance and volumetric. The distance object controls standard linear fog for different camera media (air, water, weather, lava). Setting render_distance_type to render makes the fog_start and fog_end values act as multipliers of the player's current video settings (from 0.0 to 1.0). Setting it to fixed interprets those numbers as exact block distances from the camera, which is useful for blinding sandstorms or pitch-black dungeons.
{
"format_version": "1.16.100",
"minecraft:fog_settings": {
"description": {
"identifier": "my_pack:fog_toxic_swamp"
},
"distance": {
"air": {
"fog_start": 4.0,
"fog_end": 28.0,
"fog_color": "#4E6B2C",
"render_distance_type": "fixed"
},
"water": {
"fog_start": 0.0,
"fog_end": 8.0,
"fog_color": "#2A3B17",
"render_distance_type": "fixed"
},
"weather": {
"fog_start": 2.0,
"fog_end": 16.0,
"fog_color": "#394F21",
"render_distance_type": "fixed"
}
}
}
}Assigning Fog IDs to Biomes and Commands
To make a biome use a vanilla or custom fog ID without running commands, bind it inside RP/biomes_client.json. Every biome key in this file accepts a fog_identifier string alongside its water surface color and transparency settings. This file applies to both vanilla biome overrides and custom biomes created in your behavior pack.
Notice that biomes_client.json does not use the standard minecraft: prefix on the biome object keys themselves, except when necessary for custom namespaces, though the fog_identifier value always requires its full namespace.
{
"biomes": {
"swampland": {
"water_surface_color": "#4c6559",
"water_surface_transparency": 1.0,
"fog_identifier": "my_pack:fog_toxic_swamp"
}
}
}Which versions this applies to
Applies to Minecraft Bedrock 1.16.100 and newer. No experimental toggles are required to create custom fog JSON files, use RP/biomes_client.json, or run the /fog command.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| Running /fog @s remove results in an error or leaves the player's screen permanently covered in custom fog. | The /fog command does not remove fog by the fog identifier itself; it removes entries by the user_provided_id string you invented when you ran the push subcommand. | Ensure your push command uses a memorable handle, such as /fog @s push my_pack:fog_toxic_swamp toxic_layer, and then clear it using /fog @s remove toxic_layer. |
| Content Log displays: [Fogs][error] fog_end must be greater than fog_start, and the fog falls back to default white. | Inside your RP/fogs/ JSON file, one of the camera states (air, water, lava, or weather) has a fog_start number that is equal to or higher than fog_end. | Make sure fog_end is strictly greater than fog_start. Also verify you did not mix up fixed block values (like 32.0) with render multiplier values (which must be between 0.0 and 1.0 when render_distance_type is set to render). |
| Custom fog works when pushed via /fog command, but refuses to show up naturally in the biome assigned in biomes_client.json. | Either the player still has an active command fog sitting higher on their fog stack, or the biome name key inside RP/biomes_client.json is misspelled. | Run /fog @s pop or test in a fresh world to guarantee the command layer of the fog stack is empty, and verify the biome key matches the exact identifier used in the behavior pack. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
