What is what (GL, GL ES, GLSL)?
Whenever libGDX is talking about GL20 or GL30, it is in fact referring to GL ES 2.0 and GL ES 3.0. OpenGL ES can be seen as a subset of OpenGL and is designed for embedded systems (smartphones in particular).
By default, version 2.0 of OpenGL ES is used, but libGDX can be configured to use 3.0 as well. See for example:
Lwjgl3ApplicationConfiguration cfg = new Lwjgl3ApplicationConfiguration(); // ... cfg.setOpenGLEmulation(GLEmulation.GL30, 3, 2);
And what about GLSL (ES)?
GLSL (or GLSL ES for mobile and web) is the language used for shaders. Its versioning is somewhat confusing:
GLSL - click to expand
|Open GL Version||GLSL Version|
For some advice on porting shaders from version 120 to 330+, see here.
GLSL ES - click to expand
|OpenGL ES Version||GLSL EL Version||Based on GLSL Version (OpenGL)|
|3.0||300 es||330 (3.3)|
Desktop (Windows, Mac, Linux)
On Desktop, libGDX is mapping all its graphics calls to OpenGL.
GL ES 2.0 is roughly based on Open GL 2.0, however, there are some incompatibilities that weren’t resolved until Open GL 4.1. To mimic GL ES 2.0, libGDX does not request any specific OpenGL version, so the driver will be more forgiving.
GL ES 3.0 is the successor of OpenGL ES 2.0. On desktop, OpenGL 4.3 provides full compatibility with OpenGL ES 3.0. For mimicking GL ES 3.0 on desktop, one can specify the exact OpenGL version, that should be used. Please note that MacOS only supports the OpenGL 3.2 core profile.
On Android Open GL ES 2.0 and 3.0 can be used. To prevent your application from being shown to unsupported devices in the Play Store, add one of the following lines to your Android Manifest:
- OpenGL ES 2:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
- OpenGL ES 3:
<uses-feature android:glEsVersion="0x00030000" android:required="true" />
Please note that support for OpenGL ES 3.0 is experimental on iOS.
On Web, the graphic stuff is handled by WebGL. Web only supports GL ES 2.0.
OpenGL ES 2.0 requires the specification of precision modifiers for attributes, uniforms and locals. Desktop OpenGL does not support this. You will have to guard against that in your fragment shader with something similar to this code snippet:
#ifdef GL_ES #define LOW lowp #define MED mediump #define HIGH highp precision mediump float; #else #define MED #define LOW #define HIGH #endif
This will define the LOWP, MED, and HIGH macros to equivalent OpenGL ES precision modifiers and sets the default precision for float to medium. This will only happen on platforms actually running OpenGL ES, on the desktop, the macros are defined to be empty.