What Is POM (Parallax Occlusion Mapping)?
The shader trick that makes flat Minecraft blocks look like they have real, physical depth — raised bricks, sunken cobblestone gaps, chunky gravel. Here's what it actually does and how to turn it on.
POM (Parallax Occlusion Mapping) is a shader effect that reads a grayscale height map for each block and shifts the texture per-pixel so the surface appears to have real 3D depth — bricks look raised and mortar looks recessed — even though the block face is still perfectly flat. It needs both a PBR resource pack that ships height maps and a shader (Iris or OptiFine) to read them.
POM in plain English
Every block in Minecraft is, geometrically, a flat square. A cobblestone face isn't really lumpy — the lumps are painted on. Normally your eye accepts that, but the moment light moves across the surface the illusion breaks: a flat painting of cobblestone never casts little shadows into its own cracks.
Parallax is the everyday effect where nearer things shift more than farther things as you move your head — like fence posts sliding past a distant hill out a car window. Parallax Occlusion Mapping brings that effect to a texture: as you walk around a block or as you look at it from an angle, the raised parts of the texture shift slightly more than the deep parts, and the deep parts get occluded (hidden) behind the raised ones. Your brain reads those shifts as genuine depth.
The payoff is that a brick wall stops looking like wallpaper and starts looking like a wall. Mortar lines sink in, individual bricks pop out, gravel reads as a pile of stones rather than a photo of stones. It is one of the biggest single jumps in realism you can add, which is why nearly every realistic shader setup leans on it.
Height maps + depth
POM can't guess where a texture is high or low — it has to be told. That information lives in a height map (also called a displacement or depth map): a grayscale image, one per block, where brightness encodes elevation. The convention used by most modern Minecraft packs is straightforward:
- White (bright) = the highest part of the surface, closest to you.
- Black (dark) = the deepest part, the bottom of a crack or groove.
- Grays in between = everything between those two extremes.
When the shader draws a block, it walks a virtual ray into the surface and uses
the height map to work out where that ray would actually hit the bumpy geometry —
then it samples the colour texture at that shifted point instead of the
flat one. Repeat for every pixel and the flat face convincingly recedes and
protrudes. This is also why POM and a good normal map work so well
together: the height map drives the displacement while the normal map drives the
per-pixel lighting, both halves of the same illusion.
In practice the height map is part of a wider PBR (physically based rendering) texture set. In the LabPBR standard that Java shaders expect, height is packed into the alpha channel of the normal/specular texture rather than shipped as a separate file — but conceptually it is still the same grayscale depth information. Optimum Realism authors these height maps by hand for each block, which is what lets POM behave correctly instead of guessing.
Enabling POM (settings)
POM is a shader feature, not a vanilla one. You need three things lined up: a height-mapped pack, a shader that supports parallax, and the right toggle. The path depends on whether you run a modern shader loader or OptiFine.
With Iris (Fabric) — recommended on modern versions
Install Fabric and Iris, drop a shader that supports parallax into the
shaderpacks folder, and load it from Video Settings → Shader Packs.
Open the selected pack's Shader Pack Settings and look for a
Parallax or POM toggle (often under a "Surface" or
"Material" sub-menu). You can usually set a parallax depth or
quality/sample count there too. Our step-by-step
shader install guide covers the
Fabric + Iris setup in full.
With OptiFine
POM also works the classic OptiFine way. After installing OptiFine, go to Options → Video Settings → Shaders and pick a parallax-capable shader, then enable parallax in that shader's options. If you only want bump/depth without a full shader pack, make sure Custom Entity Models and the connected / natural textures options are enabled and that you've loaded a PBR pack — but the strongest, most consistent POM comes from a real shader.
The part people miss
If you enable POM and nothing changes, the usual cause is the pack: vanilla and most stylised packs have no height maps, so there's nothing to displace. Load a PBR pack such as Optimum Realism first. Optimum Realism is free at 64x (height maps included) with higher resolutions on Patreon, supports Java PBR and Bedrock RTX, and is built so POM-aware shaders read its depth correctly out of the box.
POM vs normal mapping
POM and normal mapping are easy to mix up because both make flat blocks look bumpy — but they do different jobs, and the best packs use both.
A normal map stores a direction for each pixel (which way that tiny patch of surface is "facing"). The shader uses those directions to light the surface, so a flat brick gets believable highlights and shadows as if it were bumpy. The catch: the geometry is still flat. View a normal-mapped wall from a steep angle and it gives itself away — the "bumps" don't shift or block each other, because nothing is actually sticking out.
POM adds the missing half: it actually shifts the texture using the height map, so high parts move in front of low parts and can hide them. That's the word occlusion — near surfaces occluding far ones. The result holds up at angles where a normal map alone would look flat. In short:
- Normal mapping = fakes the lighting of depth (cheap, no height map shift).
- POM = fakes the parallax of depth too (more costly, needs a height map).
You don't pick one or the other. A realistic pack ships a normal map and a height map per block; the shader lights with the normal map and displaces with the height map. Turn POM off and the textures don't vanish — they just flatten back to normal-mapped lighting. If yours look flat or oddly plastic even with a pack loaded, see why textures look flat or shiny.
Performance cost
POM isn't free. Where a normal map is essentially a single lookup, POM marches a ray through the height map taking several samples per pixel to find where the surface really is. More samples means smoother, deeper-looking displacement — and more work for your GPU. The exact frame-rate hit depends entirely on your hardware, shader, resolution, and how high you push the POM quality, so treat it as a meaningful cost rather than a fixed number.
A few honest expectations:
- It scales with quality settings. Most shaders expose a POM sample count or depth slider. Lowering it is the first, biggest, easiest performance win if POM is costing you frames.
- It interacts with resolution. Running POM on a 512x pack asks far more of the GPU than on a 64x pack. If you're on weaker hardware, a lower-resolution PBR pack with POM often looks better and runs better than a huge pack with POM off — one reason the free 64x Optimum Realism is a sensible starting point.
- Artefacts at glancing angles. Because POM is an illusion on a flat face, very shallow viewing angles and block edges can smear or "swim". Shaders with silhouette/sloped POM handle this better; reducing parallax depth also helps.
If POM is tanking your FPS, you don't have to abandon realism — drop the sample count, lower the pack resolution, or trim other shader effects first. Our guide to boosting FPS with shaders and texture packs walks through the settings that buy back the most performance.
FAQ
Does POM work on Minecraft Bedrock?
Not as a separate setting. Java Edition exposes POM through OptiFine or a shader loader like Iris. On Bedrock, depth comes from the RTX path tracer reading the heightmap channel of an RTX-enabled pack instead — same idea, different engine.
Do I need a special texture pack for POM?
Yes. POM needs a height map for each block, and vanilla textures have none, so the effect does nothing on its own. You need a PBR resource pack that ships height maps — such as Optimum Realism — plus a shader that reads them.
What is the difference between POM and bump mapping?
Normal (bump) mapping only changes how light hits a flat surface, so it fakes shading but the surface stays flat at glancing angles. POM also shifts the texture by sampling a height map, so deep grooves actually appear to recede and can hide what's behind them.
Why does POM look wrong or warped at the edges?
POM is an illusion drawn on a flat block face, so at very shallow viewing angles or on block edges the displacement can smear or swim. Lowering the parallax depth in the shader, or using a shader with silhouette/sloped POM, reduces the artefacts. Other texture oddities are covered in our FAQ.
Get the depth without the guesswork
Optimum Realism ships hand-authored height and normal maps so POM-aware shaders read your blocks correctly — free at 64x, with higher resolutions on Patreon, for Java PBR and Bedrock RTX.
Download Optimum Realism New here? Read the install guide.