1
0
forked from 0ad/0ad

Do alpha-testing earlier in ARB shaders, for performance.

This was SVN commit r11477.
This commit is contained in:
Ykkrosh 2012-04-10 21:08:54 +00:00
parent e6a82fff48
commit d3a24c26ba
5 changed files with 40 additions and 21 deletions

View File

@ -40,6 +40,13 @@ TEMP color;
TEMP shadow;
TEX tex, v_tex, texture[0], 2D;
// Alpha-test as early as possible
#ifdef REQUIRE_ALPHA_GEQUAL
SUB temp.x, tex.a, REQUIRE_ALPHA_GEQUAL;
KIL temp.x; // discard if < 0.0
#endif
#if USE_TRANSPARENT
MOV result.color.a, tex;
#endif

View File

@ -1,3 +1,12 @@
!!ARBfp1.0
TEX result.color, fragment.texcoord[0], texture[0], 2D;
#ifdef REQUIRE_ALPHA_GEQUAL
TEMP tex;
TEMP temp;
TEX tex, fragment.texcoord[0], texture[0], 2D;
SUB temp.x, tex.a, REQUIRE_ALPHA_GEQUAL;
KIL temp.x; // discard if < 0.0
MOV result.color, tex;
#else
TEX result.color, fragment.texcoord[0], texture[0], 2D;
#endif
END

View File

@ -5,7 +5,7 @@
<require context="MODE_SHADOWCAST || MODE_SILHOUETTEOCCLUDER"/>
<require shaders="arb"/>
<pass shader="arb/model_solid_tex">
<alpha func="greater" ref="0.4"/>
<define name="REQUIRE_ALPHA_GEQUAL" value="0.4"/>
</pass>
</technique>
@ -13,7 +13,7 @@
<require context="MODE_SHADOWCAST || MODE_SILHOUETTEOCCLUDER"/>
<require shaders="glsl"/>
<pass shader="glsl/model_solid_tex">
<define name="REQUIRE_ALPHA_GREATER" value="0.4"/>
<define name="REQUIRE_ALPHA_GEQUAL" value="0.4"/>
</pass>
</technique>
@ -23,7 +23,7 @@
<define name="USE_PLAYERCOLOR" value="0"/>
<define name="USE_OBJECTCOLOR" value="0"/>
<pass shader="fixed:model_solid_tex">
<alpha func="greater" ref="0.4"/>
<alpha func="gequal" ref="0.4"/>
</pass>
</technique>
@ -61,7 +61,7 @@
<require shaders="arb"/>
<pass shader="arb/model_common">
<define name="USE_TRANSPARENT" value="1"/>
<alpha func="greater" ref="0.4"/>
<define name="REQUIRE_ALPHA_GEQUAL" value="0.4"/>
</pass>
</technique>
@ -70,7 +70,7 @@
<require shaders="glsl"/>
<pass shader="glsl/model_common">
<define name="USE_TRANSPARENT" value="1"/>
<define name="REQUIRE_ALPHA_GREATER" value="0.4"/>
<define name="REQUIRE_ALPHA_GEQUAL" value="0.4"/>
</pass>
</technique>
@ -78,7 +78,7 @@
<require context="USE_ALPHATEST"/>
<require shaders="fixed"/>
<pass shader="fixed:model">
<alpha func="greater" ref="0.4"/>
<alpha func="gequal" ref="0.4"/>
</pass>
</technique>
@ -89,7 +89,7 @@
<require shaders="arb"/>
<pass shader="arb/model_common">
<define name="USE_TRANSPARENT" value="1"/>
<alpha func="greater" ref="0.9375"/>
<define name="REQUIRE_ALPHA_GEQUAL" value="0.9375"/>
</pass>
</technique>
@ -98,7 +98,7 @@
<require shaders="glsl"/>
<pass shader="glsl/model_common">
<define name="USE_TRANSPARENT" value="1"/>
<define name="REQUIRE_ALPHA_GREATER" value="0.9375"/>
<define name="REQUIRE_ALPHA_GEQUAL" value="0.9375"/>
</pass>
</technique>
@ -106,7 +106,7 @@
<require context="ALPHABLEND_PASS_OPAQUE"/>
<require shaders="fixed"/>
<pass shader="fixed:model">
<alpha func="greater" ref="0.9375"/>
<alpha func="gequal" ref="0.9375"/>
</pass>
</technique>
@ -118,7 +118,7 @@
<sort_by_distance/>
<pass shader="arb/model_common">
<define name="USE_TRANSPARENT" value="1"/>
<alpha func="greater" ref="0.0"/>
<define name="REQUIRE_ALPHA_GEQUAL" value="0.05"/>
<blend src="src_alpha" dst="one_minus_src_alpha"/>
<depth func="less" mask="false"/>
</pass>
@ -130,7 +130,7 @@
<sort_by_distance/>
<pass shader="glsl/model_common">
<define name="USE_TRANSPARENT" value="1"/>
<define name="REQUIRE_ALPHA_GREATER" value="0.0"/>
<define name="REQUIRE_ALPHA_GEQUAL" value="0.05"/>
<blend src="src_alpha" dst="one_minus_src_alpha"/>
<depth func="less" mask="false"/>
</pass>
@ -142,7 +142,7 @@
<sort_by_distance/>
<pass shader="fixed:model">
<define name="USE_TRANSPARENT" value="1"/>
<alpha func="greater" ref="0.0"/>
<alpha func="gequal" ref="0.05"/>
<blend src="src_alpha" dst="one_minus_src_alpha"/>
<depth func="less" mask="false"/>
</pass>

View File

@ -74,17 +74,18 @@ void main()
{
vec4 tex = texture2D(baseTex, v_tex);
// Alpha-test as early as possible
#ifdef REQUIRE_ALPHA_GEQUAL
if (tex.a < REQUIRE_ALPHA_GEQUAL)
discard;
#endif
#if USE_TRANSPARENT
gl_FragColor.a = tex.a;
#else
gl_FragColor.a = 1.0;
#endif
#ifdef REQUIRE_ALPHA_GREATER
if (gl_FragColor.a <= REQUIRE_ALPHA_GREATER)
discard;
#endif
vec3 texdiffuse = tex.rgb;
// Apply-coloring based on texture alpha

View File

@ -6,10 +6,12 @@ varying vec2 v_tex;
void main()
{
gl_FragColor = texture2D(baseTex, v_tex);
vec4 tex = texture2D(baseTex, v_tex);
#ifdef REQUIRE_ALPHA_GREATER
if (gl_FragColor.a <= REQUIRE_ALPHA_GREATER)
#ifdef REQUIRE_ALPHA_GEQUAL
if (tex.a < REQUIRE_ALPHA_GEQUAL)
discard;
#endif
gl_FragColor = tex;
}