WoLD Archives Search About Contact

World of Level Design

Tutorials to Becoming the Best Level Designer and Game Environment Artist (since 2008)

UE5: Create Realistic and Customizable Pool Water Material Using Single Layer Water Shading Model

Category: UE5
May 01, 2025

In this comprehensive tutorial, I'll guide you through creating a realistic pool or still water material using UE5's Single Layer Water shading model.

With a few tweaks, this material can be adapted for more dynamic water surfaces like seas or oceans. This same material was used in an environment featuring Infinity Tiled Rooms and Pools.

This step-by-step guide covers the entire process for how to create this water Material.

Video Tutorial

Setting Up the Environment

To begin, you'll need a simple environment to test the water material. For this tutorial, I'll be using a room from the Infinity Tiled Rooms and Pools modular asset pack, lit with rectangular and point lights - no directional or exterior lights. This setup avoids issues with the Single Layer Water shader, which I'll discuss later.

Create or Import a Plane: If you don't have a flat plane, go to the Place Actors panel, select Shapes and drag a plane into your scene. This will serve as the water surface.

Position and Scale: Place the plane where the water will appear and scale it to fill the desired area. Uniform scaling is optional; the material will work regardless.

Disable Collisions and Shadows: Select the plane, go to the Details panel, and set Collision Preset to No Collision so characters can pass through. Disable Cast Shadow to prevent unwanted shadows.

Creating the Water Material

Create a New Material: In the Content Browser, navigate to your desired folder then right-click, select Create Material, and name it M_Water_Pool.

Configure the Shading Model: Open the material and select the main node. In the Details panel, change the Shading Model from Default Lit to Single Layer Water.

Add Single Layer Water Node: Right-click in the graph, search for Single Layer Water Material Output and add it. This node drives key water properties like scattering and absorption.

Define Water Color (Absorption Coefficient): Absorption Coefficient determines the surface color of the water by absorbing specific colors to reveal the desired hue (e.g., absorbing red/orange to show blue/green).

  • Press 3 and left-click to add a Constant3Vector node. Right-click the node, select Convert to Parameter, and name it WaterColor.
  • Press 1 and left-click to add a Constant node. Convert it to a parameter named WaterColorIntensity.
  • Press M and left-click to add a Multiply node. Connect WaterColor to Multiply A and WaterColorIntensity to Multiply B.
  • Connect the Multiply output to the Absorption Coefficient input.
  • Add a Divide node (press D and left-click).
  • Connect WaterColorIntensity to Divide A and set Divide B to 1000 for more manageable values.
  • Connect the Divide output to Multiply B.
  • Set a default WaterColorIntensity value of 3 for initial testing.

Simplify Color Selection with Hue Shift: To choose the desired water color directly (instead of its opposite), add a HueShift node.

  • Add a Constant node with a value of 0.5 and connect it to the Hue Shift Percentage.
  • Connect WaterColor to the Texture input of HueShift, then connect the HueShift output to Multiply A.
  • This shifts the color wheel to select the intended color (e.g., teal instead of red/orange).

Set Up Base Color, Roughness, and Opacity.

  • Base Color: Add a Constant node (press 1 and left-click) and set it to 0. Connect it to the Base Color input. Optionally, you can use Constant3Vector parameter named BaseColor for artistic color amplification (e.g., to enhance the water's hue).
  • Roughness: Press S and left-click to add a ScalarParameter named Roughness. Set the default value to 0 for a shiny surface and connect it to the Roughness input.
  • Opacity: Duplicate the Roughness parameter (Ctrl+D) and rename it Opacity. Set the default value to 0.5 for semi-transparent water and connect it to the Opacity input.

Add Depth Color (Scattering Coefficient): Scattering Coefficient controls the color and intensity of the water's depth, enhancing realism.

  • Create Depth Color Parameter: Add a Constant3Vector node, convert it to a parameter, and name it WaterScatteringDepthColor.
  • Add Intensity Parameter: Add a ScalarParameter named WaterScatteringDepthIntensity with a default value of 1.
  • Add a Divide node and set Divide B to 1000. Connect WaterScatteringDepthIntensity to Divide A.
  • Add a Multiply node, connect WaterScatteringDepthColor to Multiply A, and the Divide output to Multiply B.
  • Connect the Multiply output to the Scattering Coefficient input.

Adding Waves and Motion

To add waves you'll need a water Normal Map. Import your own Normal Map to use or use Engine Content.

In the Content Browser, enable Engine Content (via Settings). Locate the T_Water_N normal map in the Engine Content folder or use the T_Water_N from Starter Content.

Drag the Normal Map into the material editor

Adding Tiling.

Control Normal Map tiling with World-Aligned Position node.

  • Right-click and add an Absolute World Position node to ensure seamless texture mapping regardless of the plane's scale or rotation. Use XY channels (since the plane is flat).
  • Add a ScalarParameter named WaterTiling with a default value of 1000.
  • Add a Divide node, connect Absolute World Position (X, Y) to Divide A, and WaterTiling to Divide B.

Add Water Movement.

click on image to view full size

  • Add a Panner node and connect the Divide output to its Coordinate input.
  • Add two ScalarParameter nodes named TexturePanningX1 and TexturePanningY1, both with a default value of 0.005.
  • Add an Append node.
  • Connect TexturePanningX1 to A, TexturePanningY1 to B, and the output to the Speed input of the Panner.
  • Connect the Panner output to the UVs input of the normal map.
  • Create Opposite Motion: Duplicate the normal map, Panner, Append, and panning parameters.
  • Rename the duplicated parameters to TexturePanningX2 and TexturePanningY2, and set their default values to -0.005 for opposite motion.
  • Connect the Divide output to the duplicated Panner's Coordinate input.
  • Combine Normal Maps: Add a BlendAngleCorrectedNormals node.
  • Connect the first normal map's RGB to Base Normal and the second to Additional Normal. Connect the output to the Normal input of the main node.
  • Control Wave Intensity: Add a FlattenNormal node and a ScalarParameter named WaveIntensity with a default value of 0.9.
  • Connect the BlendAngleCorrectedNormals output to the Normal input of FlattenNormal, and WaveIntensity to Flatness.
  • Connect the FlattenNormal output to the Normal input of the main node.

Adding Refraction

Refraction distorts objects below the water surface, adding realism.

Configure Refraction Method: Select the main node, go to the Details panel, and set Refraction Method to Pixel Normal Offset (preferred for large water planes over Index of Refraction).

Add Refraction Parameter: Add a ScalarParameter named Refraction with a default value of 1.05. Connect it to the Refraction input of the main node.

Optional Enhancements

Add Phase G and Color Scale Behind Water. These parameters are useful for exterior scenes with directional lights.

Phase G: Adjusts light scattering relative to the sun's direction.

  • Add a ScalarParameter named PhaseG with a default value of 0.
  • Connect it to the Phase G input of the Single Layer Water Material Output node.

Color Scale Behind Water: Controls luminance and shadow brightness below the water surface.

  • Add a ScalarParameter named ColorScaleBehindWater with a default value of 0.
  • Connect it to the Color Scale Behind Water input.

Adjust PhaseG and ColorScaleBehindWater to enhance scattering and luminance effects.

Note: For interior pool water, these parameters may not be necessary.

Create a Material Instance

Right-click the material, select Create Material Instance, and name it MI_Water_Pool. Apply the instance to the water plane.

  • Fine-Tune Parameters: Adjust WaterColor and WaterColorIntensity for the surface color.
  • Modify WaterScatteringDepthColor and WaterScatteringDepthIntensity for depth effects.
  • Tweak Opacity (e.g., 0.5 for clear pool water) and Roughness (keep at 0 for a shiny surface).
  • Control WaterTiling, TexturePanning parameters, and WaveIntensity for wave scale and motion.
  • Adjust Refraction for distortion effects.

Addressing Directional Light Issues

The Single Layer Water shader can produce harsh shadows with directional lights in outdoor scenes. See this tutorial for solutions.

Conclusion

You've now created a highly customizable water material suitable for pools or still water, with the flexibility to adapt for oceans or seas. This material includes controls for color, depth, waves, refraction, and more, making it ideal for various environments. For outdoor scenes, consider adding PhaseG and ColorScaleBehindWater or addressing directional light issues with ray-traced shadows.

If you'd rather skip the setup, the finished material is available on WoLD Patreon.

SUBSCRIBE & GET FREE UE5 PDF GUIDE

Subscribe to receive NEW/UPDATED and FREE "UE5 Beginner's Quick Start Guide" PDF (90 pages).

Subscribe and Get Free UE5 PDF Guide

Visit this page for more info about the guide...


Follow WoLD




UE5 FUNDAMENTALS VOL.1 COURSE


UE5: RETRO OFFICE PROJECT


LEARN THE PREPRODUCTION PROCESS


ABOUT WoLD & ALEXG

About World of Level Design

My name is AlexG. I am self-taught level designer, game environment artist and the creator of World of Level Design.com. I've learned everything I know from personal experimentation and decades of being around various online communities of fellow environment artist and level designers. On World of Level Design you will find tutorials to make you become the best level designer and game environment artist.

Read More »


Home Terms of Use/Trademarks/Disclaimers Privacy Policy Donate About Contact

All content on this website is copyrighted ©2008-2024 World of Level Design LLC. All rights reserved.
Duplication and distribution is illegal and strictly prohibited.

World of Level Design LLC is an independent company. World of Level Design website, its tutorials and products are not endorsed, sponsored or approved by any mentioned companies on this website in any way. All content is based on my own personal experimentation, experience and opinion. World of Level Design™ and 11 Day Level Design™ are trademarks of AlexG.

Template powered by w3.css