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;
|
TEMP shadow;
|
||||||
|
|
||||||
TEX tex, v_tex, texture[0], 2D;
|
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
|
#if USE_TRANSPARENT
|
||||||
MOV result.color.a, tex;
|
MOV result.color.a, tex;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
!!ARBfp1.0
|
!!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
|
END
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<require context="MODE_SHADOWCAST || MODE_SILHOUETTEOCCLUDER"/>
|
<require context="MODE_SHADOWCAST || MODE_SILHOUETTEOCCLUDER"/>
|
||||||
<require shaders="arb"/>
|
<require shaders="arb"/>
|
||||||
<pass shader="arb/model_solid_tex">
|
<pass shader="arb/model_solid_tex">
|
||||||
<alpha func="greater" ref="0.4"/>
|
<define name="REQUIRE_ALPHA_GEQUAL" value="0.4"/>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
@ -13,7 +13,7 @@
|
|||||||
<require context="MODE_SHADOWCAST || MODE_SILHOUETTEOCCLUDER"/>
|
<require context="MODE_SHADOWCAST || MODE_SILHOUETTEOCCLUDER"/>
|
||||||
<require shaders="glsl"/>
|
<require shaders="glsl"/>
|
||||||
<pass shader="glsl/model_solid_tex">
|
<pass shader="glsl/model_solid_tex">
|
||||||
<define name="REQUIRE_ALPHA_GREATER" value="0.4"/>
|
<define name="REQUIRE_ALPHA_GEQUAL" value="0.4"/>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
@ -23,7 +23,7 @@
|
|||||||
<define name="USE_PLAYERCOLOR" value="0"/>
|
<define name="USE_PLAYERCOLOR" value="0"/>
|
||||||
<define name="USE_OBJECTCOLOR" value="0"/>
|
<define name="USE_OBJECTCOLOR" value="0"/>
|
||||||
<pass shader="fixed:model_solid_tex">
|
<pass shader="fixed:model_solid_tex">
|
||||||
<alpha func="greater" ref="0.4"/>
|
<alpha func="gequal" ref="0.4"/>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
@ -61,7 +61,7 @@
|
|||||||
<require shaders="arb"/>
|
<require shaders="arb"/>
|
||||||
<pass shader="arb/model_common">
|
<pass shader="arb/model_common">
|
||||||
<define name="USE_TRANSPARENT" value="1"/>
|
<define name="USE_TRANSPARENT" value="1"/>
|
||||||
<alpha func="greater" ref="0.4"/>
|
<define name="REQUIRE_ALPHA_GEQUAL" value="0.4"/>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
@ -70,7 +70,7 @@
|
|||||||
<require shaders="glsl"/>
|
<require shaders="glsl"/>
|
||||||
<pass shader="glsl/model_common">
|
<pass shader="glsl/model_common">
|
||||||
<define name="USE_TRANSPARENT" value="1"/>
|
<define name="USE_TRANSPARENT" value="1"/>
|
||||||
<define name="REQUIRE_ALPHA_GREATER" value="0.4"/>
|
<define name="REQUIRE_ALPHA_GEQUAL" value="0.4"/>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
@ -78,7 +78,7 @@
|
|||||||
<require context="USE_ALPHATEST"/>
|
<require context="USE_ALPHATEST"/>
|
||||||
<require shaders="fixed"/>
|
<require shaders="fixed"/>
|
||||||
<pass shader="fixed:model">
|
<pass shader="fixed:model">
|
||||||
<alpha func="greater" ref="0.4"/>
|
<alpha func="gequal" ref="0.4"/>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
@ -89,7 +89,7 @@
|
|||||||
<require shaders="arb"/>
|
<require shaders="arb"/>
|
||||||
<pass shader="arb/model_common">
|
<pass shader="arb/model_common">
|
||||||
<define name="USE_TRANSPARENT" value="1"/>
|
<define name="USE_TRANSPARENT" value="1"/>
|
||||||
<alpha func="greater" ref="0.9375"/>
|
<define name="REQUIRE_ALPHA_GEQUAL" value="0.9375"/>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
@ -98,7 +98,7 @@
|
|||||||
<require shaders="glsl"/>
|
<require shaders="glsl"/>
|
||||||
<pass shader="glsl/model_common">
|
<pass shader="glsl/model_common">
|
||||||
<define name="USE_TRANSPARENT" value="1"/>
|
<define name="USE_TRANSPARENT" value="1"/>
|
||||||
<define name="REQUIRE_ALPHA_GREATER" value="0.9375"/>
|
<define name="REQUIRE_ALPHA_GEQUAL" value="0.9375"/>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
@ -106,7 +106,7 @@
|
|||||||
<require context="ALPHABLEND_PASS_OPAQUE"/>
|
<require context="ALPHABLEND_PASS_OPAQUE"/>
|
||||||
<require shaders="fixed"/>
|
<require shaders="fixed"/>
|
||||||
<pass shader="fixed:model">
|
<pass shader="fixed:model">
|
||||||
<alpha func="greater" ref="0.9375"/>
|
<alpha func="gequal" ref="0.9375"/>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
@ -118,7 +118,7 @@
|
|||||||
<sort_by_distance/>
|
<sort_by_distance/>
|
||||||
<pass shader="arb/model_common">
|
<pass shader="arb/model_common">
|
||||||
<define name="USE_TRANSPARENT" value="1"/>
|
<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"/>
|
<blend src="src_alpha" dst="one_minus_src_alpha"/>
|
||||||
<depth func="less" mask="false"/>
|
<depth func="less" mask="false"/>
|
||||||
</pass>
|
</pass>
|
||||||
@ -130,7 +130,7 @@
|
|||||||
<sort_by_distance/>
|
<sort_by_distance/>
|
||||||
<pass shader="glsl/model_common">
|
<pass shader="glsl/model_common">
|
||||||
<define name="USE_TRANSPARENT" value="1"/>
|
<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"/>
|
<blend src="src_alpha" dst="one_minus_src_alpha"/>
|
||||||
<depth func="less" mask="false"/>
|
<depth func="less" mask="false"/>
|
||||||
</pass>
|
</pass>
|
||||||
@ -142,7 +142,7 @@
|
|||||||
<sort_by_distance/>
|
<sort_by_distance/>
|
||||||
<pass shader="fixed:model">
|
<pass shader="fixed:model">
|
||||||
<define name="USE_TRANSPARENT" value="1"/>
|
<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"/>
|
<blend src="src_alpha" dst="one_minus_src_alpha"/>
|
||||||
<depth func="less" mask="false"/>
|
<depth func="less" mask="false"/>
|
||||||
</pass>
|
</pass>
|
||||||
|
@ -74,17 +74,18 @@ void main()
|
|||||||
{
|
{
|
||||||
vec4 tex = texture2D(baseTex, v_tex);
|
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
|
#if USE_TRANSPARENT
|
||||||
gl_FragColor.a = tex.a;
|
gl_FragColor.a = tex.a;
|
||||||
#else
|
#else
|
||||||
gl_FragColor.a = 1.0;
|
gl_FragColor.a = 1.0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef REQUIRE_ALPHA_GREATER
|
|
||||||
if (gl_FragColor.a <= REQUIRE_ALPHA_GREATER)
|
|
||||||
discard;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
vec3 texdiffuse = tex.rgb;
|
vec3 texdiffuse = tex.rgb;
|
||||||
|
|
||||||
// Apply-coloring based on texture alpha
|
// Apply-coloring based on texture alpha
|
||||||
|
@ -6,10 +6,12 @@ varying vec2 v_tex;
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_FragColor = texture2D(baseTex, v_tex);
|
vec4 tex = texture2D(baseTex, v_tex);
|
||||||
|
|
||||||
#ifdef REQUIRE_ALPHA_GREATER
|
#ifdef REQUIRE_ALPHA_GEQUAL
|
||||||
if (gl_FragColor.a <= REQUIRE_ALPHA_GREATER)
|
if (tex.a < REQUIRE_ALPHA_GEQUAL)
|
||||||
discard;
|
discard;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
gl_FragColor = tex;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user