Живая вода

"Живая" вода на ПК и Android


В этой публикации:


  • Делаем "живую/движущуюся" воду средствами Godot 3.5.3 шаг за шагом


  • Шаг 1


  • Подготовка рельефа

  • Как видно на скриншёте ниже, я уже подготовил террейн в плагине HTerrein и теперь мне нужно только добавить воду с движущимися неспешно волнами.


    Если вы используете не террейн а что-то другое в качестве сцены с рельефом, то это не беда, так как наша живая вода, будет жить своей жизнью:)





      Шаг 2


    • Добавление основы

    • Сама по себе основа, это всего один встроенный элемент MeshInstance.
      Именно из него мы и создадим наше море.
      И так. Добавляем узел MeshInstance



      Далее, выбираем его в дереве узлов (панель всех узлов сцены слева) и добавляем PlaneMesh



      Добавляем новый материал SpatialMaterial



      После того, как вы добавите SpatialMaterial, в инспекторе установите его размеры и положение так как нужно для вашей карты. В моём случае, просто чуть ниже уровня земли.




      Шаг 3


    • Настройка SpatialMaterial

    • Когда вы кликните на иконку материала, то откроется его меню как на скриншёте ниже



      На данный момент, нас интересует параметр Albedo
      Как видно на скриншёте выше у него есть два свойства Color и Texture.
      Нам нужен только параметр Color, так как именно в нём мы и выберем цвет и прозрачность воды как на скриншёте ниже, ну или по вашему усмотрению.



      На данный момент, установите прозрачность (параметр А (нижний ползунок)) примерно так, как на скриншёте.
      Позже можно отрегулировать и цвет и прозрачность так, как вам будет нужно.


      Теперь нужно включить NormalMap
      Только просто включить как на скриншёте, пока настраивать нечего не нужно в нём!



      Теперь переходим к параметру Transmission
      Включаем и добавляем в него первую текстуру, которую вы можете взять ниже скриншёта



      Нажимаем на [пусто] и Загрузить
      Далее, выбираем заранее помещённую (Импортированную) текстуру в папку проекта




      И переходим к следующему параметру, Refraction
      так же как и в предыдущем параметре, включаем его и добавляем вторую текстуру




      Теперь, когда мы практически настроили материалы, сделаем нашу воду прозрачной и отбрасывающей блики.
      Для этого нам нужно настроить параметр Roughness как на скриншёте ниже и установить его значение в 0.09 перемещая ползунок или введя цифрами над ползунком.



      Теперь мы можем преобразовать наш материал в ShaderMaterial и продолжить настройку кода.
      А потом завершить всё окончательной настройкой внешнего вида.



      И так, после преобразования, нажимаем на Shader сразу под предпросмотром нашей текстуры



      Так мы перейдём к редактированию скрипта Shader.



      Здесь при желании вы можете посмотреть код, попытаться разобраться что к чему, если конечно же не пробовали раньше
      что-то подобное настраивать, но я рекомендую для того, чтобы наша "Живая" вода работала и на ПК и в смартфонах Android,
      просто выделить весь код, удалить а на его место вставить код, который вы видите ниже.



      shader_type spatial;
      render_mode blend_mix,depth_draw_alpha_prepass,cull_back,diffuse_burley,specular_schlick_ggx;
      uniform vec4 albedo : hint_color;
      uniform sampler2D texture_albedo : hint_albedo;
      uniform float specular;
      uniform float metallic;
      uniform float proximity_fade_distance;
      uniform float roughness : hint_range(0,1);
      uniform float point_size : hint_range(0,128);
      uniform sampler2D texture_refraction;
      uniform float refraction : hint_range(-16,16);
      uniform vec4 refraction_texture_channel;
      uniform sampler2D texture_normal : hint_normal;
      uniform float normal_scale : hint_range(-16,16);
      uniform vec3 uv1_scale;
      uniform vec3 uv1_offset;
      uniform vec3 uv2_scale;
      uniform vec3 uv2_offset;

      void vertex() {
      UV = UV * uv1_scale.xy + uv1_offset.xy;
      }

      void fragment() {
      vec2 base_uv = UV;
      vec4 albedo_tex = texture(texture_albedo, base_uv);
      ALBEDO = albedo.rgb * albedo_tex.rgb;
      METALLIC = metallic;
      ROUGHNESS = roughness;
      SPECULAR = specular;

      vec3 normal_tex = texture(texture_normal, base_uv).rgb * 2.0 - 1.0;
      NORMALMAP = texture(texture_normal, vec2(base_uv.x + TIME * 0.05, base_uv.y + TIME * 0.05)).rgb * 1.01 * texture(texture_normal, vec2(base_uv.x + TIME * 0.05, base_uv.y + TIME * 0.05 + TIME / 10.5)).rgb;
      NORMALMAP_DEPTH = normal_scale;

      vec2 ref_ofs = SCREEN_UV - normal_tex.xy * refraction * texture(texture_refraction, base_uv).r;
      float ref_amount = 1.0 - albedo.a * albedo_tex.a;
      EMISSION += texture(SCREEN_TEXTURE, ref_ofs).rgb * ref_amount;

      ALPHA = albedo.a * albedo_tex.a;
      }


      Далее всё сохраняем и скорее всего, вы увидите что после того, как вы вставили и сохранили код,
      то пропала одна из текстур и вы видите, что ваша вода выглядит примерно так как на этом скриншёте ниже.



      То есть, не волн, не движения.
      Это не проблема, так просто добавьте снова текстуру в поле Texture Normal и ваша "Живая" вода сразу же покроется движущимися волнами как на скриншёте ниже.




      Итог


      В итоге мы имеем за 10 минут красивую, движущуюся и максимально реалистичную воду без анимаций, обработок из кода самой игры или вставок видео.


      На скриншётах конечно же невидно движения волн, но у себя в Godot вы конечноже увидите это сразу, даже без запуска сцены!

      При желании и если есть интерес, то конечно же выможете поиграться с настройками Shader как в инспекторе, так и в скрипте Shader.


      На этом пока всё, следите за обновлениями на нашем сайте!:)