SingleLayerWater and temporal AA ghost effect

I am using a scenario with a SingleLayerWater material set to opaque. The scene renders how I would imagine but with TAA or TSR enabled there is a ghosting / artifact / noise effect that can be seen of the outline of object.

For the example in this picture we are using a simple SingleLayerWater material and an opaque ship. When the ship is in motion there is artifacting and noise but only in the areas where the water overlays the hull that is submerged.

[Image Removed]

[Image Removed]

It is very hard to visualize without seeing the object in motion but I believe it is due to the sampling not overlaying with the SingleLayerWater correctly. Here is the sample buffer visualization (r.tsr.visualize 0) for the same situation.

[Image Removed]

Is this a known limitation of TAA? Are there any tips about how to mitigate this?

Steps to Reproduce
Add single layer water material and an opaque object / ship.

Enable TSR or TAA

Put opaque object in motion

Observe ghosting of opaque object below the surface of SingleLayerWater

This effect does not occur when AA is not using temporal AA (Using none or FXAA instead)

Hi Steven!

SLW and motion vectors is a tricky subject and we currently don’t have a perfect solution for all cases. However since you say your SLW is set to opaque it should simplify the problem quite a bit:

  1. If the water itself is moving, you probably want to make sure it is writing motion vectors (there is a motion blur debug view mode which should highlight everything writing to the velocity render target with a yellow color). As of 5.6, SLW should always write to velocity, but in prior versions, you need to set the project setting for the velocity pass to “Output in BasePass”.
  2. If it’s a completely custom water water material, you should probably also make sure that it is using the PreviousFrame switch to write to WPO so that the renderer can generate the correct motion vectors.

Once you have this set up correctly, (opaque) water should behave the same as any other opaque surface (as far as TAA/TSR is concerned). Which brings me to the second part: If your water material is set to opaque, then you shouldn’t be able to see the submerged part of the ship, so I’m suspecting what you’re seeing here is actually the reflection of the ship on water (r.Water.SingleLayer.Reflection 0 to disable reflections on water). Proper motion vectors on the water surface might help with improving reflection reprojections. If your water is not actually opaque, then each pixel effectively represents multiple surfaces with independent motion vectors. As of today, representing this with a single motion vector is more or less impossible and an area of active research. The best recommendation I can give to you in that case is to play with different motion vectors (through the PreviousFrame switch node in the water material) to see what gives you the best result.

Best regards,

Tim

Thank you for the quick response.

We are using UE 5.5 so setting r.VelocityOutputPass=1 solved the issue.