Eevee specular highlight flickering

Hi everyone,

I’m currently working on an ocean scene in Blender 5.0, rendering in Eevee. I’m using the Physical Open Waters add-on for the ocean.

The issue I’m running into is strong flickering in the specular highlights. When the camera turns toward the sun, the highlights on the water start going crazy, they shimmer and flicker heavily, which completely breaks the realism of the shot.

Interestingly, this does not happen in Cycles. The render looks stable there. So I’m assuming it is due to some limitation of real time rendering? However, I need to use Eevee for this project because I’m rendering several minutes of animation and need the speed.

I don’t use Eevee very often, so I’m not very experienced with troubleshooting it. I’ve already tried going through the render settings, changing and disabling different options to isolate the problem, but nothing has worked so far.

Unfortunately, I can’t share the .blend file (one reason being that I’m using a paid add-on).

I’ve seen something similar in a previous project: I had aircraft flying in the sky, and especially in the background there were flickering white pixels, which I assume were caused by reflections.

Is this a known Eevee limitation with specular highlights or reflections? Is there any workaround or hack to reduce or eliminate this flickering?

Any help would be greatly appreciated!

How many render samples are you using? The anti-aliasing depends on it for quality, by sub-sampling pixels so features smaller than a pixel can be captured.

This could also be caused by the screen tracing resolution. Make sure you use 1:1 for best quality, or the highlight would have a coarser resolution than the render.
res

While I’m on the topic of reflections, you should go into the denoising settings and disable temporal accumulation, it will blur sharp reflections like you have here, though I don’t think it’s the cause.
temporal

Finally, are you using bloom/glare in the compositor? Make sure to set the quality to high on the glare node, the other options use a reduced resolution of your image and it can cause this problem too.

Thanks for the reply. I’m already using 1:1 resolution. The overall samples are set to the default 64, but I tried setting it up to 1024, which made theses highlights a bit smaller and finer, but did not fix the overall problem.

I’m wondering if there is a workaround with the lightpath node in the ocean material? Like, when I turn up the roughness of the shader, this problem goes away, but so does the realism of the water. If I can somehow filter out all direct specular highlights in the distance, It might work.

This is 1024 samples

Are you using true displacement for the waves? If you are, make sure the plane is shaded smooth. You wouldn’t see any difference on the flat plane without the displacement, but once it is displaced, flat shading would cause a faceted disco-ball look.

If that’s not it, maybe try rendering at a higher resolution? This might be able to help even if you reduce the size back after the fact.

So as far as I can see, the addon displaces before render time, so I can see waves in the viewport, even in workbench render. But to be honest, I’m not super sure I understand exactly how this addon works.
I tried using eevee for a client project, which requires me to render a few thousand frame. Unfortunately I have a spacecraft wrapped in some sort of reflecting foil, and I’m getting a very similar if not same problem there. The spacecraft is a model I bought, and the foil is sculped, with a normalmap on top.

I really hope I can find some sort of solution for that type of thing. Eevee is good enough for what I need it for otherwise and just saves so much time, allowing me to get through itterations much faster

Here is an example of what I mean

Ignore the last few frames, the model is starting to turn transparent, but this is on purpose. I just cut out a short section

This video is useful, I found a way to re-create this problem.

Do both scenes happen to have a combination of:

  • 0 roughness on the material
  • intense or finely detailed bump or normal map
  • low radius/angle on the light?

If you do, you are getting tiny, sub-pixel speculars in the highly detailed reflections and Eevee is struggling to capture such small speculars. You can try a few things:

  • If you have a bump on the material, make sure its distance setting isn’t higher than needed for the look.

  • Give the material a little bit of roughness, like in the 0.05 to 0.1 range.

  • Increase the light’s radius (angle for a sun) in its light settings to make the specular wider and easier to catch. Don’t go too big though, or it will make soft shadows that Eevee isn’t good at.

I think the despeckle node in compositor can be a quick fix for this.

The material in the hubble example is set to 0 for the foil part, but not for some other parts of the model with flickering.
I did a test where a remodeled the foil part of the model with a simple cylinder, so not sculpted details, and simply added all the wrinkles using a normal map.
When the strength was fairly low <1, the flickering did not happen, but at the same time it did not look correct. When I increased it to what I needed it, the flickering was back.
I have a sun light and an area light in the scene. When I disable the sun light, the flickering is gone. I tried increasing the angle of the sun light, but this only makes the speckles smaller, but way more.
What actually seems to have an effect is to set the angle to 0. This reduces a lot of the flickering. Not perfect, but way better. I’m currently doing a test with increased samples. This really slows down the render time per frame, but at least I’m getting somewhere. Here is the test, with angle set to 0, 256 samples (instead of default 64), but still just 1920x1080. 15 seconds per frame render time.

Setting the angle to 0 is probably making the specular so small that it doesn’t even render at all, that’s why the result is clean.

Something I would be tempted to try is to render with a bigger resolution. This might allow the fine speculars to be captured better, even while rendering with fewer samples. I have never tried it with Eevee, but Cycles does benefit from higher resolution, even if the image is scaled back down after the fact.

Beyond that, it’s hard to tell exactly what is happening without seeing the file directly.

Well, I tried rendering in 4k before, and even though it helped, it did not get rid of the problem.
Unfortunately for my first scnene with the ocean, the scene is lit with an HDRI only. And even though I can set the sun angle there as well (I assume that is an eevee setting) it did not fix the problem. Now for my hubble scene, even though the last render I posted was okay, I ended up rendering in cycles.
I noticed that the rendering itself only took 5 seconds on 4k, but the build up before took most of the time. I usually tend to stay away from using persistant data, since I had some bad experiences with it in the past, but in this case it worked very well.

That’s interesting, that makes me think the model is really heavy somehow. Is it using lots of subdivision or other modifiers that have to be processed before the render? Does it have really high resolution textures? If you mean the Hubble render, I wouldn’t expect that to have a slow loading time, it’s just one model.

I wonder if the background resolution setting could help?
resolution

If the background is being used at a low resolution for lighting, maybe it doesn’t get enough detail to capture the sun well?

If the settings I am proposing do not help for the ocean scene, I might have an other idea what’s causing it. Sadly, this might not be something that can be easily avoided in Eevee.

The waves use true displacement, right? If the waves don’t have enough resolution, maybe the speculars just suddenly shift position between frames, because the waves are angular from the lack of geometry and change shape from one frame to the next. If this is what’s happening, it will happen in Cycles too.

If this is what’s happening, the ocean just needs more subdivisions. This would be much easier in Cycles with adaptive subdivision. Eevee is limited to regular subdivision, so the limit would be the polygon count (unless the ocean plane could be made smaller).

If the water has bump, it could also be contributing to this effect, especially if it’s done in a way where the texture changes quickly.