Color/Gradient Banding from Lit Material using Movable Light?

When using the Lit Material, if I decrease the brightness too low, I can get very bad color/gradient banding.

Here’s an example of the color tester texture (it’s the color checker at “/Engine/EditorMeshes/ColorCalibrator/Color_checker”, and I changed the compression to “BC7 (DX11, optional A)”, and all other settings on the texture are unchanged) using a Lit Material (also including the Material Graph):

The only light in the scene is a movable directional light, and it is pointed directly at the surface I posted above. The color is fully white and I’ve modified the intensity so that it can match the brightness of the Unlit Material I’m using for comparison.

For the Unlit Material (using the same color checker texture) I just darkened the emission so that it matches as closely to the brightness of the Lit Material as possible. With this Unlit Material, I see no visible color/gradient banding.

I checked several settings and I’ve verified that the color/gradient banding goes away likely due to the dithering that’s added by the Tonemapper. That is, if I turn off the Tonemapper, I get color banding on the Unlit Material.

Unfortunately, this dithering added by the Tonemapper does not apply to the Lit Material.

Does anyone know how to fix the color/gradient banding for the Lit Material?

I’m using UE 4.27.2

1 Like

After digging further, it seems that this problem is caused by how light works in the Deferred rendering pipeline in Unreal.

When I switched to using Forward rendering, the color/gradient banding was no longer present for the same testing setup. The Unlit and Lit textures displayed almost exactly the same output (brightness was corrected so the Unlit and Lit textures have almost the same brightness). The Tonemapper dithers away the banding in both the Unlit and Lit textures, and not just the Unlit texture as seen in Deferred rendering.

I also tested this exact setup in Deferred and Forward rendering using the latest UE 5 version, and got the exact same results as with UE 4.27.2, so it seems like the problem is inherent in the engine and currently unfixed.

The fix to this problem might only be possible in the engine and/or shader code, unless someone knows what settings to use to fix this?