Difference between revisions of "Water (shader)"

From Valve Developer Community
Jump to: navigation, search
(See also)
(Other: Added the new $scroll parameters.)
Line 80: Line 80:
 
; <code>WaterLOD proxy</code>
 
; <code>WaterLOD proxy</code>
 
: 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.
 
: 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.
 +
; <code>{{EP2 add|$scroll1 "[<X float> <Y float>]" and $scroll2 "[<X float> <Y float>]"}}</code> [[Image:Orange Box Scrolling Water.png|thumb|right|Size/angle of <code>$scroll1</code> and <code>$scroll2</code>]]
 +
: If $scroll1 is defined and its X value is not zero, the shader will add two more instances of the normal map to the existing one in such a way that they are merged together. The first layer is 7x larger and rotated 45 degrees. The second is 2x larger and rotated 90 degrees. These parameters specify the speed and direction that the extra layers will move.
 +
{{note|Valve's materials usually contain a 3rd number but it doesn't have any apparent effect. It's likely obsolete.}}
  
 
== See also ==
 
== See also ==

Revision as of 18:41, 4 May 2009

A custom Water material from Resistance And Liberation.
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 and refractive, fogged, normal-mapped water.

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 materials through their video options.

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.

Shader parameters

Textures

Tip.png Tip: There is no $basetexture here. 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.
$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.png Note: $normalmap is unique to Water. Everywhere else, $bumpmap is used and there are no du/dv maps.
$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.
$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.png Warning: This 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.
$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.png 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.png Tip: Specify $refracttexture without $reflecttexture to get real-time refraction on $envmap reflections.
$refracttint <RGB matrix>
This is the color of the refraction.
Warning.png Warning: It is recommended that you set this to white or something close to white so that edge transitions work properly on DX9.

Other

%compilewater <bool>
This is needed to make a map using the material compile properly.
$surfaceprop water
Used by the physics system to define the surface as being water.
%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.
$scroll1 "[<X float> <Y float>]" and $scroll2 "[<X float> <Y float>]" (in all games since <Half-Life 2: Episode Two><Half-Life 2: Episode Two>)
Size/angle of $scroll1 and $scroll2
If $scroll1 is defined and its X value is not zero, the shader will add two more instances of the normal map to the existing one in such a way that they are merged together. The first layer is 7x larger and rotated 45 degrees. The second is 2x larger and rotated 90 degrees. These parameters specify the speed and direction that the extra layers will move.
Note.png Note: Valve's materials usually contain a 3rd number but it doesn't have any apparent effect. It's likely obsolete.

See also