Water (shader): Difference between revisions
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 | : <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 | {{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 | : {{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 | {{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 | {{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 | {{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 | : {{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 | {{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
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


$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
Flowing water
$scroll1 "[<normal X> <normal Y>]"
(in all games since)
$scroll2 "[<normal X> <normal Y>]"
(in all games since)
- 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
$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
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)
- 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
- Adding Water (in Hammer)
- Creating a Waterfall Material
- Making a wall of water
- True reflections under CSS (French)