По идее если учитывать глубину воды то схема будет такая
прячем плоскость воды
срезаем все что выше воды
рендерим сцену высот (низменость светлая/высота темная)-> сохраняем в текстуру N1 КАРТА ВЫСОТ
далее рендерим эту же сцену с нормальными текстурами -> сохраняем в текстуру N2 КАРТА ПРОЗРАЧНОСТИ/ПРЕЛОМЛЕНИЯ
далее срезаем все что ниже воды
опускаем камеру(важно повернуть правильно)
рендерим ->сохраняем в текстуру N3 КАРТА ОТРАЖЕНИЯ
возвращаем камеру плоскость воды
начинаем рендерить смешивая три выше подготовленые текстуры
Естественно в последнем рендере координаты текстур являются проекционными, то есть ориентируемся по экрану
VS
OUT.Position = mul(IN.Position, matrixWorldViewProject);
OUT.TexProj.x = 0.5f*(OUT.Position.w+OUT.Position.x);
OUT.TexProj.y = 0.5f*(OUT.Position.w-OUT.Position.y);
OUT.TexProj.z = OUT.Position.w;
PS
tex2D(TextureSampler,IN.TexProj.xy/IN.TexProj.z)
Важно так же учитывать что карту высот вы будете делать через шейдер на той же модели где лежат нормальные текстуры, отсюда следует что для модели надо подготовить шейдер с двумя эффектами