Translucent Objects do not render below water

Hello Epic,

With 5.8 and Water plugin enabled, I noticed that Translucent Objects do not render below water when camera is above water (see video attached, notice cube doesn’t render below water). But Translucent Objects do render correctly above water when camera is below water (see video attached, notice cube renders above water).

I found an old posts indicating that drawing translucent objects below water was not supported yet and that it might come in 5.1. So I was wondering if it was implemented already, since that was a long time ago, and if it should work in 5.8. Because translucent objects render correctly above water, maybe it’s a recent bug that they don’t render below water?

Thanks!

Vanilla58-Water-Translucency-Above.mp4(12.2 MB)
Vanilla58-Water-Translucency.mp4(14.9 MB)

Steps to Reproduce

  • Install UE 5.8
  • Enable Water and Water Extras plugins
  • Open level “WaterSplitsScreenTestsMap” that comes with Water Extras plugins
  • Put a static cube mesh in the level and assign a Trasnlucent material to it.
  • Place the translucent cube below water and place the camera above water looking at it.
  • Notice how the cube is not rendered.

Hi Aaron!

Apologies for the delay, this issue was routed to an unexpected queue. We still have a task in our backlog to implement translucent rendering below water - probably related to [the issue you referred to [Content removed] This related EPS mentions some workarounds [Content removed] but for your game you may want something more robust.

- Do you have an ETA for this? Can we expect it delivered for UE 5?

We don’t have this on the roadmap for UE5 currently.

- Before I start diving into how to implement this myself, could I get some advice and direction from your team in how they will approach this? If I’m going to do this I’d rather follow a similar implementation path and avoid having completely different solutions that will collide in future engine updates.

Our current thinking is to treat it as a volume for unification purposes, with some potential approximations for extinction/absorption in the volume to improve perf. Something like:

  1. Draw opaque scene
  2. Draw water depth into a buffer (and potentially mark…)
  3. Prepare a water VolumetricFog 3D texture setup which we seed with the scattering/absorption properties from the water surface material (could get this from the water depth/gbuffer pass)
  4. Apply water VF to opaque scene
  5. Draw all translucent effects into two textures, same as the other setup, but this time sampling the water VF texture
  6. Draw/light SLW surface
  7. Composite

Pros

  1. more unified lighting
  2. don’t need underwater post effect
  3. works with translucency
  4. we get llight shafts.
  5. could integrate local lights

Cons

  1. increased memory
  2. increased perf cost
  3. potential issues common to regular volumetric effects like ghosting from temporal reprojection and aliasing

The thing is, for your use-case the volumetric approach may be overkill, and if we don’t implement this in UE5 you may not have to worry about integration headaches for a while as part of a UE6 update.

My colleague Tim Dörries is the SME here and also suggested another potential path:

  1. Draw opaque scene
  2. Draw water depth into a buffer (and potentially mark stencil if it shares depth with non water pixels). The goal is to get a texture we can sample to tell if the current pixel has water and what that waters depth is.
    1. Probably in the same pass: Draw a water gbuffer with albedo, extinction etc
  3. Fullscreen pass over the opaque scene, applying water volume shading to all pixels with water and where the opaque scene is actually under water (we don’t want to apply water shading to opaque pixels above the water when the camera is underwater)
  4. Draw all translucent effects into two textures:
    1. If the translucent pixel is behind the water surface, draw it into the regular SceneColor texture, otherwise draw it into a new secondary SceneColor texture
    2. If the translucent pixel is behind and under the water surface (see step 3), apply water volume shading
  5. Draw water again (or do deferred lighting on the water gbuffer) to draw just the water surface shading. This goes into SceneColor as usual.
  6. Finally composite the secondary SceneColor texture with the translucent effects in front of the water plane on top of the SceneColor texture.

If we want to have a deeper (haha) discussion about this we should probably setup a meeting to go over the approaches in depth (OK I’ll stop now).

Sounds good, let me know if you have additional questions otherwise we close this ticket.

Hi Alex,

Thanks for your reply. Yeah, I saw those links, the first one is quite old (4 years ago) that’s why I wanted to reach out and ask. And you’re right that we’re looking for a more robust solution than the proposed workaround of the second link.

> We still have a task in our backlog to implement translucent rendering below water

Great to hear this is in your radar. A couple of questions about this:

- Do you have an ETA for this? Can we expect it delivered for UE 5?

- Before I start diving into how to implement this myself, could I get some advice and direction from your team in how they will approach this? If I’m going to do this I’d rather follow a similar implementation path and avoid having completely different solutions that will collide in future engine updates.

Thanks!

Hi Alex, sorry for the late reply, I just came back from holidays.

Thank you very much for the guidance, it really helps. I’ll investigate those approaches and study what’s the best approach for our case. I realise it’s not a simple change, but I’d also like to keep it as minimal and contained as possible to simplify future integrations.

Thanks!