Water (shader): Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
mNo edit summary
mNo edit summary
Line 8: Line 8:


; Expensive and cheap
; Expensive and cheap
: <code>Water</code> materials fall into two groups: [[expensive]] and [[cheap]]. Expensive water reflects and refracts the world in real-time, while cheap water uses an {{ent|mode=link|$envmap}} and does not refract. Users can disable expensive water rendering through their video options, so always place {{ent|mode=link|env_cubemap}} entities throughout a map.
: <code>Water</code> materials fall into two groups: [[expensive]] and [[cheap]]. Expensive water reflects and refracts the world in real-time, while cheap water uses an {{ent|$envmap}} and does not refract. Users can disable expensive water rendering through their video options, so always place {{ent|env_cubemap}} entities throughout a map.
; Above and below
; Above and below
: <code>Water</code> actually requires two materials: one for above the surface and one for below. These materials are independent of each other, but for proper effect need to correlate in most areas.
: <code>Water</code> actually requires two materials: one for above the surface and one for below. These materials are independent of each other, but for proper effect need to correlate in most areas.
Line 18: Line 18:
=== Textures ===
=== Textures ===


{{note|In games before {{As}}, there is no {{ent|mode=link|$basetexture}}. The surface is a combination of fog color, animated bump map, reflection and refraction.}}
{{note|In games before {{As}}, there is no {{ent|$basetexture}}. The surface is a combination of fog color, animated bump map, reflection and refraction.}}


{{MatParam|$abovewater|bool|Whether this material is used for above or below the water’s surface.}}
{{MatParam|$abovewater|bool|Whether this material is used for above or below the water’s surface.}}
Line 25: Line 25:
{{MatParam|[[Du/dv_map|$bumpmap]]|texture|dx8=1}}
{{MatParam|[[Du/dv_map|$bumpmap]]|texture|dx8=1}}
{{MatParam|[[$normalmap]]|texture|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 or you're using a flow map, which makes an animated bump map redundant.
{{MatParam|[[$normalmap]]|texture|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 or you're using a flow map, which makes an animated bump map redundant.
: {{note|The <code>[[normalmap|$normalmap]]</code> parameter is unique to the <code>Water</code> shader, and uses a [[normalmap|normal map]]. A [[Du/dv_map|du/dv map]] is used for {{ent|mode=link|$bumpmap}} 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 in pre-2006 engine branches.}}}}
: {{note|The <code>[[normalmap|$normalmap]]</code> parameter is unique to the <code>Water</code> shader, and uses a [[normalmap|normal map]]. A [[Du/dv_map|du/dv map]] is used for {{ent|$bumpmap}} 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 in pre-2006 engine branches.}}}}
{{MatParam|$dudvframe|int}}
{{MatParam|$dudvframe|int}}
{{MatParam|$bumpframe|int|Frame to start the animated du/dv map and bump map on, respectively. Somewhat confusingly, <code>$bumpframe</code> affects <code>$''normal''map</code>, which should be pointing to a [[bump map]].}}
{{MatParam|$bumpframe|int|Frame to start the animated du/dv map and bump map on, respectively. Somewhat confusingly, <code>$bumpframe</code> affects <code>$''normal''map</code>, which should be pointing to a [[bump map]].}}
Line 45: Line 45:
=== Reflection ===
=== Reflection ===


{{MatParam|$reflecttexture|texture|Texture to use for reflection. For real-time reflections, use {{ent|mode=link|_rt_WaterReflection}}.}}
{{MatParam|$reflecttexture|texture|Texture to use for reflection. For real-time reflections, use {{ent|_rt_WaterReflection}}.}}
{{MatParam|$reflectamount|float|Amount of warp for the reflection. Higher values produce more visible reflections.}}
{{MatParam|$reflectamount|float|Amount of warp for the reflection. Higher values produce more visible reflections.}}
{{MatParam|$reflecttint|RGB matrix|Color tint for both expensive and cheap reflections.}}
{{MatParam|$reflecttint|RGB matrix|Color tint for both expensive and cheap reflections.}}
{{MatParam|[[$envmap]]|env_cubemap / texture|See {{ent|mode=link|$envmap}}. Provides reflections for cheap water.
{{MatParam|[[$envmap]]|env_cubemap / texture|See {{ent|$envmap}}. Provides reflections for cheap water.
: {{Note|Don't use this on underwater materials.}}}}
: {{Note|Don't use this on underwater materials.}}}}
{{MatParam|$envmapframe|int|The frame to start an animated cubemap on.}}
{{MatParam|$envmapframe|int|The frame to start an animated cubemap on.}}
{{MatParam|$forceenvmap|bool|Forces the water to use <code>$envmap</code> for reflections.|since={{portal2}}}}
{{MatParam|$forceenvmap|bool|Forces the water to use <code>$envmap</code> for reflections.|since={{portal2}}}}
{{MatParam|$forcecheap|bool|Force the water to render itself as [[cheap]], regardless of the map's {{ent|mode=link|water_lod_control}} entity settings or the user's settings. This will disable real-time reflection and instead use <code>$envmap</code>. Refraction is assumed to be opaquely the water fog color.}}
{{MatParam|$forcecheap|bool|Force the water to render itself as [[cheap]], regardless of the map's {{ent|water_lod_control}} entity settings or the user's settings. This will disable real-time reflection and instead use <code>$envmap</code>. Refraction is assumed to be opaquely the water fog color.}}
{{MatParam|$forceexpensive|bool|Force the water to render itself as [[expensive]], regardless of the map's <code>water_lod_control</code> entity settings or the user's settings.}}
{{MatParam|$forceexpensive|bool|Force the water to render itself as [[expensive]], regardless of the map's <code>water_lod_control</code> entity settings or the user's settings.}}
{{MatParam|$cheapwaterstartdistance|float|Distance from the eye in inches that the shader should start transitioning to a cheaper water shader.}}
{{MatParam|$cheapwaterstartdistance|float|Distance from the eye in inches that the shader should start transitioning to a cheaper water shader.}}
Line 61: Line 61:
{{MatParam|$reflect2dskybox|bool|Make the water reflect the [[skybox]] material ''in addition'' to other reflections.|since={{portal2}}}}
{{MatParam|$reflect2dskybox|bool|Make the water reflect the [[skybox]] material ''in addition'' to other reflections.|since={{portal2}}}}
{{MatParam|$reflect3dskybox|bool|Make the water reflect the 3D skybox ''in addition'' to other reflections. Added in the Danger Zone update and used on '''dz_blacksite.'''
{{MatParam|$reflect3dskybox|bool|Make the water reflect the 3D skybox ''in addition'' to other reflections. Added in the Danger Zone update and used on '''dz_blacksite.'''
: {{Note|Requires a {{ent|mode=link|sky_camera}} entity to be placed in the map, otherwise this might cause crashes.}}|only={{csgo}}}}
: {{Note|Requires a {{ent|sky_camera}} entity to be placed in the map, otherwise this might cause crashes.}}|only={{csgo}}}}
{{MatParam|$reflectblendfactor|float|{{todo|What does this do?}}}}
{{MatParam|$reflectblendfactor|float|{{todo|What does this do?}}}}
{{MatParam|$nofresnel|bool|Disable the fresnel on the water's reflection.
{{MatParam|$nofresnel|bool|Disable the fresnel on the water's reflection.
Line 71: Line 71:


{{MatParam|$refract|bool|Whether the material should refract at all.|since={{l4d2}}}}
{{MatParam|$refract|bool|Whether the material should refract at all.|since={{l4d2}}}}
{{MatParam|$refracttexture|texture|Texture to use for refraction. For real-time refractions, use {{ent|mode=link|_rt_WaterRefraction}}.
{{MatParam|$refracttexture|texture|Texture to use for refraction. For real-time refractions, use {{ent|_rt_WaterRefraction}}.
: {{tip|Specify <code>$refracttexture</code> without <code>$reflecttexture</code> to get real-time refraction on <code>$envmap</code> reflections.}}}}
: {{tip|Specify <code>$refracttexture</code> without <code>$reflecttexture</code> to get real-time refraction on <code>$envmap</code> reflections.}}}}
{{MatParam|$refractamount|float|Amount of warp for the refraction. Higher values produce more warping.}}
{{MatParam|$refractamount|float|Amount of warp for the refraction. Higher values produce more warping.}}

Revision as of 05:47, 24 January 2023

English (en)Français (fr)中文 (zh)Translate (Translate)
Water reflecting entities in real-time in Episode Two.

Shader-ball.png Water It creates water that realistically reflects and refracts the world, and that can flow throughout a map.

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_cubemap entities throughout a map.
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 for proper effect need to correlate in most areas.
Flow Mapping
Water can flow in arbitrary directions. It's very tricky to create a flow map by hand however, and the tool Valve used internally hasn't been released.

Shader parameters

Textures

Note.pngNote:In games before Alien Swarm, there is no $basetexture. The surface is a combination of fog color, animated bump map, reflection and refraction.

$abovewater $bottommaterial $underwateroverlay [[$bumpmap|$bumpmap]] [[$normalmap|$normalmap]] $dudvframe $bumpframe $bumptransform $scale $flashlighttint $waterdepth $depth_feather

Fog

$fogenable $fogcolor $fogstart $fogend $lightmapwaterfog

Reflection

$reflecttexture $reflectamount $reflecttint [[$envmap|$envmap]] $envmapframe $forceenvmap $forcecheap $forceexpensive $cheapwaterstartdistance $cheapwaterenddistance $reflectentities $reflectonlymarkedentities $reflectskyboxonly $reflect2dskybox $reflect3dskybox $reflectblendfactor $nofresnel $forcefresnel $basereflectance $maxreflectance

Refraction

$refract $refracttexture $refractamount $refracttint $blurrefract $pseudotranslucent $waterblendfactor

Size/angle of $scroll1 and $scroll2

Flowing water

$scroll1 "[<normal X> <normal Y>]" (in all games since Source 2006)
$scroll2 "[<normal X> <normal Y>]" (in all games since Source 2006)
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.)

Flow maps

A flow map texture.
The flow map texture in-engine, shown with $flow_debug 1.
The result in-engine.

$flowmap $flow_normaluvscale $flow_worlduvscale $flow_uvscrolldistance $flow_timeintervalinseconds $flow_timescale $flow_bumpstrength $flow_noise_texture $flow_noise_scale $flow_debug

Basetexture Flow

$basetexture $color_flow_uvscale $color_flow_timescale $color_flow_timeintervalinseconds $color_flow_uvscrolldistance $color_flow_lerpexp $color_flow_displacebynormalstrength

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 flow map, 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
Controls $basetexture blending from Portal 2 onwards.
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 $surfaceprop %tooltexture

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