OpenGL ES: що це таке, архітектура та застосування

Автор: IT Sectr Опубліковано: 2026-05-03 Час читання: 11 хв

OpenGL ES — це графічний API з відкритою специфікацією, призначений для вбудованих і мобільних систем. Він забезпечує апаратно-прискорений рендеринг 2D і 3D графіки через програмований конвеєр шейдерів. За даними Khronos Group, 2025, OpenGL ES залишається найпоширенішим графічним API на мобільних пристроях, підтримуючи понад 10 мільярдів установок у всьому світі. Бібліотека використовується в іграх, картографічних сервісах, AR-додатках та інтерфейсах на Android і iOS.

Головне

  • OpenGL ES — кроссплатформний графічний API для мобільних і вбудованих пристроїв, стандарт де-факто в індустрії
  • Програмований конвеєр включає вершинні, фрагментні та обчислювальні шейдери, написані мовою GLSL
  • Версії OpenGL ES 2.0, 3.0 і 3.2 визначають набір доступних функцій — кожна наступна додає шейдерні стадії та покращення продуктивності
  • EGL — проміжний шар, що пов'язує OpenGL ES з віконною системою конкретної платформи (Android, iOS, Windows)
  • Metal і Vulkan — більш низькорівневі альтернативи, що забезпечують менші накладні витрати, але потребують більше коду для ініціалізації

Що таке OpenGL ES?

OpenGL ES (Open Graphics Library for Embedded Systems) — це підмножина настільного OpenGL API, адаптована для мобільних пристроїв, ігрових консолей і вбудованих систем. Специфікація розробляється консорціумом Khronos Group і доступна безкоштовно для всіх виробників. На відміну від настільного OpenGL, OpenGL ES видаляє застарілі функції фіксованого конвеєра, залишаючи лише програмований конвеєр шейдерів — це знижує енергоспоживання та спрощує драйвери.

Основна сфера застосування OpenGL ES — рендеринг графіки в реальному часі. API використовується в мобільних іграх (Unity, Unreal Engine), навігаційних додатках, AR-рішеннях на базі ARCore та ARKit, а також у системних інтерфейсах Android і iOS. За даними StatCounter, 2026, частка пристроїв з підтримкою OpenGL ES 3.0+ перевищує 92% серед активних смартфонів.

Ключова перевага OpenGL ES — кроссплатформність. Один і той самий додаток, написаний на OpenGL ES, може працювати на Android, iOS, Linux і Windows з мінімальними змінами. Це робить API оптимальним вибором для проєктів, орієнтованих на безліч платформ без переписування графічного рушія.

Фіксований vs програмований конвеєр

Ранні версії OpenGL (до 2.0) використовували фіксований конвеєр — набір попередньо визначених етапів обробки вершин і пікселів. Розробник міг лише налаштувати параметри: положення джерел світла, властивості матеріалів, матриці трансформації. Програмований конвеєр, введений у OpenGL ES 2.0, замінив фіксовані стадії шейдерами — невеликими програмами, що виконуються на GPU. Це дало розробникам повний контроль над відображенням геометрії.

Перехід на програмований конвеєр став революцією для мобільної графіки. Розробники отримали можливість реалізовувати складні ефекти: PBR (Physically Based Rendering), динамічні тіні, постобробку та HDR. Фіксований конвеєр вимагав менше коду, але не дозволяв створювати унікальні візуальні стилі. Сучасні мобільні ігри повністю працюють на програмованому конвеєрі.

Архітектура OpenGL ES: конвеєр рендерингу

Графічний конвеєр OpenGL ES складається з кількох послідовних стадій, кожна з яких перетворює вхідні дані на шляху від вершин до пікселів на екрані. Розуміння архітектури конвеєра критично важливе для оптимізації продуктивності рендерингу на мобільних пристроях з обмеженим бюджетом енергії та тепловиділення.

Стадія конвеєраПризначенняПрограмується
Vertex ShaderТрансформація вершин, застосування матриць моделі-виду-проекціїТак — GLSL
ТеселяціяПідрозділ геометрії (тільки ES 3.2)Так — GLSL
Geometry ShaderГенерація нової геометрії з примітивівТак — GLSL
РастеризаціяПеретворення примітивів на фрагменти (пікселі)Ні — фіксовано
Fragment ShaderРозрахунок кольору кожного фрагмента, текстурування, освітленняТак — GLSL
Per-Fragment OperationsDepth test, stencil test, blending, scissor testНалаштування параметрів

Перша стадія — вершинний шейдер — обробляє кожну вершину незалежно. На цьому етапі застосовуються трансформації: переведення з локального простору моделі у світовий простір, потім у простір камери і, нарешті, у зрізаний простір (clip space). Трансформації задаються через uniform-матриці MVP (Model-View-Projection), які оновлюються кожен кадр при русі камери або об'єктів.

Після збірки примітивів (точок, ліній, трикутників) виконується растеризація — процес визначення, які пікселі екрана покриває кожен примітив. Растеризатор генерує фрагменти — потенційні пікселі з інтерпольованими атрибутами (кольором, нормалями, UV-координатами). Кількість фрагментів безпосередньо залежить від роздільної здатності екрана та площі проекції примітива.

Фрагментний шейдер виконується для кожного згенерованого фрагмента. Він розраховує підсумковий колір пікселя з урахуванням текстур, джерел світла та матеріалів. На виході фрагментного шейдера проходить серія per-fragment тестів: depth test визначає, чи видимий фрагмент; stencil test обмежує рендеринг за маскою; blending змішує колір фрагмента з кольором, уже записаним у буфері кадра.

Стани контексту OpenGL ES

OpenGL ES працює як скінченний автомат (state machine): всі налаштування — поточний шейдер, прив'язані текстури, увімкнені тести — зберігаються в глобальному стані контексту. Зміна стану через glEnable, glBindTexture або glUseProgram впливає на всі наступні команди відмальовування. Кожне перемикання стану викликає накладні витрати в драйвері, тому групування draw-викликів за станом — основний прийом оптимізації.

Версії OpenGL ES та їхні можливості

OpenGL ES 1.0 та 1.1 (випущені у 2003–2004 роках) базувалися на фіксованому конвеєрі. Вони підтримували трансформації, текстурування, освітлення та blending, але не дозволяли програмувати шейдери. API використовувався в ранніх мобільних телефонах і пристроях на базі 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) додав кілька критичних можливостей: множинні render targets (MRT), трансформ-фідбек, instancing, текстури довільного формату через ETC2/EAC. Продуктивність рендерингу зросла на 30–50% порівняно з версією 2.0 за рахунок зниження кількості draw-викликів. OpenGL ES 3.1 (2014) ввів обчислювальні шейдери (compute shaders) та атомарні операції з буферами — це дозволило виконувати на GPU не тільки графічні, але й обчислювальні завдання (постобробка, симуляція тканин, розрахунок фізики).

OpenGL ES 3.2 (2015) — остання версія специфікації — додала теселяційні та геометричні шейдери, а також розширений набір float-текстур і blend modes. Незважаючи на вихід більш сучасного Vulkan у 2016 році, OpenGL ES 3.2 залишається актуальним API завдяки величезній базі існуючого коду та простоті портування додатків між платформами.

ВерсіяРікКлючові можливостіСумісність (2026)
1.x2003Фіксований конвеєр, освітлення, текстуриЗастаріла
2.02007Програмований конвеєр, GLSL ES99% пристроїв
3.02012MRT, instancing, ETC2, трансформ-фідбек92% пристроїв
3.12014Обчислювальні шейдери, атомарні буфери80% пристроїв
3.22015Теселяція, геометричні шейдери65% пристроїв

Шейдери в OpenGL ES: GLSL і програмований конвеєр

GLSL ES (OpenGL Shading Language for Embedded Systems) — мова програмування шейдерів, заснована на синтаксисі C з додатковими типами для роботи з векторами та матрицями. Кожен шейдер — це програма, яка компілюється в машинний код GPU на етапі ініціалізації додатка. На відміну від CPU-коду, шейдери виконуються масово-паралельно: тисячі вершин або фрагментів обробляються одночасно.

Вершинні шейдери

Вершинний шейдер обробляє кожну вершину сітки. Його основне завдання — обчислити підсумкову позицію вершини в clip space шляхом множення вхідної позиції на матрицю MVP. Крім того, вершинний шейдер може розраховувати нормалі, UV-координати, кольори та передавати їх у фрагментний шейдер через varying-змінні. Кожен виклик вершинного шейдера працює незалежно, що дозволяє GPU обробляти мільйони вершин у кадр.

glsl
// 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;
}

Фрагментні шейдери

Фрагментний шейдер визначає колір кожного пікселя на екрані. Він приймає інтерпольовані varying-значення з вершинного шейдера, вибирає текселі з прив'язаних текстур і застосовує освітлення. Для коректного освітлення використовується модель Фонга або Блінна-Фонга з розрахунком diffuse, specular та ambient компонент. Кожен виклик фрагментного шейдера відповідає одному пікселю, тому загальна кількість викликів дорівнює площі проекції об'єкта на екрані.

glsl
// 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);
}

У наведеному прикладі фрагментний шейдер вибирає тексель з 2D-текстури за UV-координатами, обчислює diffuse-освітлення як скалярний добуток нормалі та напрямку світла, і множить колір текселя на інтенсивність освітлення. Mediump — рекомендована точність для фрагментних шейдерів на мобільних GPU: вона дає достатню якість при мінімальному енергоспоживанні.

Як почати працювати з OpenGL ES у мобільних проєктах

Для роботи з OpenGL ES на Android потрібно створити EGL-контекст — поверхню, на яку буде виводитися графіка. На iOS використовується EGL-подібний шар EAGL, що надається фреймворком GLKit. В обох випадках процес ініціалізації включає створення віконної поверхні, конфігурацію атрибутів контексту та прив'язку до поточного потоку рендерингу.

kotlin
// 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)
    }
}

Після створення контексту розробнику необхідно налаштувати буфери: вершинний буфер (VBO) містить координати вершин, нормалі та UV; індексний буфер (EBO) визначає порядок обходу вершин для формування трикутників. VAO (Vertex Array Object) об'єднує конфігурацію всіх атрибутів в один об'єкт, скорочуючи кількість викликів API при зміні мешів.

Налаштування контексту EGL

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-викликами. Сортуйте об'єкти за шейдером, потім за текстурою, потім за мешем — такий порядок мінімізує перемикання стану контексту.

OpenGL ES vs Metal vs Vulkan

Metal — низькорівневий графічний API від 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 ESMetalVulkan
ПлатформиAndroid, iOS, Windows, LinuxiOS, macOS тількиAndroid, Windows, Linux (iOS нема)
Рівень APIВисокий (state machine)СереднійНизький (explicit)
Код ініціалізації50–100 рядків100–200 рядків300–500 рядків
Контроль пам'ятіАвтоматичнийНапівавтоматичнийПовністю ручний
ПродуктивністьБазова+20–40% vs ES+30–60% vs ES

Часті запитання

У чому різниця між OpenGL та OpenGL ES?

OpenGL ES — це підмножина настільного OpenGL, з якої видалені застарілі функції фіксованого конвеєра. OpenGL ES має менший обсяг специфікації, спрощений профіль точності та оптимізований для низького енергоспоживання мобільних пристроїв.

Яка версія OpenGL ES підтримується на Android?

Android підтримує OpenGL ES 2.0 на всіх пристроях, 3.0 — на Android 4.3+, 3.1 — на Android 5.0+, 3.2 — на обраних пристроях з Android 7.0+. Актуальний рівень підтримки можна перевірити через EGL_CONFIG_CAVEAT.

Яка мова використовується для написання шейдерів OpenGL ES?

GLSL ES (OpenGL Shading Language for Embedded Systems) — C-подібна мова з типами vec2/vec3/vec4/mat4 та вбудованими функціями texture, normalize, dot. Для ES 3.0+ використовується директива #version 300 es.

Чи потрібно вивчати OpenGL ES у 2026 році?

Так, OpenGL ES залишається актуальним для кроссплатформних проєктів, де пріоритет — швидкість розробки та підтримка широкого спектру пристроїв. Для iOS-екосистеми краще вивчати Metal, для нових проєктів з максимальною продуктивністю — Vulkan.

Як перевірити версію OpenGL ES на пристрої?

На Android викличте GLES30.glGetString(GLES30.GL_VERSION) після створення контексту. Рядок містить номер версії та інформацію про вендора. На iOS використовуйте [EAGLContext currentContext] та властивість API.

Підсумки

  • OpenGL ES — основний графічний API для мобільних пристроїв, що підтримується на більш ніж 10 мільярдах установок
  • Програмований конвеєр з вершинними та фрагментними шейдерами на GLSL ES дає повний контроль над рендерингом
  • Версії 2.0, 3.0, 3.1, 3.2 відрізняються набором шейдерних стадій та доступним функціоналом
  • EGL пов'язує OpenGL ES з віконною системою, керуючи поверхнею відмальовування та синхронізацією
  • Metal і Vulkan — більш продуктивні альтернативи, але потребують більше коду та вузькоспеціалізовані по платформах
  • Оптимізація включає інстансинг, сортування draw-викликів за станом та пули текстур
  • Для кроссплатформних проєктів OpenGL ES залишається оптимальним вибором завдяки простоті та зрілій екосистемі

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також