Guide

Game post-processing explained

Post-processing is everything that happens after the main 3D scene renders but before pixels hit the display. It is where flat geometry becomes atmosphere: sun flares bloom across the lens, shadows gain contact depth, motion blur sells speed, and a color grade ties the whole frame to a mood. Engineers often treat post as optional polish; players treat it as the difference between a tech demo and a game that feels finished. This guide walks through the render pipeline, the effects teams reach for first, how fragment shaders implement them, and the performance budgets that keep frame timing stable on PC, console, and browser.

Where post-processing sits in the pipeline

A typical real-time frame begins with geometry passes — opaque meshes, skinned characters, terrain — writing color and depth into render targets. Transparent objects, particles, and UI often follow in separate passes. Only then does the post stack run: a chain of full-screen fragment passes that read the scene color (and sometimes depth, normals, or velocity buffers) and write a new image.

Modern engines use HDR (high dynamic range) internally: lighting values can exceed 1.0 before tonemapping compresses them for an SDR monitor. That headroom is what makes bloom and exposure feel natural — a torch flame can be genuinely bright without clipping to white. The final pass usually applies tonemapping (ACES, Reinhard, or engine-specific curves) plus gamma correction so linear lighting math displays correctly on sRGB screens.

Post effects are screen-space: they operate on 2D buffers, not world geometry. That makes them fast to iterate in art direction but introduces artifacts when depth discontinuities confuse an effect (SSAO halos at object edges, DOF bleeding through thin fences). Understanding those limits is as important as tuning intensity sliders.

Core effects and what each one buys you

Bloom and lens glow

Bloom extracts pixels above a brightness threshold, blurs them in multiple downsampled passes (often a separable Gaussian), and adds the result back to the scene. It sells emissive materials, magic spells, neon signs, and harsh sunlight. Threshold and knee parameters control whether only specular highlights glow or entire bright regions bloom. Over-bloom washes contrast; under-bloom makes HDR lighting feel clinical.

SSAO and ambient occlusion

Screen-space ambient occlusion (SSAO) darkens creases, corners, and contact points where ambient light would struggle to reach. It reads as weight and grounding — characters feel planted on floors instead of floating. Variants like HBAO+ or GTAO improve quality at higher sample counts. SSAO is cheap relative to ray-traced GI but fails on off-screen occluders and thin geometry; artists compensate with baked AO in albedo textures.

Depth of field

Depth of field (DOF) simulates camera focus: objects outside the focal plane blur based on depth buffer distance. Cinematic modes use it heavily; gameplay modes often disable it or use subtle background blur only because blurring the reticle or UI-adjacent targets hurts readability. Bokeh shapes (hexagonal highlights) add film character at extra cost. CoC (circle of confusion) radius should scale with resolution — the same pixel blur radius looks harsher at 4K than 1080p.

Motion blur

Motion blur smears pixels along velocity vectors from the previous frame (per-object) or camera rotation (camera blur). It hides stutter at lower frame rates and sells fast movement. Per-object blur needs a velocity buffer; camera-only blur is cheaper. Many competitive titles disable it entirely because it reduces edge clarity during aim. If you ship it, offer a toggle — photosensitivity guidelines also apply to rapid full-screen smear.

Color grading and LUTs

Color grading shifts hue, saturation, and contrast for mood: cold blue for horror, warm orange for desert noon, desaturated green for military fiction. Engines apply a 3D LUT (lookup table) — a small texture that remaps RGB — or a stack of lift/gamma/gain wheels. Grading should cooperate with lighting design: if the grade crushes shadows, level artists compensate with fill lights that fight the grade. Document a neutral "reference" grade for QA screenshots.

Anti-aliasing: FXAA, SMAA, TAA

Jagged edges come from rasterizing triangles at finite resolution. FXAA is a cheap edge blur; SMAA detects patterns more intelligently; TAA (temporal anti-aliasing) reprojects history frames using motion vectors for stable, soft edges. TAA looks best in motion but ghosts on transparent particles and UI unless excluded. Browser WebGL titles often rely on MSAA on the main framebuffer or FXAA as a final pass when TAA is unavailable.

Vignette, chromatic aberration, film grain

These are cheap stylistic layers. Vignette darkens corners to focus attention center-screen. Chromatic aberration splits RGB channels slightly at edges — use sparingly; constant CA reads as a broken lens. Film grain hides banding in gradients and adds texture to flat UI-backdrop scenes. All three should be optional in accessibility settings; grain in particular can worsen compression artifacts in streamed video capture.

Render targets, pass order, and dependencies

Post stacks are not arbitrary — order matters. A common PC/console sequence:

  1. Render scene to HDR color + depth (+ motion vectors if using TAA or motion blur)
  2. SSAO using depth and normals
  3. Combine SSAO with scene color
  4. Bloom extract and blur passes
  5. DOF (reads depth)
  6. Motion blur (reads velocity)
  7. TAA (needs history buffer; often ping-pongs two HDR targets)
  8. Tonemap + color grade + gamma
  9. FXAA or UI composite (UI often rendered after post to stay sharp)

Each pass is a draw call rendering a full-screen triangle with a dedicated material. Half-resolution effects (bloom blur, SSAO) cut fill rate roughly fourfold at the cost of upsampling artifacts. Mobile pipelines merge steps aggressively: skip TAA, use fixed exposure, bake grade into LUT only, and cap bloom iterations.

Ping-pong buffers alternate read/write targets so passes do not read and write the same texture simultaneously — a GPU hazard. Engines expose this as a post-process volume or scriptable render pipeline (SRP) feature block; custom engines need explicit target management.

Quality presets and platform trade-offs

Ship at least Low / Medium / High / Ultra presets tied to measurable costs, not vanity labels. Low might disable DOF and motion blur, run SSAO at quarter resolution, and use FXAA. Ultra adds higher sample counts and full-resolution bloom. Console titles often lock presets to platform tier; PC exposes sliders per effect because GPU headroom varies wildly.

Browser and WebGL games face tighter limits: no guaranteed compute, limited MRT (multiple render target) support on older mobile GPUs, and no automatic TAA history management. Practical approach: render at device pixel ratio capped at 1.5, use a single combined post material with #ifdef feature flags, and profile on mid-tier Android. Pair with particle overdraw awareness — bloom amplifies bright particles; unbounded VFX plus bloom destroys fill rate.

VR demands minimal motion blur, stable TAA or MSAA, and conservative DOF — focus mismatch causes discomfort. Competitive multiplayer prioritizes clarity: disable film grain, vignette, and heavy DOF; keep SSAO subtle so enemies in shadow remain readable.

Performance budgeting

Post-processing cost is mostly fill rate — pixels touched times passes. Profile with GPU timers per pass. Rules of thumb for 1080p targets:

  • SSAO at half res: 0.3–1.0 ms on mid-range discrete GPUs
  • Bloom (5 mip downsamples): 0.5–1.5 ms depending on radius
  • TAA: 0.4–0.8 ms plus memory for history
  • DOF full quality: 1–3 ms; often cut first on budget

Use scalable resolution (render scale 80–90%) before deleting art-directed bloom entirely — players notice softness less than they notice missing glow on a flagship boss. Dynamic resolution scaling tied to frame time keeps post enabled longer on struggling hardware.

Memory matters too: HDR color (RGBA16F), depth (D24 or D32), velocity (RG16F), SSAO output, bloom chain mips, and TAA history can exceed 100 MB at 1440p. Reuse transient targets within the frame where the API allows (Vulkan render passes, D3D12 placed resources, Metal heap allocation).

Art direction vs engineering defaults

Engine defaults (ACES tonemapper, generic bloom) produce the "every Unreal game looks the same" criticism. Art direction should own:

  • Exposure: auto-exposure speed and min/max EV clamps for indoor/outdoor transitions
  • Bloom response: which emissive values bloom and by how much
  • Grade LUT: one LUT per biome or time-of-day, blended during transitions
  • Sharpness: counter-TAA softness with a conservative unsharp mask only if needed — oversharpening moire is worse

Capture reference frames early: a greybox room, a exterior vista, a dark interior, and a VFX-heavy combat shot. Tune post against those four before locking for production. When lighting changes late, revalidate SSAO and bloom — bright new fill lights change threshold behavior.

Anti-patterns to avoid

  • Post as a crutch for bad lighting — crushing blacks in grade instead of fixing light placement.
  • Unbounded bloom radius — entire screen milky white; HUD unreadable.
  • DOF during gameplay — player cannot see threats at screen edges.
  • TAA without velocity writes on skinned meshes — smeary characters and ghost weapons.
  • UI through post stack — text blurs and colors shift; composite UI after tonemap.
  • Identical presets on Switch and RTX 4090 — one side stutters, the other wastes capability.
  • No disable toggles — accessibility and competitive players need clean image options.
  • Ignoring photosensitivity — pulsing bloom tied to damage flashes without a reduce-flashes setting.

Production checklist

  • Document HDR format (RGBA16F vs RGB11F) and tonemapper choice with reference screenshots.
  • Define pass order diagram; mark which passes are half-resolution.
  • Ship quality presets with per-effect toggles on PC; map console tiers explicitly.
  • Exclude UI, reticle, and text from DOF, motion blur, and heavy TAA.
  • Validate TAA velocity buffer coverage on all animated meshes.
  • Profile bloom + particles together on worst-case combat scenes.
  • Author biome/time-of-day LUTs; test neutral grade for QA comparison.
  • Auto-exposure: set adaptation speed and EV limits for cave-to-sky transitions.
  • Add accessibility toggles: motion blur, film grain, chromatic aberration, reduce flashes.
  • Web builds: test post material fallbacks when float textures unsupported.
  • Capture trailer footage with same preset players use — avoid "trailer only" grades.
  • Regression test: screenshot diff four reference frames each release.

Key takeaways

  • Post-processing is the cinematic layer — it runs on screen-space buffers after the main scene, not on geometry.
  • HDR plus tonemapping unlock bloom and exposure — linear lighting math needs a final compress step for displays.
  • Order and resolution matter — half-res SSAO and bloom save fill rate; pass dependencies prevent GPU hazards.
  • Clarity beats polish in gameplay — DOF, motion blur, and heavy grain belong in cinematics or optional presets.
  • Budget per pass and preset honestly — scalable resolution preserves art direction longer than disabling the whole stack.

Related reading