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;
}