Water (shader): Difference between revisions
m (→Textures) |
(Added Portal 2 info, reorganized flowmaps, cleaned up.) |
||
Line 2: | Line 2: | ||
[[File:Ep2 jalopy.jpg|thumb|200px|Real-time [[#Reflection/Refraction|reflection]] of entities in [[Episode Two]].]] | [[File:Ep2 jalopy.jpg|thumb|200px|Real-time [[#Reflection/Refraction|reflection]] of entities in [[Episode Two]].]] | ||
'''<code>Water</code>''' is one of the Source engine's most complex shaders. It creates animated, real-time reflective | '''<code>Water</code>''' 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 == | == Special behaviour == | ||
Line 23: | Line 23: | ||
; <code>$bottommaterial <material></code> | ; <code>$bottommaterial <material></code> | ||
: Required field. This is the material ('''not''' texture) to use when underneath the water’s surface. The bottom material must have <code>$reflecttexture</code> and <code>$abovewater</code> disabled, but can otherwise do whatever it wants. | : Required field. This is the material ('''not''' texture) to use when underneath the water’s surface. The bottom material must have <code>$reflecttexture</code> and <code>$abovewater</code> disabled, but can otherwise do whatever it wants. | ||
; {{EP2 add|<code>$underwateroverlay <material></code>}} | ; {{EP2 add|<code>$underwateroverlay <material></code>}} | ||
: Applies a screen overlay when the camera is underwater. Generally used with <code>effects\water_warp01</code>. Requires <code>$abovewater</code> to be 0. | : Applies a screen overlay when the camera is underwater. Generally used with <code>effects\water_warp01</code>. Requires <code>$abovewater</code> to be 0. | ||
Line 31: | Line 29: | ||
: A [[Du/dv map]] for DirectX 8 rendering (<code>$bumpmap</code>), and a [[bump map]] for DirectX 9 and above (<code>$normalmap</code>). These should be animated unless the water is to be perfectly still. | : A [[Du/dv map]] for DirectX 8 rendering (<code>$bumpmap</code>), and a [[bump map]] for DirectX 9 and above (<code>$normalmap</code>). These should be animated unless the water is to be perfectly still. | ||
: {{note|The <code>[[normalmap|$normalmap]]</code> command is unique to the <code>Water</code> shader, and uses a [[normalmap|normal map]]. A [[Du/dv_map|du/dv map]] is used for <code>[[$bumpmap]]</code> when using the <code>Water</code> shader. The <code>[[Du/dv_map|$dudvmap]]</code> command is obsolete.}} {{tip|Use <code>$bumptransform</code> with the [[TextureScroll]] proxy to move the normal map.}} | : {{note|The <code>[[normalmap|$normalmap]]</code> command is unique to the <code>Water</code> shader, and uses a [[normalmap|normal map]]. A [[Du/dv_map|du/dv map]] is used for <code>[[$bumpmap]]</code> when using the <code>Water</code> shader. The <code>[[Du/dv_map|$dudvmap]]</code> command is obsolete.}} {{tip|Use <code>$bumptransform</code> with the [[TextureScroll]] proxy to move the normal map.}} | ||
; <code>$dudvframe <[[int]]></code> | ; <code>$dudvframe <[[int]]></code> | ||
; <code>$bumpframe <int></code> | ; <code>$bumpframe <int></code> | ||
Line 79: | Line 74: | ||
: {{warning|It is recommended that you set this to white or something close to white so that edge transitions work properly on DX9.}} | : {{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 === | ||
{{MatVar|$flowmap|texture|since=l4d2|3=This is a texture that defines flow velocity by skewing and scrolling the $normalmap. For the preservation of sanity Valve generate theirs with | ; [[Image:Orange Box Scrolling Water.png|right|300px|Size/angle of $scroll1 and $scroll2]] {{EP2 add|<code>$scroll1 "[<[[normal]] X> <normal Y>]"</code>}} | ||
; {{EP2 add|<code>$scroll2 "[<normal X> <normal Y>]"</code>}} | |||
: If <code>$scroll1</code> 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 ==== | |||
{{MatVar|$flowmap|texture|since=l4d2|3=This is a texture that defines flow velocity by skewing and scrolling the $normalmap. For the preservation of sanity Valve generate theirs with [http://www.sidefx.com/index.php?option=com_content&task=view&id=1774&Itemid=343 Houdini] | |||
: [[File:L4d2 flowmap user.jpg|300px]] [[File:L4d2 flowmap tex.jpg|169px]] [[File:L4d2 flowmap dev.jpg|300px]] | : [[File:L4d2 flowmap user.jpg|300px]] [[File:L4d2 flowmap tex.jpg|169px]] [[File:L4d2 flowmap dev.jpg|300px]] | ||
: [http://www.youtube.com/watch?v=iY6vkpQDcpU See a clip of the effect on YouTube.] For a detailed description of how it all works see [http://www.valvesoftware.com/publications/2010/siggraph2010_vlachos_waterflow.pdf Alex Vlachos' SIGGRAPH 2010 paper]. | : [http://www.youtube.com/watch?v=iY6vkpQDcpU See a clip of the effect on YouTube.] For a detailed description of how it all works see [http://www.valvesoftware.com/publications/2010/siggraph2010_vlachos_waterflow.pdf Alex Vlachos' SIGGRAPH 2010 paper]. | ||
Line 94: | Line 96: | ||
{{MatVar|$flow_noise_scale|float|How many times to fit the noise texture into the normal map. Typically around 0.01.}} | {{MatVar|$flow_noise_scale|float|How many times to fit the noise texture into the normal map. Typically around 0.01.}} | ||
{{MatVar|$flow_debug|bool|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.}}}} | {{MatVar|$flow_debug|bool|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 ==== | |||
; {{p2 add|<code>$bastexture <texture></code>}} | |||
: Used to create the floating debris and sludge inside test chambers. | |||
{{MatVar|$color_flow_uvscale|float|The number of world units covered by the basetexture before it repeats. Typically in the 100s.}} | |||
{{MatVar|$color_flow_timeintervalinseconds|float|Time needed for the normal map to cross the <code>$color_flow_uvscrolldistance</code>.}} | |||
{{MatVar|$color_flow_uvscrolldistance|float|How far along the flow map the normal map should be distorted. Higher values lead to more distortion.}} | |||
{{MatVar|$color_flow_lerpexp|float|How sharp the transition between repeats, should be 1.}} | |||
:{{todo|Better explanation}} | |||
{{MatVar|$color_flow_displacebynormalstrength|float|How much the normalmap effects the basetexture. around 0.01}} | |||
==== Authoring a flow map ==== | ==== Authoring a flow map ==== | ||
Line 99: | Line 112: | ||
[[File:Water_flow_test.png|thumb|200px|Directions of water flow depend on the red and green channels of the flow map.]] | [[File:Water_flow_test.png|thumb|200px|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. | 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. | 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. | ||
Line 110: | Line 123: | ||
: Y axis | : Y axis | ||
; Alpha channel | ; Alpha channel | ||
: In Portal 2, Controls | : In Portal 2, Controls basetexture blend (water/sludge) | ||
There | ;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 === | === Other === |
Revision as of 16:19, 3 May 2014
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:L4d2 add
- 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

$basetexture
before Portal 2, The surface is a combination of fog colour, animated bump map, and reflection.$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. - Template:EP2 add
- 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 theWater
shader, and uses a normal map. A du/dv map is used for$bumpmap
when using theWater
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.
- Template:L4d2 add
- 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.
- Template:P2 add
- 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
- Template:EP2 add
- Template:EP2 add
- 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
Template:MatVar Template:MatVar Template:MatVar Template:MatVar Template:MatVar Template:MatVar Template:MatVar Template:MatVar Template:MatVar Template:MatVar
Basetexture Flow
- Template:P2 add
- Used to create the floating debris and sludge inside test chambers.
Template:MatVar Template:MatVar Template:MatVar Template:MatVar
- Todo: Better explanation
Authoring a 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
- Adding Water (in Hammer)
- Creating a Waterfall Material
- Making a wall of water
- True reflections under CSS (French)