vec2 uv = varTexCoord.st;
vec4 base = texture2D(baseTexture, uv).rgba;
-#ifdef USE_DISCARD
// If alpha is zero, we can just discard the pixel. This fixes transparency
// on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa,
// and also on GLES 2, where GL_ALPHA_TEST is missing entirely.
- if (base.a == 0.0) {
+#ifdef USE_DISCARD
+ if (base.a == 0.0)
+ discard;
+#endif
+#ifdef USE_DISCARD_REF
+ if (base.a < 0.5)
discard;
- }
#endif
color = base.rgb;
vec2 uv = varTexCoord.st;
vec4 base = texture2D(baseTexture, uv).rgba;
-#ifdef USE_DISCARD
// If alpha is zero, we can just discard the pixel. This fixes transparency
// on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa,
// and also on GLES 2, where GL_ALPHA_TEST is missing entirely.
- if (base.a == 0.0) {
+#ifdef USE_DISCARD
+ if (base.a == 0.0)
+ discard;
+#endif
+#ifdef USE_DISCARD_REF
+ if (base.a < 0.5)
discard;
- }
#endif
color = base.rgb;
if (strstr(gl_renderer, "GC7000"))
use_discard = true;
#endif
- if (use_discard && shaderinfo.base_material != video::EMT_SOLID)
- shaders_header << "#define USE_DISCARD 1\n";
+ if (use_discard) {
+ if (shaderinfo.base_material == video::EMT_TRANSPARENT_ALPHA_CHANNEL)
+ shaders_header << "#define USE_DISCARD 1\n";
+ else if (shaderinfo.base_material == video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF)
+ shaders_header << "#define USE_DISCARD_REF 1\n";
+ }
#define PROVIDE(constant) shaders_header << "#define " #constant " " << (int)constant << "\n"