This article's documentation is for anything that uses the Source engine. Click here for more information.

Refract

From Valve Developer Community
Jump to navigation Jump to search
English (en)Deutsch (de)Français (fr)中文 (zh)Translate (Translate)

A refracting func_brush.

Refract is a Pixel shader available in all Source Source games. It distorts objects behind it. It is similar to Water, but does not have real-time reflections and so is not restricted to flat surfaces. Can be used to create distorting glass windows, ice, etc.

The refraction effect is achieved by first rendering the view without the refracting surface, and then using the normal map to distort the image by replacing pixel coordinates with new ones from the pre-rendered view by projecting along the normals.

Note.pngNote:Will not work when applied to world brushes in older engines.
Clarify: Which engines does it work in? Might work regardless on %CompileWater materials.
PlacementTip.pngWorkaround:Tie the refracting brushes to a func_brush or similar entity.
Note.pngNote:Multiple layers of the Refract shader will not render when applied on the same entity.
Tip.pngTip:If you have a refract shader on your model that also has other materials, you must specify $mostlyopaque parameter to the QC and $nowritez 1 & $model 1 to the VMT. If the model only has one material, then only $model 1 is necessary.

Keep in mind that refraction is expensive to render when sorted. Multiple layers of refraction can cause immense overdraw. Avoid having large amounts of particle sheets, or multiple surfaces with refract that render above each other.

Syntax

Refract
{
	$normalmap ...
	$dudvmap ...
	$refracttint "[1 1 1]"
	$refractamount .2
}

$normalmap $dudvmap $normalmap2 $bumpframe $bumptransform $refracttint $refracttinttexture $refracttinttextureframe $refractamount $bluramount $forcerefract $envmap $envmaptint $envmapcontrast $envmapsaturation $fresnelreflection $fadeoutonsilhouette $vertexcolormodulate $basetexture $masked $forcealphawrite $nowritez $noviewportfixup $mirroraboutviewportedges $magnifyenable $magnifycenter $magnifyscale $localrefract $localrefractdepth $spitternoisetexture

Caveats

  • Currently it is not possible to define an overall alpha mask to indicate where to fall-off refract. This however only applies to the brush based and model geometry, and not particles. To get alpha on brush or model based geometry you can create a normal map with an alpha channel, and define that as the first $normalmap. Using another normal of your choice you can then define a normal map for $normalmap2. $normalmap2 will inherit the alpha of the first normalmap, and will act accordingly. This is extremely useful for faking effects like scrolling water of a surface. Where the first normal map can provide the alpha, and the second normal map can move along that alpha.
  • If Refract is used on a part of a model, you must specify $mostlyopaque parameter to the qc of the model and $nowritez "1" & $model "1"to refract vmt.
  • This shader doesn't work properly with water dynamic reflections and sky_camera. Only for brushes, if a brush is world geometry or func_detail. This bug doesn't happen with ther secondary cameras (func_reflective_glass, func_monitor and portals).

See also

External links