Blender Cycles Denoiser adds banding to smooth gradients. Any ideas why?


Hi

I am working on a project at the moment that fills 75% of the screen with a blue metal pipe. When rendering to the internal render window this pipe looks very neat and clean but when the denoiser pass happens it adds gradient banding to tiles as it processes them.

The screenshot shows the area zoomed in, the red box has been denoised and hopefully you can see what I am talking about.

Rendering to EXR half floats
Motion blur
Denoiser with default settings

Clamp Direct 10 and Indirect 15 (scene also has many metal objects around it and these high clamp values remove render artifacts like black pixel crawl) Scene is several million polys.

Blue pipe uses Principled BRDF shader with metallic at 1.0, Specular 0.5 (it makes a difference to reflections) and roughness at 0.385 to blur the reflections.

676 samples

Scene uses two point lights with a 3.0 and a 5.0 scale, an 8k HDR for reflections and a Light Path node for a background solid. No AO. sRGB. Gamma at default 1.0. GPU (GTX 1080 Ti) + Cycles.

When rendering the view looks spot on, just how the client wants it but when the denoiser applies to tiles it causes a gradient band to appear all over the blue pipe. Other areas which also use similar Principled BRDF look fine though.

So, any ideas what is wrong? I have tried tweaking all settings from extreme low to extreme high and the denoiser simply adds the banding no matter what I change to other settings.

I will try and upload a screenshot with and without denoiser to show how it looks but it’s churning away on another comp for the next 10 hours.

Without the Denoiser I have to up the samples to around 1000 per frame which kills render time so would prefer to avoid that. It is a 34 hour render as it is.

Blender 2.79 (5bd8ac9)

Cheers

Maybe raise color depth. (it might be a bug if that doesnt fix it).
Or add dither (under post processing)

Hiya

Internal render window is 32bit so I can’t raise colour depth more than that, the problem is visible in the internal render window without looking at external files.

I am just testing the dither option so will see if that helps.

I assume it works like Cycles (naturally adds noise) -> Denoiser pass (adds banding) -> Dither (comp effect, adds noise) and hopefully a smoother image.

The only other thing I might be able to do is a 2x render size render and scale it down to 1x but I am not sure if that removes banding like it does with noise artifacts.

Thanks for your help anyway.

Ok, Dither works!

I didn’t realize that you don’t need to re-render to see the dither effect, it applies it to the internal render window in real time and completely removes the banding at a value of 1.0.

Will test a small animation clip to see if it introduces pixel crawl but this is promising.

EDIT: sigh Ok, dither works in the internal render window but it does not save the dithered image when using 16 bit EXR when clicking the “Animation” button to render. If I save the Internal render window “Save image” it saves the dithered image fine. Grrrrr

EDIT 2: Rendering to PNG 8 bit RGBA files applies the dithering. Will test other formats as would ideally prefer a lossless 16bit file.

Thanks