forked from 0ad/0ad
Do alpha-testing earlier in ARB shaders, for performance.
This was SVN commit r11477.
This commit is contained in:
parent
e6a82fff48
commit
d3a24c26ba
@ -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
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user