aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormntmn <lukas@mnt.mn>2020-08-25 20:49:51 +0200
committerGitHub <noreply@github.com>2020-08-25 20:49:51 +0200
commit44c98089cf923fda924902bceec4edb01f36ce2c (patch)
treeb940582becd30e2de4b9b1fe4e08debe4dde87e0
parentf27cf4777933f06f85fa2f013d56ca0a2cf1d588 (diff)
downloadminetest-44c98089cf923fda924902bceec4edb01f36ce2c.tar.gz
minetest-44c98089cf923fda924902bceec4edb01f36ce2c.tar.bz2
minetest-44c98089cf923fda924902bceec4edb01f36ce2c.zip
shaders: Fix transparency on GC7000L (#10036)
Workaround for the missing GL_ALPHA_TEST implementation in Mesa (etnaviv driver).
-rw-r--r--client/shaders/nodes_shader/opengl_fragment.glsl8
-rw-r--r--client/shaders/object_shader/opengl_fragment.glsl8
-rw-r--r--src/client/shader.cpp18
3 files changed, 34 insertions, 0 deletions
diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl
index 19e6c2d86..7213612bd 100644
--- a/client/shaders/nodes_shader/opengl_fragment.glsl
+++ b/client/shaders/nodes_shader/opengl_fragment.glsl
@@ -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);
diff --git a/client/shaders/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl
index 0534dc049..2d33ca439 100644
--- a/client/shaders/object_shader/opengl_fragment.glsl
+++ b/client/shaders/object_shader/opengl_fragment.glsl
@@ -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);
diff --git a/src/client/shader.cpp b/src/client/shader.cpp
index ee6079f7a..0aba7b118 100644
--- a/src/client/shader.cpp
+++ b/src/client/shader.cpp
@@ -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
*/
@@ -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",