OpenGL ES — egy nyílt specifikációjú grafikus API, amely beágyazott és mobil rendszerek számára készült. Hardveresen gyorsított 2D és 3D grafika megjelenítést biztosít programozható shader pipeline-on keresztül. A Khronos Group, 2025 adatai szerint az OpenGL ES továbbra is a legelterjedtebb grafikus API a mobileszközökön, több mint 10 milliárd telepítést támogatva világszerte. A könyvtárat játékokban, térképészeti szolgáltatásokban, AR alkalmazásokban és Android és iOS rendszerfelületeken használják.
Főbb pontok
OpenGL ES (Open Graphics Library for Embedded Systems) — az asztali OpenGL API egy részhalmaza, amelyet mobileszközökhöz, játékkonzolokhoz és beágyazott rendszerekhez adaptáltak. A specifikációt a Khronos Group konzorcium fejleszti, és minden gyártó számára ingyenesen elérhető. Az asztali OpenGL-lel ellentétben az OpenGL ES eltávolítja a rögzített pipeline elavult funkcióit, csak a programozható shader pipeline-t hagyja meg — ez csökkenti az energiafogyasztást és leegyszerűsíti az illesztőprogramokat.
Az OpenGL ES fő alkalmazási területe — valós idejű grafika megjelenítése. Az API-t mobil játékokban (Unity, Unreal Engine), navigációs alkalmazásokban, ARCore és ARKit alapú AR megoldásokban, valamint Android és iOS rendszerfelületeken használják. A StatCounter, 2026 adatai szerint az OpenGL ES 3.0+ támogatással rendelkező eszközök aránya meghaladja a 92%-ot az aktív okostelefonok körében.
Az OpenGL ES legfőbb előnye — a cross-platform képesség. Ugyanaz az OpenGL ES-ben írt alkalmazás minimális módosításokkal futhat Androidon, iOS-en, Linuxon és Windows-on. Ez teszi az API-t optimális választássá olyan projektekhez, amelyek több platformot céloznak meg anélkül, hogy a grafikus motort újra kellene írni.
Az OpenGL korai verziói (2.0 előtt) a rögzített pipeline-t használták — a vertex és pixel feldolgozás előre meghatározott szakaszainak készletét. A fejlesztő csak paramétereket állíthatott be: fényforrások helyzetét, anyagtulajdonságokat, transzformációs mátrixokat. Az OpenGL ES 2.0-ban bevezetett programozható pipeline a rögzített szakaszokat shader-ekkel — a GPU-n végrehajtott kis programokkal — váltotta fel. Ez teljes irányítást adott a fejlesztőknek a geometria megjelenítése felett.
A programozható pipeline-ra való áttérés forradalom volt a mobil grafika számára. A fejlesztők képessé váltak összetett effektusok implementálására: PBR (Physically Based Rendering), dinamikus árnyékok, utófeldolgozás és HDR. A rögzített pipeline kevesebb kódot igényelt, de nem tette lehetővé egyedi vizuális stílusok létrehozását. A modern mobil játékok teljes mértékben a programozható pipeline-on működnek.
Grafikus pipeline Az OpenGL ES több egymást követő szakaszból áll, amelyek mindegyike átalakítja a bemeneti adatokat a vertexektől a képernyő pixeleiig vezető úton. A pipeline architektúrájának megértése kritikus fontosságú a renderelési teljesítmény optimalizálásához a korlátozott energia- és hőleadási kerettel rendelkező mobileszközökön.
| Pipeline szakasz | Cél | Programozható |
|---|---|---|
| Vertex Shader | Vertexek transzformációja, modell-nézet-projekció mátrixok alkalmazása | Igen — GLSL |
| Tessellation | Geometria felosztása (csak ES 3.2) | Igen — GLSL |
| Geometry Shader | Új geometria generálása primitívekből | Igen — GLSL |
| Rasterization | Primitívek konvertálása fragmensekké (pixelekké) | Nem — rögzített |
| Fragment Shader | Minden fragment színének kiszámítása, textúrázás, megvilágítás | Igen — GLSL |
| Per-Fragment Operations | Depth test, stencil test, blending, scissor test | Paraméterek beállítása |
Az első szakasz — a vertex shader — minden egyes vertext függetlenül feldolgoz. Ebben a szakaszban transzformációkat alkalmaznak: áttérés a modell lokális teréből a világtérbe, majd a kamera terébe, végül a vágótérbe (clip space). A transzformációkat MVP (Model-View-Projection) uniform-mátrixokon keresztül adják meg, amelyek minden képkockában frissülnek a kamera vagy objektumok mozgásakor.
A primitívek (pontok, vonalak, háromszögek) összeállítása után raszterizáció történik — annak meghatározása, hogy a képernyő mely pixeleit fedi le az egyes primitívek. A raszterizátor fragmenseket generál — potenciális pixeleket interpolált attribútumokkal (szín, normálisok, UV koordináták). A fragmensek száma közvetlenül függ a képernyő felbontásától és a primitív vetítési területétől.
A fragment shader minden generált fragmensre végrehajtódik. Kiszámítja a pixel végső színét, figyelembe véve a textúrákat, fényforrásokat és anyagokat. A fragment shader kimeneténél egy sor per-fragment teszt fut le: depth test meghatározza, hogy a fragmens látható-e; stencil test korlátozza a megjelenítést egy maszk szerint; blending keveri a fragmens színét a képkocka pufferben már rögzített színnel.
Az OpenGL ES állapotautomataként (state machine) működik: minden beállítás — aktuális shader, csatolt textúrák, bekapcsolt tesztek — a kontextus globális állapotában tárolódik. Az állapot megváltoztatása glEnable, glBindTexture vagy glUseProgram segítségével hatással van az összes későbbi rajzolási parancsra. Minden állapotváltás overhead-et okoz az illesztőprogramban, ezért a draw hívások állapot szerinti csoportosítása az optimalizálás fő módszere.
OpenGL ES 1.0 és 1.1 (2003–2004-ben kiadva) a rögzített pipeline-on alapultak. Támogatták a transzformációkat, textúrázást, megvilágítást és blending-et, de nem tették lehetővé a shader-ek programozását. Az API-t korai mobiltelefonokban és Symbian és Windows Mobile alapú eszközökben használták. Ma ezek a verziók elavultnak számítanak — a modern eszközök nem támogatják őket.
OpenGL ES 2.0 (2007) bevezette a programozható pipeline-t vertex és fragment shader-ekkel GLSL ES nyelven. Ez a verzió szabvánnyá vált Android 2.2+ és iOS 5+ rendszerekhez, és a mai napig az eszközök túlnyomó többsége támogatja. OpenGL ES 2.0 — a minimális verzió, amely szükséges a Unity, Unreal Engine és Cocos2d-x futtatásához mobil platformokon.
OpenGL ES 3.0 (2012) számos kritikus képességet adott hozzá: több renderelési cél (MRT), transform feedback, instancing, tetszőleges formátumú textúrák ETC2/EAC segítségével. A renderelési teljesítmény 30–50%-kal nőtt a 2.0 verzióhoz képest a draw hívások számának csökkenése miatt. OpenGL ES 3.1 (2014) bevezette a számítási shader-eket (compute shaders) és az atomi műveleteket pufferekkel — ez lehetővé tette a GPU-n nemcsak grafikai, hanem számítási feladatok (utófeldolgozás, szövet szimuláció, fizikai számítások) végrehajtását is.
OpenGL ES 3.2 (2015) — a specifikáció utolsó verziója — tesszellációs és geometriai shader-eket, valamint kiterjesztett float-textúra készletet és blend módokat adott hozzá. A modernebb Vulkan 2016-os megjelenése ellenére az OpenGL ES 3.2 továbbra is aktuális API marad a hatalmas meglévő kódbázisnak és az alkalmazások platformok közötti egyszerű átvitelének köszönhetően.
| Verzió | Év | Főbb képességek | Kompatibilitás (2026) |
|---|---|---|---|
| 1.x | 2003 | Rögzített pipeline, megvilágítás, textúrák | Elavult |
| 2.0 | 2007 | Programozható pipeline, GLSL ES | 99% eszköz |
| 3.0 | 2012 | MRT, instancing, ETC2, transform feedback | 92% eszköz |
| 3.1 | 2014 | Számítási shader, atomi pufferek | 80% eszköz |
| 3.2 | 2015 | Tesszelláció, geometriai shader | 65% eszköz |
GLSL ES (OpenGL Shading Language for Embedded Systems) — a shader-ek programozási nyelve, amely a C szintaxisán alapul, kiegészítve vektorokkal és mátrixokkal való munkához szükséges típusokkal. Minden shader egy program, amely az alkalmazás inicializálási szakaszában a GPU gépi kódjává fordul le. A CPU kóddal ellentétben a shader-ek tömegesen párhuzamosan hajtódnak végre: több ezer vertex vagy fragmens feldolgozása történik egyidejűleg.
Vertex shader feldolgozza a háló minden egyes vertexét. Fő feladata a vertex végső pozíciójának kiszámítása a clip space-ben a bemeneti pozíció MVP mátrixszal való megszorzásával. Ezenkívül a vertex shader kiszámíthat normálisokat, UV koordinátákat, színeket, és továbbíthatja azokat a fragment shader-nek varying változókon keresztül. Minden vertex shader hívás függetlenül működik, lehetővé téve a GPU számára, hogy képkockánként milliónyi vertexet dolgozzon fel.
// Egyszerű vertex shader OpenGL ES 3.0-hoz
#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 meghatározza a képernyő minden egyes pixelének színét. Megkapja az interpolált varying értékeket a vertex shader-től, kiválasztja a texeleket a csatolt textúrákból, és alkalmazza a megvilágítást. A helyes megvilágításhoz a Phong vagy Blinn-Phong modellt használják a diffuse, specular és ambient komponensek kiszámításával. Minden fragment shader hívás egy pixelnek felel meg, így a hívások teljes száma megegyezik az objektum képernyőn lévő vetítési területével.
// Egyszerű fragment shader textúrával és megvilágítással
#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);
}
A fenti példában a fragment shader kiválaszt egy texelt a 2D textúrából UV koordináták alapján, kiszámítja a diffuse megvilágítást a normális és a fényirány skaláris szorzataként, és megszorozza a texel színét a megvilágítás intenzitásával. Mediump — ajánlott pontosság a fragment shader-ekhez mobil GPU-kon: elegendő minőséget biztosít minimális energiafogyasztás mellett.
Az OpenGL ES használatához Androidon EGL kontextust kell létrehozni — egy felületet, amelyre a grafika megjelenik. iOS-en az EGL-szerű EAGL réteget használják, amelyet a GLKit keretrendszer biztosít. Mindkét esetben az inicializálási folyamat magában foglalja az ablakfelület létrehozását, a kontextus attribútumainak konfigurálását és a jelenlegi renderelési szálhoz való kapcsolódást.
// OpenGL ES 3.0 inicializálása Androidon
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)
}
}
A kontextus létrehozása után a fejlesztőnek konfigurálnia kell a puffereket: a vertex puffer (VBO) tartalmazza a vertex koordinátákat, normálisokat és UV-t; az index puffer (EBO) meghatározza a vertexek bejárási sorrendjét a háromszögek kialakításához. VAO (Vertex Array Object) egyetlen objektumba egyesíti az összes attribútum konfigurációját, csökkentve az API hívások számát a mesh-ek váltásakor.
EGL (Native Platform Graphics Interface) — az OpenGL ES és az ablakrendszer közötti köztes réteg. Androidon az EGL kezeli a rajzfelület létrehozását, a framebuffer konfiguráció kiválasztását (színmélység, stencil, MSAA) és a vsync-el való szinkronizációt. Tipikus konfiguráció RGBA8888-at kér 24-bites depth pufferrel és 8-bites stencil pufferrel. iOS-en az EGL szerepét az EAGL tölti be a CAEAGLLayer-rel kombinálva.
Az OpenGL ES teljesítmény optimalizálása mobileszközökön több kulcsfontosságú gyakorlatot foglal magában. Használjon instancing-et (glDrawArraysInstanced) több azonos objektum megjelenítéséhez — ez csökkenti a draw hívások számát. Alkalmazzon textúra pool-okat, és kerülje a textúrák váltogatását a draw hívások között. Rendezze az objektumokat shader, majd textúra, végül mesh szerint — ez a sorrend minimalizálja a kontextus állapotváltásait.
Metal — alacsony szintű grafikus API az Apple-től, elérhető iOS-en és macOS-en az A7 chip-től kezdve. A Metal közvetlen hozzáférést biztosít a GPU-hoz minimális illesztőprogram overhead-dzsel, de csak Apple eszközökön működik. A WWDC 2024 adatai szerint a Metal akár 40%-kal magasabb teljesítményt nyújt az OpenGL ES-hez képest ugyanazon a hardveren az állapotellenőrzések számának futásidőben történő csökkentésével.
Vulkan — az OpenGL ES cross-platform utódja, amelyet a Khronos Group fejlesztett ki. A Vulkan explicit erőforrás-kezelést használ: a fejlesztő maga allokál memória pool-okat, hoz létre parancs puffereket és szinkronizálja a GPU-hoz való hozzáférést. Ez maximális kontrollt biztosít a teljesítmény felett, de a Vulkan inicializálási kódja 3–4-szer nagyobb, mint az OpenGL ES-é. A Vulkan AAA játékokhoz és igényes grafikájú alkalmazásokhoz ajánlott Android 7+ rendszeren.
Az OpenGL ES, Metal és Vulkan közötti választás a célplatformoktól és a teljesítménykövetelményektől függ. Az OpenGL ES továbbra is a legjobb választás cross-platform projektekhez, ahol a fejlesztési sebesség fontos. A Metal az iOS/macOS ökoszisztéma számára előnyös maximális teljesítménnyel. A Vulkan — olyan projektekhez való, ahol minden ezredmásodperc kritikus, és a fejlesztési költségvetés lehetővé teszi az alacsony szintű optimalizálásba való befektetést.
| Jellemző | OpenGL ES | Metal | Vulkan |
|---|---|---|---|
| Platformok | Android, iOS, Windows, Linux | Csak iOS, macOS | Android, Windows, Linux (iOS nem) |
| API szint | Magas (state machine) | Közepes | Alacsony (explicit) |
| Inicializálási kód | 50–100 sor | 100–200 sor | 300–500 sor |
| Memória kontroll | Automatikus | Félautomatikus | Teljesen kézi |
| Teljesítmény | Alap | +20–40% vs ES | +30–60% vs ES |
Gyakran Ismételt Kérdések
OpenGL ES — az asztali OpenGL egy részhalmaza, amelyből eltávolították a rögzített pipeline elavult funkcióit. Az OpenGL ES kisebb specifikációs térfogattal, egyszerűsített pontossági profillal rendelkezik, és optimalizálva van a mobileszközök alacsony energiafogyasztására.
Android támogatja az OpenGL ES 2.0-t minden eszközön, a 3.0-t Android 4.3+-on, a 3.1-et Android 5.0+-on, a 3.2-t kiválasztott eszközökön Android 7.0+-val. Az aktuális támogatási szint ellenőrizhető az EGL_CONFIG_CAVEAT segítségével.
GLSL ES (OpenGL Shading Language for Embedded Systems) — C-szerű nyelv vec2/vec3/vec4/mat4 típusokkal és beépített texture, normalize, dot függvényekkel. ES 3.0+-hoz a #version 300 es direktíva használatos.
Igen, az OpenGL ES továbbra is releváns cross-platform projektekhez, ahol a fejlesztési sebesség és a széles eszközválaszték támogatása az elsődleges. Az iOS ökoszisztémához jobb a Metal-t tanulni, a maximális teljesítményű új projektekhez pedig a Vulkan-t.
Androidon hívja meg a GLES30.glGetString(GLES30.GL_VERSION) függvényt a kontextus létrehozása után. A karakterlánc tartalmazza a verziószámot és a gyártó információit. iOS-en használja a [EAGLContext currentContext] és API tulajdonságot.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is