OpenGL ES — је графички АПИ отворене спецификације, намењен уграђеним и мобилним системима. Пружа хардверски убрзано рендеровање 2D и 3D графике кроз програмабилни конвејер шејдера. Према подацима Khronos Group, 2025, OpenGL ES остаје најраспрострањенији графички АПИ на мобилним уређајима, подржавајући више од 10 милијарди инсталација широм света. Библиотека се користи у играма, картографским сервисима, АР апликацијама и интерфејсима на Android и iOS.
Главно
OpenGL ES (Open Graphics Library for Embedded Systems) — је подскуп десктоп OpenGL АПИ-ја, прилагођен мобилним уређајима, играчким конзолама и уграђеним системима. Спецификацију развија конзорцијум Khronos Group и доступна је бесплатно свим произвођачима. За разлику од десктоп OpenGL-а, OpenGL ES уклања застареле функције фиксног конвејера, остављајући само програмабилни конвејер шејдера — ово смањује потрошњу енергије и поједностављује драјвере.
Основна област примене OpenGL ES — рендеровање графике у реалном времену. АПИ се користи у мобилним играма (Unity, Unreal Engine), навигационим апликацијама, АР решењима на бази ARCore и ARKit, као и у системским интерфејсима Android и iOS. Према подацима StatCounter, 2026, удео уређаја са подршком за OpenGL ES 3.0+ прелази 92% међу активним паметним телефонима.
Кључна предност OpenGL ES — вишеплатформска компатибилност. Иста апликација написана у OpenGL ES може радити на Android, iOS, Linux и Windows са минималним изменама. Ово чини АПИ оптималним избором за пројекте усмерене на више платформи без преписивања графичког погона.
Ране верзије OpenGL (пре 2.0) користиле су фиксни конвејер — скуп предефинисаних фаза обраде вертекса и пиксела. Програмер је могао само да подеси параметре: положај извора светлости, својства материјала, матрице трансформације. Програмабилни конвејер, уведен у OpenGL ES 2.0, заменио је фиксне фазе шејдерима — малим програмима који се извршавају на GPU. Ово је програмерима дало потпуну контролу над приказом геометрије.
Прелазак на програмабилни конвејер био је револуција за мобилну графику. Програмери су добили могућност имплементације сложених ефеката: PBR (Physically Based Rendering), динамичке сенке, постпроцесирање и HDR. Фиксни конвејер је захтевао мање кода, али није дозвољавао креирање јединствених визуелних стилова. Савремене мобилне игре у потпуности раде на програмабилном конвејеру.
Графички конвејер OpenGL ES састоји се од неколико узастопних фаза, од којих свака трансформише улазне податке на путу од вертекса до пиксела на екрану. Разумевање архитектуре конвејера је критично за оптимизацију перформанси рендеровања на мобилним уређајима са ограниченим буџетом енергије и топлотног ослобађања.
| Фаза конвејера | Намена | Програмира се |
|---|---|---|
| Vertex Shader | Трансформација вертекса, примена матрица модел-поглед-пројекција | Да — GLSL |
| Tessellation | Подела геометрије (само ES 3.2) | Да — GLSL |
| Geometry Shader | Генерисање нове геометрије из примитива | Да — GLSL |
| Rasterization | Конверзија примитива у фрагменте (пикселе) | Не — фиксно |
| Fragment Shader | Израчунавање боје сваког фрагмента, текстурисање, осветљење | Да — GLSL |
| Per-Fragment Operations | Depth test, stencil test, blending, scissor test | Подешавање параметара |
Прва фаза — вертексни шејдер — обрађује сваки вертекс независно. У овој фази примењују се трансформације: прелазак из локалног простора модела у светски простор, затим у простор камере и, на крају, у простор одсецања (clip space). Трансформације се задају кроз uniform-матрице MVP (Model-View-Projection), које се ажурирају сваког кадра при покрету камере или објеката.
Након склапања примитива (тачака, линија, троуглова) врши се растеризација — процес одређивања које пикселе екрана покрива сваки примитив. Растеризатор генерише фрагменте — потенцијалне пикселе са интерполираним атрибутима (боја, нормале, UV координате). Број фрагмената директно зависи од резолуције екрана и површине пројекције примитива.
Фрагментни шејдер се извршава за сваки генерисани фрагмент. Он израчунава коначну боју пиксела узимајући у обзир текстуре, изворе светлости и материјале. На излазу фрагментног шејдера пролази серија per-fragment тестова: depth test одређује да ли је фрагмент видљив; stencil test ограничава рендеровање према маски; blending меша боју фрагмента са бојом већ уписаном у бафер кадра.
OpenGL ES ради као коначни аутомат (state machine): сва подешавања — тренутни шејдер, везане текстуре, укључени тестови — чувају се у глобалном стању контекста. Промена стања путем glEnable, glBindTexture или glUseProgram утиче на све наредне команде цртања. Свако пребацивање стања изазива додатне трошкове у драјверу, зато је груписање draw позива према стању основни приступ оптимизацији.
OpenGL ES 1.0 и 1.1 (објављене 2003–2004) заснивале су се на фиксном конвејеру. Подржавале су трансформације, текстурисање, осветљење и blending, али нису дозвољавале програмирање шејдера. АПИ се користио у раним мобилним телефонима и уређајима заснованим на Symbian и Windows Mobile. Данас се ове верзије сматрају застарелим — савремени уређаји их не подржавају.
OpenGL ES 2.0 (2007) увео је програмабилни конвејер са вертексним и фрагментним шејдерима у језику GLSL ES. Ова верзија је постала стандард за Android 2.2+ и iOS 5+ и подржава је огромна већина уређаја и данас. OpenGL ES 2.0 — минимална верзија потребна за рад Unity, Unreal Engine и Cocos2d-x на мобилним платформама.
OpenGL ES 3.0 (2012) додао је неколико критичних могућности: вишеструке рендер циљеве (MRT), transform feedback, instancing, текстуре произвољног формата преко ETC2/EAC. Перформансе рендеровања порасле су за 30–50% у поређењу са верзијом 2.0 захваљујући смањењу броја draw позива. OpenGL ES 3.1 (2014) увео је рачунске шејдере (compute shaders) и атомске операције са баферима — ово је омогућило извршавање на GPU не само графичких, већ и рачунских задатака (постпроцесирање, симулација тканина, прорачун физике).
OpenGL ES 3.2 (2015) — последња верзија спецификације — додала је теселационе и геометријске шејдере, као и проширени скуп float-текстура и blend режима. Упркос изласку савременијег Vulkan-а 2016. године, OpenGL ES 3.2 остаје актуелан АПИ захваљујући огромној бази постојећег кода и једноставности преноса апликација између платформи.
| Верзија | Година | Кључне могућности | Компатибилност (2026) |
|---|---|---|---|
| 1.x | 2003 | Фиксни конвејер, осветљење, текстуре | Застарела |
| 2.0 | 2007 | Програмабилни конвејер, GLSL ES | 99% уређаја |
| 3.0 | 2012 | MRT, instancing, ETC2, transform feedback | 92% уређаја |
| 3.1 | 2014 | Рачунски шејдери, атомски бафери | 80% уређаја |
| 3.2 | 2015 | Теселација, геометријски шејдери | 65% уређаја |
GLSL ES (OpenGL Shading Language for Embedded Systems) — језик програмирања шејдера заснован на синтакси C са додатним типовима за рад са векторима и матрицама. Сваки шејдер је програм који се компајлира у машински код GPU у фази иницијализације апликације. За разлику од CPU кода, шејдери се извршавају масовно-паралелно: хиљаде вертекса или фрагмената обрађују се истовремено.
Вертексни шејдер обрађује сваки вертекс мреже. Његов главни задатак је израчунавање коначне позиције вертекса у clip space множењем улазне позиције са MVP матрицом. Поред тога, вертексни шејдер може израчунавати нормале, UV координате, боје и прослеђивати их фрагментном шејдеру преко varying променљивих. Сваки позив вертексног шејдера ради независно, што омогућава GPU-у да обради милионе вертекса у једном кадру.
// Једноставан вертексни шејдер за 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;
}
Фрагментни шејдер одређује боју сваког пиксела на екрану. Он прима интерполиране varying вредности из вертексног шејдера, бира текеле из везаних текстура и примењује осветљење. За коректно осветљење користи се Phong или Blinn-Phong модел са израчунавањем diffuse, specular и ambient компоненти. Сваки позив фрагментног шејдера одговара једном пикселу, тако да је укупан број позива једнак површини пројекције објекта на екрану.
// Једноставан фрагментни шејдер са текстуром и осветљењем
#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);
}
У наведеном примеру, фрагментни шејдер бира текел из 2D текстуре по UV координатама, израчунава diffuse осветљење као скаларни производ нормале и смера светлости, и множи боју текела са интензитетом осветљења. Mediump — препоручена прецизност за фрагментне шејдере на мобилним GPU: пружа довољан квалитет уз минималну потрошњу енергије.
За рад са OpenGL ES на Android-у потребно је креирати EGL контекст — површину на коју ће се приказивати графика. На iOS-у се користи EGL-сличан слој EAGL, који обезбеђује GLKit оквир. У оба случаја процес иницијализације укључује креирање прозорске површине, конфигурацију атрибута контекста и повезивање са тренутном нити рендеровања.
// Иницијализација OpenGL ES 3.0 на 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)
}
}
Након креирања контекста, програмер треба да конфигурише бафере: вертексни бафер (VBO) садржи координате вертекса, нормале и UV; индексни бафер (EBO) одређује редослед обиласка вертекса за формирање троуглова. VAO (Vertex Array Object) обједињује конфигурацију свих атрибута у један објекат, смањујући број АПИ позива при промени мешева.
EGL (Native Platform Graphics Interface) — посредни слој између OpenGL ES и прозорског система. На Android-у EGL управља креирањем површине за цртање, избором конфигурације framebuffer-а (дубина боје, stencil, MSAA) и синхронизацијом са vsync. Типична конфигурација захтева RGBA8888 са 24-битним depth бафером и 8-битним stencil бафером. На iOS-у улогу EGL-а обавља EAGL у спрези са CAEAGLLayer.
Оптимизација перформанси OpenGL ES на мобилним уређајима укључује неколико кључних пракси. Користите инстансинг (glDrawArraysInstanced) за рендеровање више идентичних објеката — ово смањује број draw позива. Примењујте пулове текстура и избегавајте пребацивање текстура између draw позива. Сортирајте објекте према шејдеру, затим према текстури, па према мешу — овај редослед минимизира пребацивање стања контекста.
Metal — нижеслојни графички АПИ од Apple-а, доступан на iOS и macOS од A7 чипа. Metal пружа директан приступ GPU-у са минималним додатним трошковима драјвера, али ради само на Apple уређајима. Према подацима WWDC 2024, Metal обезбеђује до 40% веће перформансе у поређењу са OpenGL ES на истом хардверу захваљујући смањењу броја провера стања у рандтајму.
Vulkan — вишеплатформски наследник OpenGL ES, развијен од стране Khronos Group. Vulkan користи експлицитно управљање ресурсима: програмер сам издваја пулове меморије, креира командне бафере и синхронизује приступ GPU-у. Ово пружа максималну контролу над перформансама, али код иницијализације Vulkan-а је 3–4 пута обимнији него за OpenGL ES. Vulkan се препоручује за AAA игре и апликације са захтевном графиком на Android 7+.
Избор између OpenGL ES, Metal и Vulkan зависи од циљаних платформи и захтева за перформансама. OpenGL ES остаје најбољи избор за вишеплатформске пројекте где је важна брзина развоја. Metal је пожељан за iOS/macOS екосистем са максималним перформансама. Vulkan — избор за пројекте где је критична свака милисекунда кадра, а буџет развоја дозвољава улагање у нижеслојну оптимизацију.
| Карактеристика | OpenGL ES | Metal | Vulkan |
|---|---|---|---|
| Платформе | Android, iOS, Windows, Linux | Само iOS, macOS | Android, Windows, Linux (iOS нема) |
| Ниво АПИ | Висок (state machine) | Средњи | Низак (explicit) |
| Код иницијализације | 50–100 линија | 100–200 линија | 300–500 линија |
| Контрола меморије | Аутоматска | Полуаутоматска | Потпуно ручна |
| Перформансе | Основне | +20–40% vs ES | +30–60% vs ES |
Често постављана питања
OpenGL ES — је подскуп десктоп OpenGL-а из којег су уклоњене застареле функције фиксног конвејера. OpenGL ES има мањи обим спецификације, поједностављени профил прецизности и оптимизован је за ниску потрошњу енергије мобилних уређаја.
Android подржава OpenGL ES 2.0 на свим уређајима, 3.0 — на Android 4.3+, 3.1 — на Android 5.0+, 3.2 — на изабраним уређајима са Android 7.0+. Актуелни ниво подршке може се проверити путем EGL_CONFIG_CAVEAT.
GLSL ES (OpenGL Shading Language for Embedded Systems) — C-сличан језик са типовима vec2/vec3/vec4/mat4 и уграђеним функцијама texture, normalize, dot. За ES 3.0+ користи се директива #version 300 es.
Да, OpenGL ES остаје актуелан за вишеплатформске пројекте где је приоритет брзина развоја и подршка за широк спектар уређаја. За iOS екосистем боље је учити Metal, за нове пројекте са максималним перформансама — Vulkan.
На Android-у позовите GLES30.glGetString(GLES30.GL_VERSION) након креирања контекста. Стринг садржи број верзије и информацију о произвођачу. На iOS-у користите [EAGLContext currentContext] и својство API.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође