Water (shader)

From Valve Developer Community
(Redirected from Water Shader)
Jump to: navigation, search
Real-time reflection of entities in Episode Two.

Water is one of the Source engine's most complex shaders. It creates animated, real-time reflective & refractive, fogged, normal-mapped, and flowing water.

Special behaviour

Expensive and cheap
Water materials fall into two groups: expensive and cheap. Expensive water reflects and refracts the world in real-time, while cheap water uses an $envmap and does not refract. Users can disable expensive water rendering through their video options, so always place env_cubemaps.
Above and below
Water actually requires two materials: one for above the surface and one for below. These materials are independent of each other, but of course for proper effect need to correlate in most areas.
Template:Flow
Water can flow in arbitrary directions. It's very tricky to create a flow map by hand however, and the tool Valve use internally is unreleased.

Shader parameters

Textures

Tip:There is no $basetexture, The surface is a combination of fog colour, animated bump map, reflection and refraction.
$abovewater <bool>
Whether this material is used for above or below the water’s surface.
$bottommaterial <material>
Required field. This is the material (not texture) to use when underneath the water’s surface. The bottom material must have $reflecttexture and $abovewater disabled, but can otherwise do whatever it wants.
$underwateroverlay <material> (New with Source 2007)
Applies a screen overlay when the camera is underwater. Generally used with effects\water_warp01. Requires $abovewater to be 0.
$bumpmap <texture>
$normalmap <texture>
A Du/dv map for DirectX 8 rendering ($bumpmap), and a bump map for DirectX 9 and above ($normalmap). These should be animated unless the water is to be perfectly still.
Note:The $normalmap command is unique to the Water shader, and uses a normal map. A du/dv map is used for $bumpmap when using the Water shader. The $dudvmap command is obsolete.
Tip:Use $bumptransform with the TextureScroll proxy to move the normal map.
$dudvframe <int>
$bumpframe <int>
Frame to start the animated du/dv map and bump map on, respectively. Somewhat confusingly, $bumpframe affects $normalmap, which should be pointing to a bump map.

Fog

$fogcolor <RGB matrix>
This is the color of the water’s volumetric fog. Generally this value should match the color used in the bottom material.
$lightmapwaterfog <bool> (New with Left 4 Dead 2)
Allows the fog to receive lightmaps, so that static objects can cast shadows onto the water. Must be enabled when the map is compiled.
$fogenable <bool>
Enable volumetric fog for the water.
$fogend <float>
This is the distance in inches from the eye at which water fog ends.
$fogstart <float>
This is the distance in inches from the eye at which water fog starts.
Warning:Must be 0 for edge fading to work properly.

Reflection/Refraction

$envmap <env_cubemap / texture>
Provides reflections for cheap water. See $envmap
$forcecheap <bool>
Make this water cheap regardless of the water_lod_control entity's or user's settings. This will disable real-time reflection and instead use $envmap. Refraction is assumed to be opaquely the water fog color.
$forceexpensive <bool>
This forces the water to render itself as expensive, regardless of the map's water_lod_control or the user's settings.
$reflect2dskybox (New with Portal 2)
Makes this water reflect the skybox material in addition to other reflections.
$reflectamount <float>
This is the amount of warp for the reflection. Higher values produce more visible reflections.
$reflectentities <bool>
Make the water reflect entities. By default, no entities are reflected.
$reflecttexture <texture>
Texture to use for reflection. For real-time reflections, use _rt_WaterReflection.
Tip:Specify $refracttexture without $reflecttexture to get real-time refraction on $envmap reflections.
$reflecttint <RGB matrix>
This is the color tint for the real-time reflection and environment map.
$refractamount <float>
This is the amount of warp for the refraction. Higher values produce more warping.
$refracttexture <texture>
Texture to use for refraction. For real-time refractions, use _rt_WaterRefraction.
Tip:Specify $refracttexture without $reflecttexture to get real-time refraction on $envmap reflections.
$refracttint <RGB matrix>
This is the color of the refraction.
Warning:It is recommended that you set this to white or something close to white so that edge transitions work properly on DX9.

Flowing water

Size/angle of $scroll1 and $scroll2
$scroll1 "[<normal X> <normal Y>]" (New with Source 2007)
$scroll2 "[<normal X> <normal Y>]" (New with Source 2007)
If $scroll1 is defined and X is not zero, two more instances of the normal map will be drawn in such a way that they are merged together. The first layer is 7x larger and rotated 45°; the second is 2x larger and rotated 90°. The parameters specify the speed and direction that the extra layers will move. (Valve's materials usually contain a third number, but it doesn't have any apparent effect and is most likely obsolete.)


Flowmaps

$flowmap  <texture>
This is a texture that defines flow velocity by skewing and scrolling the $normalmap. This effect isn't limited to the water shader, It was first used for the purple Vortigaunt warp effect seen in Episode 1 and 2. For the preservation of sanity Valve generate theirs with Houdini
L4d2 flowmap user.jpg L4d2 flowmap tex.jpg L4d2 flowmap dev.jpg
See a clip of the effect on YouTube. For a detailed description of how it all works see Alex Vlachos' SIGGRAPH 2010 paper.
$flow_normaluvscale  <float>
The number of world units covered by the normal map before it repeats. Typically in the 100s.
$flow_worlduvscale  <float>
The number of times the flow map fits into the material. Face texture scale affects this.
$flow_uvscrolldistance  <float>
How far along the flow map the normal map should be distorted. Higher values lead to more distortion.
$flow_timeintervalinseconds  <float>
Time needed for the normal map to cross the $flow_uvscrolldistance.
$flow_timescale  <float>
Modifies flow speed without affecting the amount of distortion.
$flow_bumpstrength  <normal>
How rough surface of the water is. Going above 1 is not recommended.
$flow_noise_texture  <texture>
A treatment texture used to break up repetition of the normal map.
$flow_noise_scale  <float>
How many times to fit the noise texture into the normal map. Typically around 0.01.
$flow_debug  <boolean>
Replaces the water surface with a literal rendering of the flow map.
Bug:
Although the flow map will show up in Hammer, it may not be in the correct place! Don't rely on Hammer's view for alignment.

Basetexture Flow

$bastexture <texture> (New with Portal 2)
Used to create the floating debris and sludge inside test chambers.
$color_flow_uvscale  <float>
The number of world units covered by the basetexture before it repeats. Typically in the 100s.
$color_flow_timeintervalinseconds  <float>
Time needed for the normal map to cross the $color_flow_uvscrolldistance.
$color_flow_uvscrolldistance  <float>
How far along the flow map the normal map should be distorted. Higher values lead to more distortion.
$color_flow_lerpexp  <float>
How sharp the transition between repeats, should be 1.
To do: Better explanation
$color_flow_displacebynormalstrength  <float>
How much the normalmap effects the basetexture. around 0.01

Authoring a flow map

Directions of water flow depend on the red and green channels of the flow map.

Overall, trying to create a flow map manually is a nightmare. Painting the flowmap, fitting it into the world, and painting foam, is extremely difficult.

But if you do want to give it a try, flow direction is read from the red and green channels of the flow map. 50% tone means no movement.

The texture scale of any faces using a water texture with a flow map appear to have a direct correlation on the flow map. The fewer water faces or planes you use the easier the process of authoring a custom flow map will be (selecting all of your water faces and using 'treat as one' when using the fit scaling may also be an option)

Red channel
X axis
Green channel
Y axis
Alpha channel
In Portal 2, Controls basetexture blend (water/sludge)


There are now tools to assist in painting flowmaps.
Flow field editor from algoholic.eu : http://algoholic.eu/another-flow-field-editor-update/
Flowmap generator (paid): http://www.superpositiongames.com/products/flowmap-generator
Creating flowmaps using Houdini (UDK) : https://www.dropbox.com/s/ii2x077vj64lyhl/Water%20Flow%20For%20UDK.pdf

Other

%compilewater <bool>
This is needed to make a map using the material compile properly.
$surfaceprop water
Tells the physics system that the surface is water. See $surfaceprop.
%tooltexture <texture>
Defines the texture Hammer will display in the material browser.
WaterLOD proxy
This connects the water_lod_control entity in a level to the water’s internal parameters. This must be declared in the material for the LOD mechanisms to work properly.

See also