Hi everyone,
I’m currently investigating the rendering behavior of Single Layer Water (SLW) in Unreal Engine 5 and noticed something interesting.
When SLW meshes are occluded by other geometry, they seem to remain in the visibility pass — the rendering pass still runs even though the water surface itself isn’t visible on screen.
I’ve confirmed that basic view relevance culling works (e.g., if I disable the “SingleLayerWaterMaterial” relevance, it gets properly culled), but occlusion culling doesn’t appear to affect SLW.
Before diving deeper into custom modifications, I’d like to clarify:
- Does the current UE5 renderer (including 5.5) support occlusion culling for Single Layer Water primitives?
- If not, is there a recommended approach or known limitation preventing it (e.g., due to the separate water rendering pass or depth setup)?
Any insight from Epic staff or others who’ve worked on SLW occlusion behavior would be greatly appreciated.
Thanks in advance!
Hi Shaorong,
please excuse the late reply! Occlusion culling should be working independent of the shading model. If you apply a SLW material to a regular plane and then occlude that with another plane, you should find that it never enters the SLW rendering functions. If you’re talking about the water plugin, then it’s unfortunately a bit more complicated: The water plugin uses a dynamic mesh (a quadtree of mesh tiles in fact) and decides every frame which tiles to draw. This ever changing set of tiles to draw makes classic CPU driven occlusion culling a bit tricky. That said, we do have support for this feature using the r.Water.WaterMesh.OcclusionCulling cvar. iirc you should be able to use stat watermesh to get some debug stats about how many tiles were drawn/culled etc. Be advised that as with all CPU driven occlusion culling (occlusion queries), there’s a bit of lag in getting the results back from the GPU, so if you use this on an ocean and very quickly rotate the camera, there’s a chance that you’ll see some parts of the ocean pop in near the edges of the screen.
I hope this answers your question, but please let me know if I missed anything 
Cheers,
Tim
Thanks for getting back to me!
Yea, later I realized that I should’ve mentioned this is about WaterPlugin. And yes, thru the CVar you mentioned I was able to cull a tons of water. However, get rid of those passes do not quite yield an idea perf saving. There’re a couple of cases where you can’t visually see any water in the view but there’s still a draw or two rendering the water. SO I’m wondering is there a better solution to cull those water accordingly too? It’ll be better skip the pass.
For example, there’s a lot of time farmesh appears to be only one in the view while indoor. for the context I make sure that r.Water.WaterMesh.OcclusionCulling.IncludeFarMesh is on.
Also, this question from 2 years ago seems to describe the issue I mentioned above pretty clear:
[Content removed]
However, I haven’t seen any update since then. Do we have a plan to fix it or is it already in?
Hi!
Good find! Unfortunately that issue still exists (it kept getting preempted by more pressing issues). We have a ticket tracking this internally, but there’s currently no ETA on when a fix will arrive. I’ll try and revive that effort to see if we can finally put an end to it 
Thanks,
Tim