Quick answer: Check three things: the camera’s Post Processing checkbox is enabled, the Volume Profile is a saved asset (not inline) referenced by a scene object, and your URP Renderer Data has post-processing enabled. Shader stripping during build can also silently remove post-processing shader variants.

Everything looks perfect in the editor — bloom glows, color grading is dialed in, vignette adds just the right amount of cinematic framing. You build the project, launch it, and the game looks flat. No bloom, no color grading, no vignette. Post-processing has silently vanished from your build. This is one of the most frequently reported URP issues, and it usually comes down to a missing checkbox, a profile reference problem, or shader stripping.

The Camera Post-Processing Checkbox

The simplest and most commonly missed setting: select your Main Camera in the scene hierarchy, scroll down to the Rendering section of the Camera component, and look for the Post Processing checkbox. If it’s not checked, the camera will ignore all Volume components in the scene, regardless of how they’re configured.

This checkbox is off by default when you create a new camera. If you replaced your camera at any point during development, or created a new scene without copying your camera settings, post-processing will silently be disabled.

This setting works in the editor because Unity’s Scene view has its own post-processing toggle that operates independently of the game camera. You might have post-processing enabled in the Scene view toolbar, see the effects while working, and never notice the game camera doesn’t have it enabled. The Game view in the editor correctly reflects the camera’s setting, so always check the Game view, not the Scene view, when verifying post-processing.

Volume Profile Reference Issues

URP post-processing uses Volumes — components attached to GameObjects that define a region (or global scope) where specific post-processing effects apply. Each Volume references a Volume Profile asset containing the effect overrides (bloom settings, color grading curves, etc.).

The critical distinction: Volume Profiles can be either inline (embedded in the Volume component) or saved as assets (standalone .asset files in your project). Inline profiles are convenient for quick testing but can cause build issues because they’re serialized differently.

For reliable builds, always use saved profile assets:

  1. In the Project window, right-click and select Create > Volume Profile.
  2. Add your desired overrides (Bloom, Color Adjustments, Vignette, etc.) to the profile.
  3. On your Volume component, set the Profile field to reference this asset.
  4. Do not click “New” on the Volume component to create an inline profile.

If your profile is a saved asset but still missing from builds, verify that the asset is referenced by at least one object in a scene that’s included in your build settings. Unity strips unreferenced assets during build. If the Volume is in a scene that’s not in the Build Settings scene list, the profile won’t be included.

// Editor script to find orphaned Volume Profiles
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;

public static class VolumeProfileChecker
{
    [MenuItem("Tools/Check Volume Profiles in Build")]
    static void Check()
    {
        var buildScenes = EditorBuildSettings.scenes;
        int found = 0;

        foreach (var buildScene in buildScenes)
        {
            if (!buildScene.enabled) continue;

            var scene = UnityEditor.SceneManagement.EditorSceneManager
                .OpenScene(buildScene.path, UnityEditor.SceneManagement.OpenSceneMode.Additive);

            var volumes = Object.FindObjectsByType<Volume>(FindObjectsSortMode.None);
            foreach (var vol in volumes)
            {
                if (vol.profile != null)
                {
                    Debug.Log($"Scene '{scene.name}': Volume '{vol.name}' -> Profile '{vol.profile.name}'");
                    found++;
                }
                else if (vol.sharedProfile != null)
                {
                    Debug.Log($"Scene '{scene.name}': Volume '{vol.name}' -> SharedProfile '{vol.sharedProfile.name}'");
                    found++;
                }
                else
                {
                    Debug.LogWarning($"Scene '{scene.name}': Volume '{vol.name}' has NO profile assigned");
                }
            }
        }

        Debug.Log($"Found {found} volume profile references across build scenes");
    }
}
#endif

URP Renderer Data Configuration

The URP Renderer Data asset (usually named something like ForwardRenderer or UniversalRendererData) controls rendering features at the pipeline level. If post-processing is disabled here, it’s disabled everywhere, regardless of camera and volume settings.

Find your active URP Renderer Data asset: go to Edit > Project Settings > Graphics, click on the assigned Scriptable Render Pipeline Settings asset (your URP Asset), and look at the Renderer List. Click on the renderer to select it.

In the Renderer Data inspector, verify:

Also check the URP Asset itself (the pipeline asset, not the renderer). Under the Post-processing section, ensure the feature set is not set to a stripped-down configuration. On mobile-targeted URP assets, some post-processing features are disabled by default for performance.

Shader Stripping in Builds

Unity aggressively strips unused shader variants during build to reduce build size. This is normally helpful, but it can accidentally strip post-processing shader variants that the build system doesn’t detect as needed.

This is especially common when:

To diagnose shader stripping issues, enable shader compilation logging in Project Settings > Graphics > Shader Stripping. Set the Log Level to “All” temporarily and rebuild. Check the Editor.log for lines indicating stripped URP post-processing shaders.

If stripping is the problem, you can force-include the required shaders by adding them to the Always Included Shaders list in Graphics settings, or by referencing the post-processing shaders from a script in a scene:

// Attach to any GameObject in your first scene to prevent shader stripping
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class PostProcessShaderKeeper : MonoBehaviour
{
    // These references prevent Unity from stripping the shaders
    [SerializeField] VolumeProfile referenceProfile;

    void Awake()
    {
        // This component exists only to maintain shader references
        // The profile should have all post-processing effects you use
    }
}

Quick Diagnostic Checklist

When post-processing disappears in a build, work through this list in order:

  1. Camera > Rendering > Post Processing checkbox: is it enabled?
  2. Is there a Volume component in the scene with Is Global checked?
  3. Does the Volume have a Profile assigned (not null, not inline)?
  4. Is the scene containing the Volume included in Build Settings?
  5. Does the Volume Profile have at least one override with active checked and values overridden?
  6. Is the URP Renderer Data properly configured and assigned to the URP Asset?
  7. Do you have both the old Post Processing Stack v2 and URP installed? Remove the old package.
  8. Check the Player log after build for shader compilation errors or warnings.

Work through each item and you’ll almost certainly find the culprit. In the rare case where everything checks out, try creating a minimal reproduction: a new scene with one camera, one Global Volume, and one effect. Build and test. If that works, the issue is scene-specific and you can narrow it down from there.

The Post Processing checkbox on the camera is off by default. That one checkbox is responsible for about half of all “post-processing doesn’t work” threads on the Unity forums.