diff --git a/gfx/drivers/gl_shaders/pipeline_xmb_ribbon.glsl.vert.h b/gfx/drivers/gl_shaders/legacy_pipeline_xmb_ribbon.glsl.vert.h
similarity index 88%
rename from gfx/drivers/gl_shaders/pipeline_xmb_ribbon.glsl.vert.h
rename to gfx/drivers/gl_shaders/legacy_pipeline_xmb_ribbon.glsl.vert.h
index 7cbf564448..f3f6954d6d 100644
--- a/gfx/drivers/gl_shaders/pipeline_xmb_ribbon.glsl.vert.h
+++ b/gfx/drivers/gl_shaders/legacy_pipeline_xmb_ribbon.glsl.vert.h
@@ -1,11 +1,6 @@
-static const char *stock_vertex_xmb =
-   "#if __VERSION__ >= 130\n"
-   "#define COMPAT_VARYING out\n"
-   "#define COMPAT_ATTRIBUTE in\n"
-   "#else\n"
+static const char *stock_vertex_xmb_legacy =
    "#define COMPAT_VARYING varying\n"
    "#define COMPAT_ATTRIBUTE attribute\n"
-   "#endif\n"
    "COMPAT_ATTRIBUTE vec3 VertexCoord;\n"
    "uniform float time;\n"
    "COMPAT_VARYING vec3 fragVertexEc;\n"
diff --git a/gfx/drivers/gl_shaders/pipeline_xmb_ribbon_simple.glsl.vert.h b/gfx/drivers/gl_shaders/legacy_pipeline_xmb_ribbon_simple.glsl.vert.h
similarity index 84%
rename from gfx/drivers/gl_shaders/pipeline_xmb_ribbon_simple.glsl.vert.h
rename to gfx/drivers/gl_shaders/legacy_pipeline_xmb_ribbon_simple.glsl.vert.h
index d57edd8fac..41c26eef18 100644
--- a/gfx/drivers/gl_shaders/pipeline_xmb_ribbon_simple.glsl.vert.h
+++ b/gfx/drivers/gl_shaders/legacy_pipeline_xmb_ribbon_simple.glsl.vert.h
@@ -1,11 +1,6 @@
-static const char *stock_vertex_xmb_simple =
-   "#if __VERSION__ >= 130\n"
-   "#define COMPAT_VARYING out\n"
-   "#define COMPAT_ATTRIBUTE in\n"
-   "#else\n"
+static const char *stock_vertex_xmb_simple_legacy =
    "#define COMPAT_VARYING varying\n"
    "#define COMPAT_ATTRIBUTE attribute\n"
-   "#endif\n"
    "COMPAT_ATTRIBUTE vec3 VertexCoord;\n"
    "uniform float time;\n"
    "float iqhash( float n )\n"
diff --git a/gfx/drivers/gl_shaders/modern_pipeline_xmb_ribbon.glsl.vert.h b/gfx/drivers/gl_shaders/modern_pipeline_xmb_ribbon.glsl.vert.h
new file mode 100644
index 0000000000..2bd5e2ddbf
--- /dev/null
+++ b/gfx/drivers/gl_shaders/modern_pipeline_xmb_ribbon.glsl.vert.h
@@ -0,0 +1,45 @@
+static const char *stock_vertex_xmb_modern =
+   "#define COMPAT_VARYING out\n"
+   "#define COMPAT_ATTRIBUTE in\n"
+   "COMPAT_ATTRIBUTE vec3 VertexCoord;\n"
+   "uniform float time;\n"
+   "COMPAT_VARYING vec3 fragVertexEc;\n"
+   "float iqhash( float n )\n"
+   "{\n"
+   "  return fract(sin(n)*43758.5453);\n"
+   "}\n"
+   "float noise( vec3 x )\n"
+   "{\n"
+   "  vec3 p = floor(x);\n"
+   "  vec3 f = fract(x);\n"
+   "  f = f*f*(3.0-2.0*f);\n"
+   "  float n = p.x + p.y*57.0 + 113.0*p.z;\n"
+   "  return mix(mix(mix( iqhash(n+0.0 ), iqhash(n+1.0 ),f.x),\n"
+   "  mix( iqhash(n+57.0 ), iqhash(n+58.0 ),f.x),f.y),\n"
+   "  mix(mix( iqhash(n+113.0), iqhash(n+114.0),f.x),\n"
+   "  mix( iqhash(n+170.0), iqhash(n+171.0),f.x),f.y),f.z);\n"
+   "}\n"
+   "float xmb_noise2( vec3 x )\n"
+   "{\n"
+   "  return cos((x.z*1.0)*2.0);"
+   "}\n"
+   "void main()\n"
+   "{\n"
+   "  vec3 v = vec3(VertexCoord.x, 0.0, VertexCoord.y);\n"
+   "  vec3 v2 = v;\n"
+   "  vec3 v3 = v;\n"
+
+   "  v.y = xmb_noise2(v2)/6.0;\n"
+
+   "  v3.x = v3.x + time/5.0;\n"
+   "  v3.x = v3.x / 2.0;\n"
+
+   "  v3.z = v3.z + time/10.0;\n"
+   "  v3.y = v3.y + time/100.0;\n"
+
+   "  v.z = v.z + noise(v3*7.0)/15.0;\n"
+   "  v.y = v.y + noise(v3*7.0)/15.0 + cos(v.x*2.0-time/5.0)/5.0 - 0.3;\n"
+
+   "  gl_Position = vec4(v, 1.0);\n"
+   "  fragVertexEc = gl_Position.xyz;\n"
+   "}\n";
diff --git a/gfx/drivers/gl_shaders/modern_pipeline_xmb_ribbon_simple.glsl.vert.h b/gfx/drivers/gl_shaders/modern_pipeline_xmb_ribbon_simple.glsl.vert.h
new file mode 100644
index 0000000000..b57c396586
--- /dev/null
+++ b/gfx/drivers/gl_shaders/modern_pipeline_xmb_ribbon_simple.glsl.vert.h
@@ -0,0 +1,29 @@
+static const char *stock_vertex_xmb_simple_modern =
+   "#define COMPAT_VARYING out\n"
+   "#define COMPAT_ATTRIBUTE in\n"
+   "COMPAT_ATTRIBUTE vec3 VertexCoord;\n"
+   "uniform float time;\n"
+   "float iqhash( float n )\n"
+   "{\n"
+   "  return fract(sin(n)*43758.5453);\n"
+   "}\n"
+   "float noise( vec3 x )\n"
+   "{\n"
+   "  vec3 p = floor(x);\n"
+   "  vec3 f = fract(x);\n"
+   "  f = f*f*(3.0-2.0*f);\n"
+   "  float n = p.x + p.y*57.0 + 113.0*p.z;\n"
+   "  return mix(mix(mix( iqhash(n+0.0 ), iqhash(n+1.0 ),f.x),\n"
+   "  mix( iqhash(n+57.0 ), iqhash(n+58.0 ),f.x),f.y),\n"
+   "  mix(mix( iqhash(n+113.0), iqhash(n+114.0),f.x),\n"
+   "  mix( iqhash(n+170.0), iqhash(n+171.0),f.x),f.y),f.z);\n"
+   "}\n"
+   "void main()\n"
+   "{\n"
+   "  vec3 v = vec3(VertexCoord.x, 0.0, VertexCoord.y);\n"
+   "  vec3 v2 = v;\n"
+   "  v2.x = v2.x + time/2.0;\n"
+   "  v2.z = v.z * 3.0;\n"
+   "  v.y = -cos((v.x+v.z/3.0+time)*2.0)/10.0 - noise(v2.xyz)/4.0;\n"
+   "  gl_Position = vec4(v, 1.0);\n"
+   "}\n";
diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c
index f93413bf8e..bde5eafe1e 100644
--- a/gfx/drivers_shader/shader_glsl.c
+++ b/gfx/drivers_shader/shader_glsl.c
@@ -124,10 +124,12 @@ static const char *glsl_prefixes[] = {
 #include "../drivers/gl_shaders/core_alpha_blend.glsl.vert.h"
 #include "../drivers/gl_shaders/core_alpha_blend.glsl.frag.h"
 
-#include "../drivers/gl_shaders/pipeline_xmb_ribbon_simple.glsl.vert.h"
+#include "../drivers/gl_shaders/legacy_pipeline_xmb_ribbon_simple.glsl.vert.h"
+#include "../drivers/gl_shaders/modern_pipeline_xmb_ribbon_simple.glsl.vert.h"
 #include "../drivers/gl_shaders/pipeline_xmb_ribbon_simple.glsl.frag.h"
 #if !defined(HAVE_OPENGLES2)
-#include "../drivers/gl_shaders/pipeline_xmb_ribbon.glsl.vert.h"
+#include "../drivers/gl_shaders/legacy_pipeline_xmb_ribbon.glsl.vert.h"
+#include "../drivers/gl_shaders/modern_pipeline_xmb_ribbon.glsl.vert.h"
 #include "../drivers/gl_shaders/pipeline_xmb_ribbon.glsl.frag.h"
 #endif
 
@@ -900,10 +902,10 @@ static void *gl_glsl_init(void *data, const char *path)
    }
 
 #if defined(HAVE_OPENGLES2)
-   shader_prog_info.vertex   = stock_vertex_xmb_simple;
+   shader_prog_info.vertex   = stock_vertex_xmb_simple_legacy;
    shader_prog_info.fragment = stock_fragment_xmb_simple;
 #else
-   shader_prog_info.vertex   = stock_vertex_xmb;
+   shader_prog_info.vertex   = glsl_core ? stock_vertex_xmb_modern : stock_vertex_xmb_legacy;
    shader_prog_info.fragment = stock_fragment_xmb;
 #endif
    shader_prog_info.is_file  = false;
@@ -916,7 +918,7 @@ static void *gl_glsl_init(void *data, const char *path)
    gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU].id,
          &glsl->uniforms[VIDEO_SHADER_MENU]);
 
-   shader_prog_info.vertex   = stock_vertex_xmb_simple;
+   shader_prog_info.vertex   = glsl_core ? stock_vertex_xmb_simple_modern : stock_vertex_xmb_simple_legacy;
    shader_prog_info.fragment = stock_fragment_xmb_simple;
 
    gl_glsl_compile_program(