Skip to content

Commit

Permalink
Fix GLES2 discard behaviour (texture transparency)
Browse files Browse the repository at this point in the history
  • Loading branch information
sfan5 committed Sep 17, 2021
1 parent d1e0f73 commit ea250ff
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 8 deletions.
9 changes: 6 additions & 3 deletions client/shaders/nodes_shader/opengl_fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -463,13 +463,16 @@ void main(void)
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;
Expand Down
9 changes: 6 additions & 3 deletions client/shaders/object_shader/opengl_fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -328,13 +328,16 @@ void main(void)
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;
Expand Down
8 changes: 6 additions & 2 deletions src/client/shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -674,8 +674,12 @@ ShaderInfo ShaderSource::generateShader(const std::string &name,
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"

Expand Down

0 comments on commit ea250ff

Please sign in to comment.