$alphatest: Difference between revisions
| NvC DmN CH (talk | contribs) mNo edit summary | No edit summary | ||
| (52 intermediate revisions by 14 users not shown) | |||
| Line 1: | Line 1: | ||
| {{LanguageBar|title=$alphatest}} | |||
| {{ | {{this is a|shader parameter|name=$alphatest}} 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 <code>$allowalphatocoverage</code> is also used. This effect is similar to <code>[[$translucent]]</code>, except that it can not be semi-opaque (without {{w|Colour banding|banding}}), is much faster to render, and the engine can always sort it properly when layered (instead of only on non-[[func_detail|detail]] [[worldspawn]]). | ||
| ==Syntax== | |||
| {{CodeBlock|$alphatest <[[Boolean|bool]]>}} | |||
| ==VMT  | ==VMT example== | ||
| {{CodeBlock|lines=7|[[LightmappedGeneric]]<nowiki> | |||
| { | |||
| 	</nowiki>[[$basetexture]]<nowiki>			"glass\window001a" | |||
| 	$alphatest				1 | |||
| 	$alphatestreference		0.5 | |||
| 	$allowalphatocoverage	1 | |||
| }</nowiki>}} | |||
| ==Additional parameters== | ==Additional parameters== | ||
| {{MatParamDef|$alphatestreference|nolink=1|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. | |||
| {{expand|title=Notes| | |||
| {{Important|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.}} | |||
| {{bug|Updating <code>$alphatestreference</code> in real time with [[Material_proxies|proxies]] only affects projected shadows (like the flashlight). {{Tip|This limitation can be circumvented by using $alphatestreference 1, and modifying the <code>[[$alpha]]</code> value instead. (requires $alpha to be raised above 1, its normal threshold, this may cause sorting issues)}} {{Tip|For [[VertexLitGeneric|VertexLitGeneric]] on models you can use <code>[[$detail]]</code> with <code>$detailblendmode 3</code> and modify the <code>$detailblendfactor</code> value. Detail texture must be a copy of <code>[[$basetexture]]</code> with a different alpha channel.}} | |||
| }} | |||
| }} }}  | |||
| {{MatParamDef|$allowalphatocoverage|nolink=1|bool|Creates translucent steps based on alpha values. Can be used for softer edges, as well as greatly reducing shimmering when viewed at a distance.<br>While it may not immediately appear to be the case, <code>$alphatestreference</code>is still used when this command is used, for controlling projected shadow masking, for if the client has MSAA disabled, and in Hammer (where $allowalphatocoverage doesn't work). | |||
| {{Expand|title=Notes| | |||
| {{warning|[[Anti-aliasing#MSAA|MSAA]] must be enabled in order for this to have an effect.<br>The granularity of the steps is dependent on chosen amount of MSAA; 2x MSAA will have fewer translucent steps than 8x MSAA. {{note|At 8x MSAA (Tested in {{src13|2}}) there are 7 translucency steps. ( 9 if you include fully Opaque and fully Transparent )<br> | |||
| The levels should roughly be arranged as such:<br> | |||
| <code>Linear : fully transparent - 0.06 - 0.18 - 0.31 - 0.43 - 0.56 - 0.68 - 0.81 - 0.93 - fully opaque</code><br> | |||
| {{ | <code>RGB : fully transparent - 15 - 46 - 80 - 110 - 143 - 174 - 207 - 238 - fully opaque</code><br> | ||
| ( 0-255 values are rounded to the next highest. Formula used is <code>LinearValue * 255)</code> | |||
| {{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|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== | |||
| <div> | |||
| {|class=wikitable | {|class=wikitable | ||
| ! $translucent||$alphatest | ! <code>$translucent</code>||<code>$alphatest</code> | ||
| |- | |- | ||
| | [[File:Alphatest_preview_original.png|thumb| | | [[File:Alphatest_preview_original.png|thumb|50%|center|Original image, rendered with $translucent]] || [[File:Alphatest_preview.gif|thumb|50%|center|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 hardly changes. | </div> | ||
| Notice how the right circle, which has a sharp alpha channel, hardly changes. | |||
| *<code>[[$alpha]]</code> | ==See also== | ||
| *<code>[[$distancealpha]]</code> | *<code>[[$alpha]]</code> | ||
| *<code>[[$ | *<code>[[$distancealpha]]</code> | ||
| *<code>[[$vertexalpha]]</code> | |||
| [[Category: | [[Category:Shader parameters|alphatest]] | ||
Latest revision as of 11:40, 23 August 2025
$alphatest  is a   material shader parameter  available in all  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
 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).
 banding), is much faster to render, and the engine can always sort it properly when layered (instead of only on non-detail worldspawn).
Syntax
VMT example
Additional parameters
|  Important: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.  Bug:Updating $alphatestreferencein real time with proxies only affects projected shadows (like the flashlight). Tip:This limitation can be circumvented by using $alphatestreference 1, and modifying the $alphavalue instead. (requires $alpha to be raised above 1, its normal threshold, this may cause sorting issues) Tip:For VertexLitGeneric on models you can use $detailwith$detailblendmode 3and modify the$detailblendfactorvalue. Detail texture must be a copy of$basetexturewith a different alpha channel. | 
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 Hammer (where $allowalphatocoverage doesn't work).
|  Warning: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:At 8x MSAA (Tested in  Source 2013) there are 7 translucency steps. ( 9 if you include fully Opaque and fully Transparent ) The levels should roughly be arranged as such: 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: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 | 
|---|---|
Notice how the right circle, which has a sharp alpha channel, hardly changes.




























