OpenGL ES — är ett grafiskt API med öppen specifikation, avsett för inbäddade och mobila system. Det ger hårdvaruaccelererad rendering av 2D- och 3D-grafik genom en programmerbar shader-pipeline. Enligt uppgifter från Khronos Group, 2025, förblir OpenGL ES det mest utbredda grafiska API:t på mobila enheter, med stöd för över 10 miljarder installationer världen över. Biblioteket används i spel, karttjänster, AR-applikationer och gränssnitt på Android och iOS.
Huvudpunkter
OpenGL ES (Open Graphics Library for Embedded Systems) — är en delmängd av desktop OpenGL API, anpassad för mobila enheter, spelkonsoler och inbäddade system. Specifikationen utvecklas av Khronos Group-konsortiet och är tillgänglig gratis för alla tillverkare. Till skillnad från desktop OpenGL tar OpenGL ES bort föråldrade funktioner i den fasta pipelinen och behåller endast den programmerbara shader-pipelinen — detta minskar strömförbrukningen och förenklar drivrutiner.
Huvudsakliga tillämpningsområde för OpenGL ES — rendering av grafik i realtid. API:t används i mobilspel (Unity, Unreal Engine), navigationsappar, AR-lösningar baserade på ARCore och ARKit, samt i systemgränssnitt för Android och iOS. Enligt StatCounter, 2026 överstiger andelen enheter med stöd för OpenGL ES 3.0+ 92% bland aktiva smartphones.
Den främsta fördelen med OpenGL ES — plattformsoberoende. Samma applikation skriven i OpenGL ES kan köras på Android, iOS, Linux och Windows med minimala ändringar. Detta gör API:t till det optimala valet för projekt som riktar sig till flera plattformar utan att skriva om grafikmotorn.
Tidiga versioner av OpenGL (före 2.0) använde fast pipeline — en uppsättning fördefinierade stadier för bearbetning av vertex och pixlar. Utvecklaren kunde endast konfigurera parametrar: position för ljuskällor, materialegenskaper, transformationsmatriser. Den programmerbara pipelinen, introducerad i OpenGL ES 2.0, ersatte de fasta stadierna med shaders — små program som körs på GPU:n. Detta gav utvecklare full kontroll över visningen av geometri.
Övergången till programmerbar pipeline var en revolution för mobil grafik. Utvecklare fick möjlighet att implementera komplexa effekter: PBR (Physically Based Rendering), dynamiska skuggor, efterbehandling och HDR. Den fasta pipelinen krävde mindre kod men tillät inte att skapa unika visuella stilar. Moderna mobilspel fungerar helt på den programmerbara pipelinen.
Grafisk pipeline OpenGL ES består av flera på varandra följande stadier, som var och en transformerar indata på vägen från vertex till pixlar på skärmen. Förståelse av pipeline-arkitekturen är avgörande för att optimera renderingsprestanda på mobila enheter med begränsad energi- och värmeavledningsbudget.
| Pipeline-steg | Syfte | Programmerbar |
|---|---|---|
| Vertex Shader | Transformering av vertex, applicering av modell-vy-projektionsmatriser | Ja — GLSL |
| Tessellation | Uppdelning av geometri (endast ES 3.2) | Ja — GLSL |
| Geometry Shader | Generering av ny geometri från primitiver | Ja — GLSL |
| Rasterization | Omvandling av primitiver till fragment (pixlar) | Nej — fast |
| Fragment Shader | Beräkning av färg för varje fragment, texturering, belysning | Ja — GLSL |
| Per-Fragment Operations | Depth test, stencil test, blending, scissor test | Parameterkonfiguration |
Det första steget — vertex shader — bearbetar varje vertex oberoende. I detta steg tillämpas transformationer: övergång från modellens lokala rymd till världsrymden, sedan till kamerarymden och slutligen till klipprymden (clip space). Transformationer definieras genom uniforma MVP-matriser (Model-View-Projection), som uppdateras varje bildruta vid rörelse av kamera eller objekt.
Efter montering av primitiver (punkter, linjer, trianglar) utförs rasterisering — processen att bestämma vilka pixlar på skärmen varje primitiv täcker. Rasterizatorn genererar fragment — potentiella pixlar med interpolerade attribut (färg, normaler, UV-koordinater). Antalet fragment beror direkt på skärmupplösningen och projiceringsarean för primitiven.
Fragment shadern exekveras för varje genererat fragment. Den beräknar pixelns slutliga färg med hänsyn till texturer, ljuskällor och material. Vid utgången av fragment shadern passerar en serie per-fragment-test: depth test avgör om fragmentet är synligt; stencil test begränsar rendering enligt en mask; blending blandar fragmentets färg med färgen som redan skrivits i bildbufferten.
OpenGL ES fungerar som en tillståndsmaskin (state machine): alla inställningar — aktuell shader, bundna texturer, aktiverade test — lagras i kontextens globala tillstånd. Ändring av tillstånd via glEnable, glBindTexture eller glUseProgram påverkar alla efterföljande ritkommandon. Varje tillståndsbyte orsakar overhead i drivrutinen, därför är gruppering av draw-anrop efter tillstånd den huvudsakliga optimeringstekniken.
OpenGL ES 1.0 och 1.1 (släppta 2003–2004) baserades på den fasta pipelinen. De stödde transformationer, texturering, belysning och blending, men tillät inte programmering av shaders. API:t användes i tidiga mobiltelefoner och enheter baserade på Symbian och Windows Mobile. Idag anses dessa versioner vara föråldrade — moderna enheter stöder dem inte.
OpenGL ES 2.0 (2007) introducerade den programmerbara pipelinen med vertex- och fragment shaders i språket GLSL ES. Denna version blev standard för Android 2.2+ och iOS 5+ och stöds av den överväldigande majoriteten av enheter än idag. OpenGL ES 2.0 — den minsta version som krävs för att köra Unity, Unreal Engine och Cocos2d-x på mobila plattformar.
OpenGL ES 3.0 (2012) lade till flera kritiska funktioner: flera renderingsmål (MRT), transform feedback, instancing, texturer i godtyckligt format via ETC2/EAC. Renderingsprestandan ökade med 30–50% jämfört med version 2.0 tack vare minskning av antalet draw-anrop. OpenGL ES 3.1 (2014) introducerade beräkningsshaders (compute shaders) och atomära operationer med buffertar — detta gjorde det möjligt att på GPU:n utföra inte bara grafiska utan även beräkningsuppgifter (efterbehandling, simulering av tyger, fysikberäkningar).
OpenGL ES 3.2 (2015) — den sista versionen av specifikationen — lade till tessellations- och geometriska shaders, samt en utökad uppsättning float-texturer och blend-lägen. Trots lanseringen av mer moderna Vulkan 2016, förblir OpenGL ES 3.2 ett aktuellt API tack vare den enorma befintliga kodbasen och enkelheten i att överföra applikationer mellan plattformar.
| Version | År | Nyckelfunktioner | Kompatibilitet (2026) |
|---|---|---|---|
| 1.x | 2003 | Fast pipeline, belysning, texturer | Föråldrad |
| 2.0 | 2007 | Programmerbar pipeline, GLSL ES | 99% enheter |
| 3.0 | 2012 | MRT, instancing, ETC2, transform feedback | 92% enheter |
| 3.1 | 2014 | Beräkningsshaders, atomära buffertar | 80% enheter |
| 3.2 | 2015 | Tessellation, geometriska shaders | 65% enheter |
GLSL ES (OpenGL Shading Language for Embedded Systems) — ett programmeringsspråk för shaders baserat på C-syntax med extra typer för arbete med vektorer och matriser. Varje shader är ett program som kompileras till GPU:s maskinkod vid initieringssteget av applikationen. Till skillnad från CPU-kod exekveras shaders massivt parallellt: tusentals vertex eller fragment bearbetas samtidigt.
Vertex shader bearbetar varje vertex i nätet. Dess huvudsakliga uppgift är att beräkna vertexens slutliga position i clip space genom att multiplicera ingångspositionen med MVP-matrisen. Dessutom kan vertex shadern beräkna normaler, UV-koordinater, färger och skicka dem till fragment shadern via varying-variabler. Varje anrop till vertex shadern fungerar oberoende, vilket gör att GPU:n kan bearbeta miljontals vertex per bildruta.
// Enkel vertex shader för 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 bestämmer färgen för varje pixel på skärmen. Den tar emot interpolerade varying-värden från vertex shadern, väljer texels från bundna texturer och tillämpar belysning. För korrekt belysning används Phong- eller Blinn-Phong-modellen med beräkning av diffuse, specular och ambient komponenter. Varje anrop till fragment shadern motsvarar en pixel, så det totala antalet anrop är lika med projiceringsarean av objektet på skärmen.
// Enkel fragment shader med textur och belysning
#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);
}
I exemplet ovan väljer fragment shadern en texel från 2D-texturen baserat på UV-koordinater, beräknar diffuse-belysning som skalärprodukten av normalen och ljusriktningen, och multiplicerar texelns färg med ljusintensiteten. Mediump — rekommenderad precision för fragment shaders på mobila GPU:er: ger tillräcklig kvalitet med minimal strömförbrukning.
För att arbeta med OpenGL ES på Android krävs att en EGL-kontext skapas — en yta på vilken grafiken ska visas. På iOS används det EGL-liknande lagret EAGL, som tillhandahålls av GLKit-ramverket. I båda fallen omfattar initieringsprocessen att skapa en fönsteryta, konfigurera kontextattribut och koppla till den aktuella renderingsstråden.
// Initiering av OpenGL ES 3.0 på 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)
}
}
Efter att kontexten skapats måste utvecklaren konfigurera buffertar: vertexbufferten (VBO) innehåller vertexkoordinater, normaler och UV; indexbufferten (EBO) bestämmer ordningen för genomgång av vertex för att bilda trianglar. VAO (Vertex Array Object) kombinerar konfigurationen av alla attribut i ett objekt, vilket minskar antalet API-anrop vid byte av meshes.
EGL (Native Platform Graphics Interface) — det mellanliggande lagret mellan OpenGL ES och fönstersystemet. På Android hanterar EGL skapandet av ritytan, val av framebuffer-konfiguration (färgdjup, stencil, MSAA) och synkronisering med vsync. Typisk konfiguration begär RGBA8888 med 24-bitars depth-buffert och 8-bitars stencil-buffert. På iOS utförs EGL:s roll av EAGL i kombination med CAEAGLLayer.
Optimering av OpenGL ES-prestanda på mobila enheter omfattar flera viktiga metoder. Använd instancing (glDrawArraysInstanced) för rendering av flera identiska objekt — detta minskar antalet draw-anrop. Använd texturpooler och undvik att byta texturer mellan draw-anrop. Sortera objekt efter shader, sedan efter textur, sedan efter mesh — denna ordning minimerar kontexttillståndsbyten.
Metal — lågnivå-grafiskt API från Apple, tillgängligt på iOS och macOS från och med A7-chippet. Metal ger direkt åtkomst till GPU:n med minimal drivrutinsöverhead, men fungerar endast på Apple-enheter. Enligt WWDC 2024 ger Metal upp till 40% högre prestanda jämfört med OpenGL ES på samma hårdvara genom att minska antalet tillståndskontroller under körning.
Vulkan — den plattformsoberoende efterträdaren till OpenGL ES, utvecklad av Khronos Group. Vulkan använder explicit resurshantering: utvecklaren allokerar själv minnespooler, skapar kommandobuffertar och synkroniserar åtkomst till GPU:n. Detta ger maximal kontroll över prestandan, men Vulkan-initieringskoden är 3–4 gånger mer omfattande än för OpenGL ES. Vulkan rekommenderas för AAA-spel och applikationer med krävande grafik på Android 7+.
Valet mellan OpenGL ES, Metal och Vulkan beror på målplattformar och prestandakrav. OpenGL ES förblir det bästa valet för plattformsoberoende projekt där utvecklingshastigheten är viktig. Metal föredras för iOS/macOS-ekosystemet med maximal prestanda. Vulkan — valet för projekt där varje millisekunds bildruta är kritisk och utvecklingsbudgeten tillåter investering i lågnivåoptimering.
| Egenskap | OpenGL ES | Metal | Vulkan |
|---|---|---|---|
| Plattformar | Android, iOS, Windows, Linux | Endast iOS, macOS | Android, Windows, Linux (inte iOS) |
| API-nivå | Hög (state machine) | Medel | Låg (explicit) |
| Initieringskod | 50–100 rader | 100–200 rader | 300–500 rader |
| Minneskontroll | Automatisk | Semiautomatisk | Helt manuell |
| Prestanda | Grundläggande | +20–40% vs ES | +30–60% vs ES |
Vanliga frågor
OpenGL ES — är en delmängd av desktop OpenGL där föråldrade funktioner i den fasta pipelinen har tagits bort. OpenGL ES har mindre specifikationsvolym, förenklad precisionsprofil och är optimerad för låg strömförbrukning i mobila enheter.
Android stöder OpenGL ES 2.0 på alla enheter, 3.0 — på Android 4.3+, 3.1 — på Android 5.0+, 3.2 — på utvalda enheter med Android 7.0+. Aktuell stödnivå kan kontrolleras via EGL_CONFIG_CAVEAT.
GLSL ES (OpenGL Shading Language for Embedded Systems) — ett C-liknande språk med typerna vec2/vec3/vec4/mat4 och inbyggda funktionerna texture, normalize, dot. För ES 3.0+ används direktivet #version 300 es.
Ja, OpenGL ES förblir relevant för plattformsoberoende projekt där utvecklingshastighet och stöd för ett brett spektrum av enheter prioriteras. För iOS-ekosystemet är det bättre att lära sig Metal, för nya projekt med maximal prestanda — Vulkan.
På Android, anropa GLES30.glGetString(GLES30.GL_VERSION) efter att kontexten skapats. Strängen innehåller versionsnumret och information om tillverkaren. På iOS, använd [EAGLContext currentContext] och API-egenskapen.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också