Water (shader): Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(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 and refractive, fogged, normal-mapped water.
'''<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.
; {{p2 add|<code>$bastexture <texture></code>}}
: Used to create the floating debris and goop inside test chambers.
; {{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.}}
; [[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&deg;; the second is 2x larger and rotated 90&deg;. 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.)
; <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.}}


=== Flow ===
=== 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 an unreleased [http://www.sidefx.com/index.php?option=com_content&task=view&id=1774&Itemid=343 Houdini] plugin.
; [[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&deg;; the second is 2x larger and rotated 90&deg;. 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. Just working out what colours to paint is hard, and then either it's very difficult to align with the world correctly or you have to worry about seams between brushes. It's just about possible to get flow in a line (fit the water texture to each brush and rotate it to handle curves), but anything complex is out of the question.
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 blending between different water materials (water/sludge etc)
: In Portal 2, Controls basetexture blend (water/sludge)


You can also use flow field editor from algoholic.eu website : http://algoholic.eu/another-flow-field-editor-update/


There is a guide on how to author Flow Maps (based on the UDK, though) in a similar fashion that they appear to be for Source : https://www.dropbox.com/s/ii2x077vj64lyhl/Water%20Flow%20For%20UDK.pdf
;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

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: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

Tip.pngTip:There is no $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.pngNote: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.pngTip: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.pngWarning: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.pngTip: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.pngTip:Specify $refracttexture without $reflecttexture to get real-time refraction on $envmap reflections.
$refracttint <RGB matrix>
This is the color of the refraction.
Warning.pngWarning: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
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

Template:MatVar

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