Differences between GLES2 and GLES3
This page documents the differences between GLES2 and GLES3 that are by design and are not the result of bugs. There may be differences that are unintentional, but they should be reported as bugs. Note “GLES2” and “GLES3” are the names used in Godot for the two OpenGL-based rendering backends. In terms of graphics APIs, the GLES2 backend maps to OpenGL 2.1 on desktop, OpenGL ES 2.0 on mobile and WebGL 1.0 on the web. The GLES3 backend maps to OpenGL 3.3 on desktop, OpenGL ES 3.0 on mobile and WebGL 2.0 on the web.
Particles
Particles or Particles2D nodes as they require advanced GPU features. Instead, use CPUParticles or CPUParticles2D, which provides a similar interface to a ParticlesMaterial. Tip Particles and Particles2D can be converted to their CPU equivalent node with the “Convert to CPUParticles” option in the editor.
SCREEN_TEXTURE mip-maps
SCREEN_TEXTURE (accessed via a ShaderMaterial) does not have computed mip-maps. So when accessing at a different LOD, the texture will not appear blurry.
DEPTH_TEXTURE
DEPTH_TEXTURE in shaders, it may not work on some old hardware (especially mobile).
Color space
GLES2 and GLES3 are in different color spaces. This means that colors will appear slightly different between them especially when lighting is used.
if statement check and see if the output is in sRGB, using OUTPUT_IS_SRGB. OUTPUT_IS_SRGB is true in GLES2 and false in GLES3.
HDR
0-1 range.
Debanding property and associated project setting will also have no effect when HDR is disabled. This means debanding can’t be used in GLES2.
SpatialMaterial features
SpatialMaterial are missing:
- Refraction
- Subsurface scattering
- Anisotropy
- Clearcoat
- Depth mapping
When using SpatialMaterials they will not even appear in the editor.
ShaderMaterials, you can set values for these features but they will be non-functional. For example, you will still be able to set the
SSSbuilt-in (which normally adds subsurface scattering) in your shader, but nothing will happen.Environment features
Environment are missing: - Auto exposure
- Tonemapping
- Screen space reflections
- Screen space ambient occlusion That means that in GLES2 environments you can only set:
- Sky (including procedural sky)
- Ambient light
- Fog
- Depth of field
- Glow (also known as bloom)
- Adjustment
GIProbes
GIProbes do not work in GLES2. Instead use Baked Lightmaps. For a description of how baked lightmaps work see the Baked Lightmaps tutorial.Contact shadows
shadow_contactproperty of Lights is not supported in GLES2 and so does nothing.Light performance
In GLES2, performance scales poorly with several lights, as each light is processed in a separate render pass (in opposition to GLES3 which is all done in a single pass). Try to limit scenes to as few lights as possible in order to achieve greatest performance.Texture compression
rendering/vram_compression/import_etcand then reimport textures. Warning Since ETC doesn’t support transparency, you must reimport textures that contain an alpha channel to use the Uncompressed, Lossy or Lossless compression mode (instead of Video RAM). This can be done in the Import dock after selecting them in the FileSystem dock.Blend shapes
In GLES2, blend shapes are implemented on the CPU instead of the GPU. Accordingly, they may not perform as well as blend shapes in GLES3. To avoid performance issues when using blend shapes in GLES2, try to minimize the number of blend shapes that are updated each frame.Shading language
GLES3 provides many built-in functions that GLES2 does not. Below is a list of functions that are not available or are have limited support in GLES2. Shading Language doc. Note Functions not in GLES2’s GLSL were added with Godots own shader standard library. These functions may perform worse in GLES2 compared to GLES3.textureSize()workaroundtextureSize(). You can get the size of a texture the old fashioned way by passing in a uniform with the texture size yourself.// In the shader:uniform sampler2D textureName;uniform vec2 textureName_size;
# In GDScript:material_name.set_shader_param("textureName", my_texture)material_name.set_shader_param("textureName_size", my_texture_size)
Built in variables and render modes
Godot also provides many built-in variables and render modes. Some cannot be supported in GLES2. Below is a list of built-in variables and render modes that, when written to, will have no effect or could even cause issues when using the GLES2 backend.
