OpenGL ES — is een grafische API met open specificatie, ontworpen voor ingebedde en mobiele systemen. Het biedt hardware-versnelde weergave van 2D- en 3D-graphics via een programmeerbare shader-pijplijn. Volgens gegevens van Khronos Group, 2025, blijft OpenGL ES de meest wijdverbreide grafische API op mobiele apparaten, met ondersteuning voor meer dan 10 miljard installaties wereldwijd. De bibliotheek wordt gebruikt in games, kaartdiensten, AR-applicaties en interfaces op Android en iOS.
Belangrijkste punten
OpenGL ES (Open Graphics Library for Embedded Systems) — is een subset van de desktop OpenGL API, aangepast voor mobiele apparaten, gameconsoles en ingebedde systemen. De specificatie wordt ontwikkeld door het Khronos Group-consortium en is gratis beschikbaar voor alle fabrikanten. In tegenstelling tot desktop OpenGL verwijdert OpenGL ES verouderde functies van de vaste pijplijn en behoudt alleen de programmeerbare shader-pijplijn — dit vermindert het energieverbruik en vereenvoudigt drivers.
Het belangrijkste toepassingsgebied van OpenGL ES — real-time grafische weergave. De API wordt gebruikt in mobiele games (Unity, Unreal Engine), navigatie-apps, AR-oplossingen op basis van ARCore en ARKit, en in systeeminterfaces van Android en iOS. Volgens StatCounter, 2026 overschrijdt het aandeel apparaten met OpenGL ES 3.0+-ondersteuning 92% van de actieve smartphones.
Het belangrijkste voordeel van OpenGL ES — cross-platform mogelijkheden. Dezelfde applicatie geschreven in OpenGL ES kan op Android, iOS, Linux en Windows draaien met minimale wijzigingen. Dit maakt de API de optimale keuze voor projecten die gericht zijn op meerdere platforms zonder het grafische engine te herschrijven.
Vroege versies van OpenGL (vóór 2.0) gebruikten de vaste pijplijn — een set vooraf gedefinieerde verwerkingsstadia voor vertices en pixels. De ontwikkelaar kon alleen parameters configureren: positie van lichtbronnen, materiaaleigenschappen, transformatiematrices. De programmeerbare pijplijn, geïntroduceerd in OpenGL ES 2.0, verving de vaste stadia door shaders — kleine programma's die op de GPU worden uitgevoerd. Dit gaf ontwikkelaars volledige controle over de weergave van geometrie.
De overgang naar de programmeerbare pijplijn was een revolutie voor mobiele graphics. Ontwikkelaars kregen de mogelijkheid om complexe effecten te implementeren: PBR (Physically Based Rendering), dynamische schaduwen, nabewerking en HDR. De vaste pijplijn vereiste minder code, maar stond het creëren van unieke visuele stijlen niet toe. Moderne mobiele games werken volledig op de programmeerbare pijplijn.
Grafische pijplijn OpenGL ES bestaat uit verschillende opeenvolgende stadia, die elk de invoergegevens transformeren op de weg van vertices naar pixels op het scherm. Inzicht in de pijplijnarchitectuur is cruciaal voor het optimaliseren van de renderprestaties op mobiele apparaten met een beperkt energie- en warmtebudget.
| Pijplijn stadium | Doel | Programmeerbaar |
|---|---|---|
| Vertex Shader | Transformatie van vertices, toepassen van model-view-projectie matrices | Ja — GLSL |
| Tessellation | Verdeling van geometrie (alleen ES 3.2) | Ja — GLSL |
| Geometry Shader | Genereren van nieuwe geometrie uit primitieven | Ja — GLSL |
| Rasterization | Conversie van primitieven naar fragmenten (pixels) | Nee — vast |
| Fragment Shader | Berekening van de kleur van elk fragment, textureren, belichting | Ja — GLSL |
| Per-Fragment Operations | Depth test, stencil test, blending, scissor test | Parameter configuratie |
De eerste fase — vertex shader — verwerkt elke vertex onafhankelijk. In deze fase worden transformaties toegepast: van de lokale modelruimte naar de wereldruimte, vervolgens naar de cameraruimte en uiteindelijk naar de afsnijruimte (clip space). Transformaties worden gedefinieerd via uniform-matrices MVP (Model-View-Projection), die elk frame worden bijgewerkt bij beweging van de camera of objecten.
Na het assembleren van primitieven (punten, lijnen, driehoeken) vindt rasterisatie plaats — het proces om te bepalen welke pixels van het scherm door elke primitief worden bedekt. De rasterizer genereert fragmenten — potentiële pixels met geïnterpoleerde attributen (kleur, normalen, UV-coördinaten). Het aantal fragmenten is rechtstreeks afhankelijk van de schermresolutie en het projectieoppervlak van de primitief.
De fragment shader wordt uitgevoerd voor elk gegenereerd fragment. Het berekent de uiteindelijke pixelkleur rekening houdend met texturen, lichtbronnen en materialen. Aan de uitgang van de fragment shader passeert een reeks per-fragment tests: depth test bepaalt of het fragment zichtbaar is; stencil test beperkt weergave volgens een masker; blending mengt de fragmentkleur met de reeds in het framebuffer geschreven kleur.
OpenGL ES werkt als een toestandsautomaat (state machine): alle instellingen — huidige shader, gebonden texturen, ingeschakelde tests — worden opgeslagen in de globale toestand van de context. Het wijzigen van de toestand via glEnable, glBindTexture of glUseProgram beïnvloedt alle volgende tekenopdrachten. Elke toestandswisseling veroorzaakt overhead in de driver, daarom is het groeperen van draw-aanroepen op basis van toestand de belangrijkste optimalisatietechniek.
OpenGL ES 1.0 en 1.1 (uitgebracht in 2003–2004) waren gebaseerd op de vaste pijplijn. Ze ondersteunden transformaties, textureren, belichting en blending, maar stonden het programmeren van shaders niet toe. De API werd gebruikt in vroege mobiele telefoons en apparaten op basis van Symbian en Windows Mobile. Tegenwoordig worden deze versies als verouderd beschouwd — moderne apparaten ondersteunen ze niet.
OpenGL ES 2.0 (2007) introduceerde de programmeerbare pijplijn met vertex- en fragment shaders in GLSL ES. Deze versie werd de standaard voor Android 2.2+ en iOS 5+ en wordt tot op de dag van vandaag door de overgrote meerderheid van apparaten ondersteund. OpenGL ES 2.0 — de minimale versie die nodig is om Unity, Unreal Engine en Cocos2d-x te laten werken op mobiele platforms.
OpenGL ES 3.0 (2012) voegde verschillende kritieke mogelijkheden toe: meerdere renderdoelen (MRT), transform feedback, instancing, texturen van willekeurig formaat via ETC2/EAC. De renderprestaties stegen met 30–50% in vergelijking met versie 2.0 dankzij de vermindering van het aantal draw-aanroepen. OpenGL ES 3.1 (2014) introduceerde compute shaders en atomische bewerkingen met buffers — dit maakte het mogelijk om op de GPU niet alleen grafische, maar ook rekentaken uit te voeren (nabewerking, simulatie van stoffen, fysica-berekeningen).
OpenGL ES 3.2 (2015) — de laatste versie van de specificatie — voegde tessellatie- en geometrie-shaders toe, evenals een uitgebreide set float-texturen en blend-modi. Ondanks de release van modernere Vulkan in 2016, blijft OpenGL ES 3.2 een actuele API dankzij de enorme bestaande codebase en de eenvoud van het overzetten van applicaties tussen platforms.
| Versie | Jaar | Belangrijkste mogelijkheden | Compatibiliteit (2026) |
|---|---|---|---|
| 1.x | 2003 | Vaste pijplijn, belichting, texturen | Verouderd |
| 2.0 | 2007 | Programmeerbare pijplijn, GLSL ES | 99% apparaten |
| 3.0 | 2012 | MRT, instancing, ETC2, transform feedback | 92% apparaten |
| 3.1 | 2014 | Compute shaders, atomische buffers | 80% apparaten |
| 3.2 | 2015 | Tessellatie, geometrie shaders | 65% apparaten |
GLSL ES (OpenGL Shading Language for Embedded Systems) — een programmeertaal voor shaders gebaseerd op C-syntax met extra typen voor het werken met vectoren en matrices. Elke shader is een programma dat tijdens de initialisatiefase van de applicatie naar machinetaal voor de GPU wordt gecompileerd. In tegenstelling tot CPU-code worden shaders massaal parallel uitgevoerd: duizenden vertices of fragmenten worden gelijktijdig verwerkt.
Vertex shader verwerkt elke vertex van het netwerk. De belangrijkste taak is het berekenen van de uiteindelijke positie van de vertex in clip space door de invoerpositie te vermenigvuldigen met de MVP-matrix. Daarnaast kan de vertex shader normalen, UV-coördinaten, kleuren berekenen en deze doorgeven aan de fragment shader via varying-variabelen. Elke aanroep van de vertex shader werkt onafhankelijk, waardoor de GPU miljoenen vertices per frame kan verwerken.
// Eenvoudige vertex shader voor OpenGL ES 3.0
#version 300 es
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec3 a_normal;
layout(location = 2) in vec2 a_texCoord;
uniform mat4 u_mvpMatrix;
out vec3 v_normal;
out vec2 v_texCoord;
void main() {
gl_Position = u_mvpMatrix * a_position;
v_normal = mat3(u_mvpMatrix) * a_normal;
v_texCoord = a_texCoord;
}
Fragment shader bepaalt de kleur van elke pixel op het scherm. Het ontvangt geïnterpoleerde varying-waarden van de vertex shader, selecteert texels uit gebonden texturen en past belichting toe. Voor correcte belichting wordt het Phong- of Blinn-Phong-model gebruikt met berekening van diffuse, specular en ambient componenten. Elke aanroep van de fragment shader komt overeen met één pixel, dus het totale aantal aanroepen is gelijk aan het projectieoppervlak van het object op het scherm.
// Eenvoudige fragment shader met textuur en belichting
#version 300 es
precision mediump float;
in vec3 v_normal;
in vec2 v_texCoord;
uniform sampler2D u_texture;
uniform vec3 u_lightDir;
out vec4 fragColor;
void main() {
vec4 texel = texture(u_texture, v_texCoord);
vec3 normal = normalize(v_normal);
float diffuse = max(dot(normal, u_lightDir), 0.0);
fragColor = vec4(texel.rgb * diffuse, texel.a);
}
In bovenstaand voorbeeld selecteert de fragment shader een texel uit de 2D-textuur op basis van UV-coördinaten, berekent diffuse belichting als het scalaire product van de normaal en de lichtrichting, en vermenigvuldigt de texelkleur met de lichtintensiteit. Mediump — aanbevolen precisie voor fragment shaders op mobiele GPU's: biedt voldoende kwaliteit met minimaal energieverbruik.
Om met OpenGL ES op Android te werken, moet een EGL-context worden gecreëerd — een oppervlak waarop de graphics worden weergegeven. Op iOS wordt de EGL-achtige laag EAGL gebruikt, geleverd door het GLKit-framework. In beide gevallen omvat het initialisatieproces het creëren van een vensteroppervlak, het configureren van contextattributen en het koppelen aan de huidige renderthread.
// Initialisatie van OpenGL ES 3.0 op Android
class MyGLRenderer : GLSurfaceView.Renderer {
private val vertexShaderCode = "#version 300 es\n..."
private val fragmentShaderCode = "#version 300 es\n..."
override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
GLES30.glClearColor(0.1f, 0.1f, 0.2f, 1.0f)
GLES30.glEnable(GLES30.GL_DEPTH_TEST)
}
override fun onDrawFrame(gl: GL10?) {
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT or GLES30.GL_DEPTH_BUFFER_BIT)
// bind VBO, set uniforms, draw elements
}
override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
GLES30.glViewport(0, 0, width, height)
}
}
Na het creëren van de context moet de ontwikkelaar buffers configureren: de vertex buffer (VBO) bevat vertexcoördinaten, normalen en UV; de indexbuffer (EBO) bepaalt de volgorde van doorlopen van vertices voor het vormen van driehoeken. VAO (Vertex Array Object) combineert de configuratie van alle attributen in één object, waardoor het aantal API-aanroepen bij het wisselen van meshes wordt verminderd.
EGL (Native Platform Graphics Interface) — de tussenlaag tussen OpenGL ES en het venstersysteem. Op Android beheert EGL het aanmaken van het tekenoppervlak, het selecteren van de framebufferconfiguratie (kleurdiepte, stencil, MSAA) en synchronisatie met vsync. Een typische configuratie vraagt om RGBA8888 met een 24-bits depth buffer en een 8-bits stencil buffer. Op iOS wordt de rol van EGL vervuld door EAGL in combinatie met CAEAGLLayer.
Optimalisatie van OpenGL ES-prestaties op mobiele apparaten omvat verschillende belangrijke praktijken. Gebruik instancing (glDrawArraysInstanced) voor het renderen van meerdere identieke objecten — dit vermindert het aantal draw-aanroepen. Pas texturenpools toe en vermijd het wisselen van texturen tussen draw-aanroepen. Sorteer objecten op shader, vervolgens op textuur, dan op mesh — deze volgorde minimaliseert contextstatuswisselingen.
Metal — laag-niveau grafische API van Apple, beschikbaar op iOS en macOS vanaf de A7-chip. Metal biedt directe toegang tot de GPU met minimale driveroverhead, maar werkt alleen op Apple-apparaten. Volgens WWDC 2024 biedt Metal tot 40% hogere prestaties in vergelijking met OpenGL ES op dezelfde hardware door het verminderen van het aantal statuscontroles tijdens runtime.
Vulkan — de cross-platform opvolger van OpenGL ES, ontwikkeld door Khronos Group. Vulkan gebruikt expliciet resourcebeheer: de ontwikkelaar wijst zelf geheugenpools toe, creëert commandobuffers en synchroniseert toegang tot de GPU. Dit biedt maximale controle over de prestaties, maar de Vulkan-initialisatiecode is 3–4 keer omvangrijker dan voor OpenGL ES. Vulkan wordt aanbevolen voor AAA-games en applicaties met veeleisende graphics op Android 7+.
De keuze tussen OpenGL ES, Metal en Vulkan hangt af van de doelplatforms en prestatie-eisen. OpenGL ES blijft de beste keuze voor cross-platform projecten waar ontwikkelsnelheid belangrijk is. Metal heeft de voorkeur voor het iOS/macOS-ecosysteem met maximale prestaties. Vulkan — de keuze voor projecten waar elke milliseconde per frame cruciaal is en het ontwikkelbudget investering in low-level optimalisatie toelaat.
| Kenmerk | OpenGL ES | Metal | Vulkan |
|---|---|---|---|
| Platforms | Android, iOS, Windows, Linux | Alleen iOS, macOS | Android, Windows, Linux (geen iOS) |
| API-niveau | Hoog (state machine) | Gemiddeld | Laag (explicit) |
| Initialisatiecode | 50–100 regels | 100–200 regels | 300–500 regels |
| Geheugenbeheer | Automatisch | Semi-automatisch | Volledig handmatig |
| Prestaties | Basis | +20–40% vs ES | +30–60% vs ES |
Veelgestelde vragen
OpenGL ES — is een subset van desktop OpenGL waaruit verouderde functies van de vaste pijplijn zijn verwijderd. OpenGL ES heeft een kleinere specificatieomvang, een vereenvoudigd precisieprofiel en is geoptimaliseerd voor laag energieverbruik van mobiele apparaten.
Android ondersteunt OpenGL ES 2.0 op alle apparaten, 3.0 — op Android 4.3+, 3.1 — op Android 5.0+, 3.2 — op geselecteerde apparaten met Android 7.0+. Het actuele ondersteuningsniveau kan worden gecontroleerd via EGL_CONFIG_CAVEAT.
GLSL ES (OpenGL Shading Language for Embedded Systems) — een C-achtige taal met types vec2/vec3/vec4/mat4 en ingebouwde functies texture, normalize, dot. Voor ES 3.0+ wordt de directive #version 300 es gebruikt.
Ja, OpenGL ES blijft relevant voor cross-platform projecten waar ontwikkelsnelheid en ondersteuning voor een breed scala aan apparaten prioriteit hebben. Voor het iOS-ecosysteem kunt u beter Metal leren, voor nieuwe projecten met maximale prestaties — Vulkan.
Roep op Android GLES30.glGetString(GLES30.GL_VERSION) aan na het creëren van de context. De string bevat het versienummer en informatie over de fabrikant. Gebruik op iOS [EAGLContext currentContext] en de API-eigenschap.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook