OpenGL ES ist eine Grafik-API mit offener Spezifikation, die für eingebettete und mobile Systeme entwickelt wurde. Sie bietet hardwarebeschleunigtes 2D- und 3D-Grafik-Rendering über eine programmierbare Shader-Pipeline. Laut Khronos Group, 2025 bleibt OpenGL ES die am weitesten verbreitete Grafik-API auf mobilen Geräten und unterstützt über 10 Milliarden Installationen weltweit. Die Bibliothek wird in Spielen, Kartendiensten, AR-Anwendungen und Schnittstellen auf Android und iOS verwendet.
Wichtige Erkenntnisse
OpenGL ES (Open Graphics Library for Embedded Systems) ist eine Teilmenge der Desktop-OpenGL-API, die für mobile Geräte, Spielekonsolen und eingebettete Systeme angepasst wurde. Die Spezifikation wird vom Khronos Group Konsortium entwickelt und ist für alle Hersteller kostenlos verfügbar. Im Gegensatz zu Desktop-OpenGL entfernt OpenGL ES die veralteten Funktionen der Fixed-Function-Pipeline und behält nur die programmierbare Shader-Pipeline — dies reduziert den Stromverbrauch und vereinfacht die Treiber.
Das Hauptanwendungsgebiet von OpenGL ES ist das Rendering von Echtzeitgrafik. Die API wird in mobilen Spielen (Unity, Unreal Engine), Navigationsanwendungen, AR-Lösungen basierend auf ARCore und ARKit sowie in Android- und iOS-Systemoberflächen verwendet. Laut StatCounter, 2026 übersteigt der Anteil der Geräte mit OpenGL ES 3.0+-Unterstützung 92% unter den aktiven Smartphones.
Der Hauptvorteil von OpenGL ES ist die plattformübergreifende Kompatibilität. Dieselbe mit OpenGL ES geschriebene Anwendung kann mit minimalen Änderungen auf Android, iOS, Linux und Windows ausgeführt werden. Dies macht die API zur optimalen Wahl für Projekte, die auf mehrere Plattformen abzielen, ohne die Grafikengine neu schreiben zu müssen.
Frühe Versionen von OpenGL (vor 2.0) verwendeten eine Fixed-Function-Pipeline — eine Reihe vordefinierter Verarbeitungsstufen für Vertices und Pixel. Der Entwickler konnte nur Parameter konfigurieren: Positionen von Lichtquellen, Materialeigenschaften, Transformationsmatrizen. Programmierbare Pipeline, eingeführt in OpenGL ES 2.0, ersetzte die festen Stufen durch Shader — kleine Programme, die auf der GPU ausgeführt werden. Dies gab Entwicklern die vollständige Kontrolle über die Geometrie-Darstellung.
Der Übergang zur programmierbaren Pipeline war eine Revolution für mobile Grafiken. Entwickler erhielten die Möglichkeit, komplexe Effekte zu implementieren: PBR (Physically Based Rendering), dynamische Schatten, Nachbearbeitung und HDR. Die Fixed-Function-Pipeline benötigte weniger Code, erlaubte aber keine einzigartigen visuellen Stile. Moderne mobile Spiele arbeiten vollständig auf der programmierbaren Pipeline.
Grafikpipeline von OpenGL ES besteht aus mehreren aufeinanderfolgenden Stufen, die jeweils Eingabedaten auf dem Weg von Vertices zu Pixeln auf dem Bildschirm transformieren. Das Verständnis der Pipeline-Architektur ist entscheidend für die Optimierung der Rendering-Leistung auf mobilen Geräten mit begrenztem Energie- und Wärmebudget.
| Pipeline-Stufe | Zweck | Programmierbar |
|---|---|---|
| Vertex Shader | Vertex-Transformation, Anwendung von Modell-Ansichts-Projektionsmatrizen | Ja — GLSL |
| Tessellation | Geometrie-Unterteilung (nur ES 3.2) | Ja — GLSL |
| Geometry Shader | Generierung neuer Geometrie aus Primitiven | Ja — GLSL |
| Rasterisierung | Umwandlung von Primitiven in Fragmente (Pixel) | Nein — fest |
| Fragment Shader | Berechnung der Farbe jedes Fragments, Texturierung, Beleuchtung | Ja — GLSL |
| Per-Fragment-Operationen | Depth-Test, Stencil-Test, Blending, Scissor-Test | Parameter-Konfiguration |
Die erste Stufe — der Vertex Shader — verarbeitet jeden Vertex unabhängig. In dieser Stufe werden Transformationen angewendet: Übersetzung vom lokalen Modellraum in den Weltraum, dann in den Kameraraum und schließlich in den Clip-Raum. Transformationen werden über MVP (Model-View-Projection) Uniform-Matrizen festgelegt, die bei jeder Bewegung der Kamera oder von Objekten pro Frame aktualisiert werden.
Nach der Primitive-Assemblierung (Punkte, Linien, Dreiecke) wird die Rasterisierung durchgeführt — der Prozess zur Bestimmung, welche Bildschirmpixel jedes Primitiv abdeckt. Rasterizer erzeugt Fragmente — potenzielle Pixel mit interpolierten Attributen (Farbe, Normalen, UV-Koordinaten). Die Anzahl der Fragmente hängt direkt von der Bildschirmauflösung und der Projektionsfläche des Primitivs ab.
Der Fragment Shader wird für jedes erzeugte Fragment ausgeführt. Er berechnet die endgültige Pixelfarbe unter Berücksichtigung von Texturen, Lichtquellen und Materialien. Die Ausgabe des Fragment Shaders durchläuft eine Reihe von Per-Fragment-Tests: Der Depth-Test bestimmt, ob das Fragment sichtbar ist; der Stencil-Test schränkt das Rendering per Maske ein; Blending mischt die Fragmentfarbe mit der bereits im Framebuffer geschriebenen Farbe.
OpenGL ES arbeitet als Zustandsautomat (State Machine): Alle Einstellungen — aktueller Shader, gebundene Texturen, aktivierte Tests — werden im globalen Zustand des Kontexts gespeichert. Die Änderung des Zustands über glEnable, glBindTexture oder glUseProgram wirkt sich auf alle nachfolgenden Zeichenbefehle aus. Jeder Zustandswechsel verursacht Overhead im Treiber, daher ist die Gruppierung von Draw-Aufrufen nach Zustand die wichtigste Optimierungstechnik.
OpenGL ES 1.0 und 1.1 (veröffentlicht 2003–2004) basierten auf einer Fixed-Function-Pipeline. Sie unterstützten Transformationen, Texturierung, Beleuchtung und Blending, erlaubten aber keine Shader-Programmierung. Die API wurde in frühen Mobiltelefonen und Geräten auf Basis von Symbian und Windows Mobile verwendet. Heute gelten diese Versionen als veraltet — moderne Geräte unterstützen sie nicht mehr.
OpenGL ES 2.0 (2007) führte eine programmierbare Pipeline mit Vertex- und Fragment-Shadern in GLSL ES ein. Diese Version wurde zum Standard für Android 2.2+ und iOS 5+ und wird noch immer von der überwältigenden Mehrheit der Geräte unterstützt. OpenGL ES 2.0 ist die Mindestversion, die für Unity, Unreal Engine und Cocos2d-x auf mobilen Plattformen erforderlich ist.
OpenGL ES 3.0 (2012) fügte mehrere kritische Funktionen hinzu: Multiple Render Targets (MRT), Transform Feedback, Instancing, Texturen beliebigen Formats über ETC2/EAC. Die Rendering-Leistung stieg im Vergleich zu Version 2.0 um 30–50% durch die Reduzierung der Draw-Aufrufe. OpenGL ES 3.1 (2014) führte Compute-Shader und atomare Pufferoperationen ein — dies ermöglichte die Ausführung nicht nur von Grafik-, sondern auch von Berechnungsaufgaben auf der GPU (Nachbearbeitung, Stoffsimulation, Physikberechnungen).
OpenGL ES 3.2 (2015) — die neueste Version der Spezifikation — fügte Tessellations- und Geometrie-Shader sowie einen erweiterten Satz von Float-Texturen und Blend-Modi hinzu. Trotz der Veröffentlichung des moderneren Vulkan im Jahr 2016 bleibt OpenGL ES 3.2 aufgrund der riesigen vorhandenen Codebasis und der einfachen Portierbarkeit zwischen Plattformen eine relevante API.
| Version | Jahr | Hauptfunktionen | Kompatibilität (2026) |
|---|---|---|---|
| 1.x | 2003 | Fixed-Function-Pipeline, Beleuchtung, Texturen | Veraltet |
| 2.0 | 2007 | Programmierbare Pipeline, GLSL ES | 99% Geräte |
| 3.0 | 2012 | MRT, Instancing, ETC2, Transform Feedback | 92% Geräte |
| 3.1 | 2014 | Compute-Shader, atomare Puffer | 80% Geräte |
| 3.2 | 2015 | Tessellation, Geometrie-Shader | 65% Geräte |
GLSL ES (OpenGL Shading Language for Embedded Systems) ist eine Shader-Programmiersprache basierend auf C-Syntax mit zusätzlichen Typen für die Arbeit mit Vektoren und Matrizen. Jeder Shader ist ein Programm, das bei der Anwendungsinitialisierung in GPU-Maschinencode kompiliert wird. Im Gegensatz zu CPU-Code werden Shader massiv parallel ausgeführt: Tausende von Vertices oder Fragmenten werden gleichzeitig verarbeitet.
Vertex-Shader verarbeitet jeden Vertex des Netzes. Seine Hauptaufgabe ist die Berechnung der endgültigen Vertex-Position im Clip-Raum durch Multiplikation der Eingabeposition mit der MVP-Matrix. Darüber hinaus kann der Vertex-Shader Normalen, UV-Koordinaten, Farben berechnen und über varying-Variablen an den Fragment-Shader weitergeben. Jeder Aufruf des Vertex-Shaders arbeitet unabhängig, sodass die GPU Millionen von Vertices pro Frame verarbeiten kann.
// Simple vertex shader for 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 bestimmt die Farbe jedes Pixels auf dem Bildschirm. Er empfängt interpolierte varying-Werte vom Vertex-Shader, samplet Texel aus gebundenen Texturen und wendet Beleuchtung an. Für korrekte Beleuchtung wird das Phong- oder Blinn-Phong-Modell mit Berechnung von diffuse, specular und ambient Komponenten verwendet. Jeder Aufruf des Fragment-Shaders entspricht einem Pixel, daher entspricht die Gesamtzahl der Aufrufe der Projektionsfläche des Objekts auf dem Bildschirm.
// Simple fragment shader with texture and lighting
#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);
}
Im obigen Beispiel samplet der Fragment-Shader einen Texel aus einer 2D-Textur per UV-Koordinaten, berechnet die diffuse Beleuchtung als Skalarprodukt von Normale und Lichtrichtung und multipliziert die Texelfarbe mit der Beleuchtungsintensität. Mediump ist die empfohlene Genauigkeit für Fragment-Shader auf mobilen GPUs: Sie bietet ausreichende Qualität bei minimalem Stromverbrauch.
Für die Arbeit mit OpenGL ES auf Android muss ein EGL-Kontext erstellt werden — eine Oberfläche, auf die Grafiken gerendert werden. Auf iOS wird die EAGL-Schicht (ähnlich EGL) verwendet, die vom GLKit-Framework bereitgestellt wird. In beiden Fällen umfasst der Initialisierungsprozess die Erstellung einer Fensteroberfläche, die Konfiguration von Kontextattributen und die Bindung an den aktuellen Rendering-Thread.
// OpenGL ES 3.0 initialization on 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)
}
}
Nach der Kontexterstellung muss der Entwickler Puffer einrichten: Der Vertex-Puffer (VBO) enthält Vertex-Koordinaten, Normalen und UV; der Index-Puffer (EBO) definiert die Durchlaufreihenfolge der Vertices zur Bildung von Dreiecken. VAO (Vertex Array Object) fasst alle Attributkonfigurationen in einem Objekt zusammen und reduziert die Anzahl der API-Aufrufe beim Wechseln von Meshes.
EGL (Native Platform Graphics Interface) ist eine Zwischenschicht zwischen OpenGL ES und dem Fenstersystem. Auf Android verwaltet EGL die Erstellung der Rendering-Oberfläche, die Auswahl der Framebuffer-Konfiguration (Farbtiefe, Stencil, MSAA) und die Synchronisation mit Vsync. Eine typische Konfiguration fordert RGBA8888 mit einem 24-Bit-Tiefenpuffer und einem 8-Bit-Stencil-Puffer. Auf iOS wird die Rolle von EGL von EAGL in Verbindung mit CAEAGLLayer übernommen.
Die Leistungsoptimierung von OpenGL ES auf mobilen Geräten umfasst mehrere wichtige Praktiken. Verwenden Sie Instancing (glDrawArraysInstanced) zum Rendern vieler identischer Objekte — dies reduziert die Anzahl der Draw-Aufrufe. Wenden Sie Texturpools an und vermeiden Sie Texturwechsel zwischen Draw-Aufrufen. Sortieren Sie Objekte nach Shader, dann nach Textur, dann nach Mesh — diese Reihenfolge minimiert Kontextzustandswechsel.
Metal ist eine Low-Level-Grafik-API von Apple, verfügbar auf iOS und macOS ab dem A7-Chip. Metal bietet direkten GPU-Zugriff mit minimalem Treiber-Overhead, funktioniert aber nur auf Apple-Geräten. Laut WWDC 2024 liefert Metal bis zu 40% höhere Leistung im Vergleich zu OpenGL ES auf derselben Hardware durch Reduzierung von Laufzeit-Zustandsprüfungen.
Vulkan ist der plattformübergreifende Nachfolger von OpenGL ES, entwickelt von der Khronos Group. Vulkan verwendet explizites Ressourcenmanagement: Der Entwickler weist Speicherpools zu, erstellt Befehlspuffer und synchronisiert den GPU-Zugriff. Dies gibt maximale Kontrolle über die Leistung, aber der Initialisierungscode von Vulkan ist 3–4 Mal umfangreicher als der von OpenGL ES. Vulkan wird für AAA-Spiele und anspruchsvolle Grafik-Anwendungen auf Android 7+ empfohlen.
Die Wahl zwischen OpenGL ES, Metal und Vulkan hängt von den Zielplattformen und Leistungsanforderungen ab. OpenGL ES bleibt die beste Wahl für plattformübergreifende Projekte, bei denen Entwicklungsgeschwindigkeit wichtig ist. Metal wird für das iOS/macOS-Ökosystem mit maximaler Leistung bevorzugt. Vulkan ist die Wahl für Projekte, bei denen jede Millisekunde pro Frame zählt und das Entwicklungsbudget Investitionen in Low-Level-Optimierung erlaubt.
| Merkmal | OpenGL ES | Metal | Vulkan |
|---|---|---|---|
| Plattformen | Android, iOS, Windows, Linux | Nur iOS, macOS | Android, Windows, Linux (kein iOS) |
| API-Level | Hoch (State Machine) | Mittel | Niedrig (explizit) |
| Init-Code | 50–100 Zeilen | 100–200 Zeilen | 300–500 Zeilen |
| Speicherkontrolle | Automatisch | Halbautomatisch | Vollständig manuell |
| Leistung | Basislinie | +20–40% vs ES | +30–60% vs ES |
Häufig gestellte Fragen
OpenGL ES ist eine Teilmenge von Desktop-OpenGL, aus der die veralteten Funktionen der Fixed-Function-Pipeline entfernt wurden. OpenGL ES hat einen kleineren Spezifikationsumfang, ein vereinfachtes Genauigkeitsprofil und ist für den geringen Stromverbrauch mobiler Geräte optimiert.
Android unterstützt OpenGL ES 2.0 auf allen Geräten, 3.0 auf Android 4.3+, 3.1 auf Android 5.0+, 3.2 auf ausgewählten Geräten mit Android 7.0+. Der aktuelle Unterstützungsgrad kann über EGL_CONFIG_CAVEAT überprüft werden.
GLSL ES (OpenGL Shading Language for Embedded Systems) ist eine C-ähnliche Sprache mit vec2/vec3/vec4/mat4-Typen und integrierten Funktionen texture, normalize, dot. Für ES 3.0+ wird die Direktive #version 300 es verwendet.
Ja, OpenGL ES bleibt relevant für plattformübergreifende Projekte, bei denen Entwicklungsgeschwindigkeit und breite Geräteunterstützung Priorität haben. Für das iOS-Ökosystem ist es besser, Metal zu lernen; für neue Projekte mit maximaler Leistung verwenden Sie Vulkan.
Rufen Sie auf Android GLES30.glGetString(GLES30.GL_VERSION) nach der Kontexterstellung auf. Die Zeichenfolge enthält die Versionsnummer und Informationen zum Hersteller. Verwenden Sie auf iOS [EAGLContext currentContext] und die API-Eigenschaft.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch