diff --git a/binaries/data/mods/public/shaders/arb/model_common.fp b/binaries/data/mods/public/shaders/arb/model_common.fp index 98e068674e..ea564992e8 100644 --- a/binaries/data/mods/public/shaders/arb/model_common.fp +++ b/binaries/data/mods/public/shaders/arb/model_common.fp @@ -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 diff --git a/binaries/data/mods/public/shaders/arb/solid_tex.fp b/binaries/data/mods/public/shaders/arb/solid_tex.fp index cc315b0280..1620f86f39 100644 --- a/binaries/data/mods/public/shaders/arb/solid_tex.fp +++ b/binaries/data/mods/public/shaders/arb/solid_tex.fp @@ -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 diff --git a/binaries/data/mods/public/shaders/effects/model_transparent.xml b/binaries/data/mods/public/shaders/effects/model_transparent.xml index c8fe36ddd0..8a03fe1358 100644 --- a/binaries/data/mods/public/shaders/effects/model_transparent.xml +++ b/binaries/data/mods/public/shaders/effects/model_transparent.xml @@ -5,7 +5,7 @@ - + @@ -13,7 +13,7 @@ - + @@ -23,7 +23,7 @@ - + @@ -61,7 +61,7 @@ - + @@ -70,7 +70,7 @@ - + @@ -78,7 +78,7 @@ - + @@ -89,7 +89,7 @@ - + @@ -98,7 +98,7 @@ - + @@ -106,7 +106,7 @@ - + @@ -118,7 +118,7 @@ - + @@ -130,7 +130,7 @@ - + @@ -142,7 +142,7 @@ - + diff --git a/binaries/data/mods/public/shaders/glsl/model_common.fs b/binaries/data/mods/public/shaders/glsl/model_common.fs index 1682a2edda..7736133a5a 100644 --- a/binaries/data/mods/public/shaders/glsl/model_common.fs +++ b/binaries/data/mods/public/shaders/glsl/model_common.fs @@ -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 diff --git a/binaries/data/mods/public/shaders/glsl/solid_tex.fs b/binaries/data/mods/public/shaders/glsl/solid_tex.fs index 3b5a26264e..4ad2195f8b 100644 --- a/binaries/data/mods/public/shaders/glsl/solid_tex.fs +++ b/binaries/data/mods/public/shaders/glsl/solid_tex.fs @@ -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; }