Tutorial - LibGDX GLSL
Platform and Shader version
- MacOSX (desktop) uses OpenGL ES 2.1 then
#version 120
is required - WebGL : ???
- Android (without GLES3) :
#version 110
or#version 120
- Android (with GLES3) :
#version 300 es
- iOS : ???
- other Desktop (Linux and Windows) :
- OpenGL 3 :
#version 130
- OpenGL 3 :
Cross compatible shader code
Based on LWJGL Wiki You can write croos-compatible shader code with few macro :
Vertex shader
#ifdef GLSL3
#define attribute in
#define varying out
#endif
Fragment shader
#ifdef GLSL3
#define varying in
out vec4 out_FragColor;
#define textureCube texture
#define texture2D texture
#else
#define out_FragColor gl_FragColor
#endif
Since gl_FragColor is a reserved and decrecated keyword for GLSL3+, you have to replace gl_FragColor by out_FragColor in your fragement shader code.
Finally you have to inject this macro at runtime in case of OpenGL 3+ or OpenGLES 3+ :
#define GLSL3
Gdx.gl.glClearColor(0, 0, 0, 0);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
Shader
ImmediateModeRenderer / ShapeRenderer
attribute vec4 a_position;
attribute vec4 a_color;
uniform mat4 u_projModelView;
varying vec4 v_color;
void main() {
v_color = a_color;
gl_Position = u_projModelView * a_position;
}
#ifdef GL_ES
#define LOWP lowp
#define MED mediump
#define HIGH highp
precision mediump float;
#else
#define MED
#define LOWP
#define HIGH
#endif
varying vec4 v_color;
void main() {
gl_FragColor = v_color;
}
SpriteBatch
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
varying vec2 v_texCoords;
varying vec4 v_color;
void main()
{
v_color = a_color;
v_texCoords = a_texCoord0;
gl_Position = u_projTrans * a_position;
}
#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif
varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
void main() {
gl_FragColor = v_color * texture2D(u_texture, v_texCoords);
}