Skip to content

Commit

Permalink
shaders: Fix transparency on GC7000L (#10036)
Browse files Browse the repository at this point in the history
Workaround for the missing GL_ALPHA_TEST implementation in Mesa (etnaviv driver).
  • Loading branch information
mntmn authored Aug 25, 2020
1 parent f27cf47 commit 44c9808
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
8 changes: 8 additions & 0 deletions client/shaders/nodes_shader/opengl_fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,14 @@ void main(void)
#endif
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.
if (base.a == 0.0) {
discard;
}
#endif

#ifdef ENABLE_BUMPMAPPING
if (use_normalmap) {
vec3 L = normalize(lightVec);
Expand Down
8 changes: 8 additions & 0 deletions client/shaders/object_shader/opengl_fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,14 @@ void main(void)

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.
if (base.a == 0.0) {
discard;
}
#endif

#ifdef ENABLE_BUMPMAPPING
if (use_normalmap) {
vec3 L = normalize(lightVec);
Expand Down
18 changes: 18 additions & 0 deletions src/client/shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "gamedef.h"
#include "client/tile.h"

#if ENABLE_GLES
#ifdef _IRR_COMPILE_WITH_OGLES1_
#include <GLES/gl.h>
#else
#include <GLES2/gl2.h>
#endif
#else
#include <GL/gl.h>
#endif

/*
A cache from shader name to shader path
*/
Expand Down Expand Up @@ -607,6 +617,14 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp
// Create shaders header
std::string shaders_header = "#version 120\n";

#ifdef __unix__
// For renderers that should use discard instead of GL_ALPHA_TEST
const char* gl_renderer = (const char*)glGetString(GL_RENDERER);
if (strstr(gl_renderer, "GC7000")) {
shaders_header += "#define USE_DISCARD\n";
}
#endif

static const char* drawTypes[] = {
"NDT_NORMAL",
"NDT_AIRLIKE",
Expand Down

0 comments on commit 44c9808

Please sign in to comment.