From Valve Developer Community
Jump to: navigation, search
Phong shading provides Alyx's skin, hairband and lip highlights.

The $phong VMT command provides diffuse reflections. In most engine branches it is only available with VertexLitGeneric; <Counter-Strike: Global Offensive> Counter-Strike: Global Offensive (as of early 2015) allows it to a limited extent on LightmappedGeneric. For a full explanation, see Phong materials.

VMT syntax

$phong <bool>

The Phong shader should use the default values for any configuration parameters that you omit from your material. However it appears that this doesn't happen. Therefore all of the below parameters are required, even if they stay on their default values.

	$phong 1

	$bumpmap				[texture]
	$phongexponent			5			// either/or
	$phongexponenttexture	[texture]	// either/or
	$phongboost				1.0
	$phongfresnelranges		"[0 0.5 1]"



$bumpmap <texture>
There must be a bump map. Its alpha channel acts as a Phong mask by default.
$BasemapLuminancePhongMask <bool> (in all games since <Left 4 Dead>)
Phong intensity is based on the brightness of $basetexture.
$BasemapAlphaPhongMask <bool>
Reads the Phong mask from $basetexture's alpha channel instead of $bumpmap's.
$PhongExponent <int>
$PhongExponentTexture <texture>
An global exponent value, or a per-texel exponent texture map. The numeric value wins if both are present. In an exponent map:
  • Red channel: Exponent (size of highlight, higher is larger)
  • Green channel: Albedo tint (if $phongalbedotint 1, higher is more tint)
  • Blue channel: Nothing
  • Alpha channel: $rimlight mask
$shinyblood <int> (in all games since <Left 4 Dead>)
$shinybloodexponent <int> (in all games since <Left 4 Dead>)
To do: See Shading a Bigger, Better Sequel: Techniques in Left 4 Dead 2.
$allowdiffusemodulation <int>
To do
To do: Does this have something to do with the $phongexponent, $phongexponenttexture or both?


$phongboost <int>
Phong brightness factor. The phong mask channel should be authored to account for this.
$PhongFresnelRanges <matrix>
See Phong Fresnel ranges. Default is "[0 0.5 1]".
$PhongDisableHalfLambert <bool> (in all games since [Portal 2])
Used in Portal 2 on the Personality Cores such as Wheatley, disables functionality of $halflambert. MAY need $halflambert 0!
$AmbientOcclusionTexture <texture>
A "dirtmap". Mentioned in the SDK samples and seen in the VMT for Alyx's face. Ambient Occlusion is generally used for the eyes and face.


$PhongAlbedoTint <bool>
Allows the $basetexture to affect the colour of the Phong highlight. The amount of tint is defined by the green channel of $phongexponenttexture (see above).
$phongtint "[<red float> <green float> <blue float>]"
Modifies the colour of the phong reflection. The channels are interpreted relative to each other (so "[0 0 0]" and "[1 1 1]" are the same).
$PhongWarpTexture <texture> (in all games since <Half-Life 2: Episode Two><Half-Life 2: Episode Two>)
To do: Used to create an iridescence effect, as seen on npc_hunters.

Phong shading on brush faces

A May 2015 update to <Counter-Strike: Global Offensive> Counter-Strike: Global Offensive added limited support for Phong-based highlights on LightmappedGeneric materials. Currently it only works when the material is directly lit by an env_cascade_lighting, using the dynamic shadows as a mask (although traditional Phong masking is supported on top of this). It is known to work on displacements as well as WorldVertexTransition materials, but not water or Lightmapped_4WayBlend.

New Parameters

$phongMaskContrastBrightness "[<float> <float>]"
Defines the contrast level between light and dark areas in the mask, and the overall brightness, respectively. Added along with support for phong-shaded lightmapped textures. To do: Find out the range of both values, and whether or not it can be used on models.
$phongAmount "[<red float> <green float> <blue float> <brightness> float]"
Controls the tint and brightness. The fourth value can go beyond 1, but affects the brightness of the whole texture, not just the highlight.

See also