Yes, that is actually the case, the rendering of the waterline relies on having a base water level to work with. For something like a river, the height of the mesh's vertices tends to vary over it surface, which can't easily be translated to shaderland. Some one got around this by performing a downward raycast on a river's mesh collider from the position returned by the StylizedWater2.UnderwaterUtilities.GetNearPlaneBottomPosition() function. Then feeding the Y-value of the hit into the SetWaterLevel function. This'll make it work to some extent, but the outcome doesn't always look correct. I've been toying with a concept that'll allow reading the height of any an all water surfaces on both a CPU and GPU level. That'll remove the need for using a water level value for both underwater rendering and the Buoyancy API, and a reference to a specific water material. It's practically an ideal solution, and makes things much simpler, so it's definitely something I'm aiming to explore further.