It’s not exactly a bug, more of a rendering limitation. Roblox basically has above and below water fog settings, and normally, when your camera is not super close to the surface of the water, things are fine because the area where there is water rendered is used as a mask for where the underwater fog shader should be applied. The problem is when you get your camera so close to the surface of the water, that the water surface geometry intersects the camera’s near clipping plane. When this happens, depending on whether the water surface is just below or just above the camera position, you either get the sky fog settings used below the intersection line, or the water fog settings used above it (you’d see your water color tint the sky above the intersection line).
I made the water blue and 0.5 transparent, and here’s what these two clipping cases look like:
Camera just above plane of water, with sky shader making water clear applied below the intersection:
Unfortunately, you don’t have control of the near clipping distance. Camera.NearPlaneZ is a read-only property. The only relatively quick fix I can think of to make this behavior less exploitable, would be for you to modify the camera scripts to do a single raycast down through the camera position from above, to get the height of the water, and then modify the camera script to nudge the position of the camera to be enough above or below the waterline to keep it out of the glitchy zone where the surface clips. This distance will be very small, so hardly noticable to players (unless they were trying to cheat). Note that NearPlaneZ can be different on mobile from PC, so you should check on a phone and use the smallest deadzone size that works for all devices.