RyanB covers it above, but here’s a quick example of how to do it with one volume. Assuming a water plane at z=0, projects a plane, perpendicular to the camera view, 10 world units ahead. Then it checks if the intersection of each view ray and plane has a z value less than 0. If it is, the post process is applied, if not, it returns scene texture. If your water plane material has some z world offset then check the intersection z value against that.
