$alphatest

From Valve Developer Community
(Redirected from Alpha to coverage)
Jump to navigation Jump to search
English (en)Español (es)Русский (ru)中文 (zh)Translate (Translate)

$alphatest is a material shader parameter available in all Source Source games. It specifies a mask to use to determine binary opacity. White represents fully opaque, while black represents fully transparent. Any values in-between are rounded to either 0 or 1, unless $allowalphatocoverage is also used. This effect is similar to $translucent, except that it can not be semi-opaque (without banding), is much faster to render, and the engine can always sort it properly when layered (instead of only on non-detail worldspawn).

Syntax

$alphatest <bool>

VMT example

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
LightmappedGeneric { $basetexture "glass\window001a" $alphatest 1 $alphatestreference 0.5 $allowalphatocoverage 1 }

Additional parameters

$alphatestreference <float>
Specifies the threshold alpha channel value at which the surface should be transparent instead of opaque. A value of ".3" will create a thicker shape while a value of ".7" will create a thinner shape.
Notes and Caveats
Icon-Important.pngImportant: Unintuitively, this parameter does not default to "0.5". LightmappedGeneric, UnlitGeneric, and VertexLitGeneric all default to "0.7" instead. To avoid unexpected results, this parameter should always be set.
Icon-Bug.pngBug:Updating $alphatestreference in real time with proxies only affects projected shadows (like the flashlight).
Tip.pngTip: This limitation can be circumvented by using $alphatestreference 1, and modifying the $alpha value instead. (requires $alpha to be raised above 1, its normal threshold, this may cause sorting issues)
Tip.pngTip: For VertexLitGeneric on models you can use $detail with $detailblendmode 3 and modify the $detailblendfactor value. Detail texture must be a copy of $basetexture with a different alpha channel.
  [todo tested in ?]
$allowalphatocoverage <boolean>
Creates translucent steps based on alpha values. Can be used for softer edges, as well as greatly reducing shimmering when viewed at a distance.
While it may not immediately appear to be the case, $alphatestreferenceis still used when this command is used, for controlling projected shadow masking, for if the client has MSAA disabled, and in vanilla Hammer (where antialiasing is unavailable).
Notes and Caveats
Warning.pngWarning: MSAA must be enabled in order for this to have an effect.
The granularity of the steps is dependent on chosen amount of MSAA; 2x MSAA will have fewer translucent steps than 8x MSAA.
Note.pngNote: At 8x MSAA (Tested in Source 2013 Source 2013) there are 7 translucency steps. ( 9 if you include fully Opaque and fully Transparent )

The levels should roughly be arranged as such:
Linear : fully transparent - 0.06 - 0.18 - 0.31 - 0.43 - 0.56 - 0.68 - 0.81 - 0.93 - fully opaque
RGB : fully transparent - 15 - 46 - 80 - 110 - 143 - 174 - 207 - 238 - fully opaque
( 0-255 values are rounded to the next highest. Formula used is LinearValue * 255)

Todo: Make a table for this. One that considers other MSAA Levels. There are always 1 fewer translucency steps than the number of MSAA samples (or one additional, if including fully transparent and fully opaque).
Tip.pngTip: Alpha to coverage works best with sharp, high-resolution alpha channels, as this mitigates the inherent banding artefacts caused by the stock shaders' lack of sharpening when magnifying alpha to coverage textures.

Comparison

$translucent $alphatest
Original image, rendered with $translucent
Animated preview of the same image, but with $alphatest. The first image shows the effect of $allowalphatocoverage 1 (at 4x MSAA). The rest show $alphatest with $alphatestreference ranging from 0.1 to 0.9. Click image if not animating.

Notice how the right circle, which has a sharp alpha channel, hardly changes.

See also