OpenGL ES — یک API گرافیکی با مشخصات باز است که برای سیستمهای嵌入 شده و موبایل طراحی شده است. این API رندرینگ 2D و 3D با شتاب سختافزاری را از طریق خط لوله قابل برنامهریزی شیدر فراهم میکند. بر اساس دادههای Khronos Group, 2025، OpenGL ES پرکاربردترین API گرافیکی در دستگاههای موبایل باقی مانده است و بیش از 10 میلیارد نصب را در سراسر جهان پشتیبانی میکند. این کتابخانه در بازیها، سرویسهای نقشه، برنامههای AR و رابطهای Android و iOS استفاده میشود.
نکات اصلی
OpenGL ES (Open Graphics Library for Embedded Systems) — زیرمجموعهای از API دسکتاپ OpenGL است که برای دستگاههای موبایل، کنسولهای بازی و سیستمهای嵌入 شده تطبیق داده شده است. مشخصات توسط کنسرسیوم 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 انتخاب بهینهای برای پروژههایی باشد که روی پلتفرمهای متعدد بدون بازنویسی موتور گرافیکی هدفگیری میکنند.
نسخههای اولیه 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 | تولید هندسه جدید از primitives | بله — GLSL |
| Rasterization | تبدیل primitives به fragment (پیکسل) | خیر — ثابت |
| Fragment Shader | محاسبه رنگ هر fragment، بافتدهی، نورپردازی | بله — GLSL |
| Per-Fragment Operations | Depth test، stencil test، blending، scissor test | تنظیم پارامترها |
اولین مرحله — شیدر رأس — هر رأس را به طور مستقل پردازش میکند. در این مرحله تبدیلها اعمال میشوند: از فضای محلی مدل به فضای جهان، سپس به فضای دوربین و در نهایت به فضای برش (clip space). تبدیلها از طریق ماتریسهای uniform MVP (Model-View-Projection) داده میشوند که در هر فریم با حرکت دوربین یا اشیاء بهروز میشوند.
پس از مونتاژ primitives (نقاط، خطوط، مثلثها)، rasterization انجام میشود — فرآیند تعیین اینکه هر primitive کدام پیکسلهای صفحه را پوشش میدهد. Rasterizer fragmentها — پیکسلهای بالقوه با ویژگیهای درونیابی شده (رنگ، نرمال، مختصات UV) — تولید میکند. تعداد fragmentها مستقیماً به وضوح صفحه و مساحت پروجکشن primitive بستگی دارد.
شیدر fragment برای هر fragment تولید شده اجرا میشود. این شیدر رنگ نهایی پیکسل را با در نظر گرفتن بافتها، منابع نور و مواد محاسبه میکند. در خروجی شیدر fragment، یک سری تستهای per-fragment انجام میشود: depth test مشخص میکند که fragment قابل مشاهده است یا خیر؛ stencil test رندرینگ را بر اساس ماسک محدود میکند؛ blending رنگ fragment را با رنگی که قبلاً در بافر فریم نوشته شده است مخلوط میکند.
OpenGL ES به عنوان ماشین حالت (state machine) کار میکند: همه تنظیمات — شیدر فعلی، بافتهای متصل، تستهای فعال — در حالت سراسری زمینه ذخیره میشوند. تغییر حالت از طریق glEnable، glBindTexture یا glUseProgram بر تمام دستورات بعدی ترسیم تأثیر میگذارد. هر تغییر حالت باعث سربار در درایور میشود، بنابراین گروهبندی فراخوانیهای draw بر اساس حالت — تکنیک اصلی بهینهسازی است.
OpenGL ES 1.0 و 1.1 (منتشر شده در 2003–2004) بر اساس خط لوله ثابت بودند. آنها از تبدیلها، بافتدهی، نورپردازی و blending پشتیبانی میکردند اما اجازه برنامهنویسی شیدر را نمیدادند. این API در تلفنهای همراه اولیه و دستگاههای مبتنی بر Symbian و Windows Mobile استفاده میشد. امروزه این نسخهها منسوخ محسوب میشوند — دستگاههای مدرن از آنها پشتیبانی نمیکنند.
OpenGL ES 2.0 (2007) خط لوله قابل برنامهریزی را با شیدرهای رأس و fragment به زبان 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. عملکرد رندرینگ در مقایسه با نسخه 2.0 به دلیل کاهش تعداد فراخوانیهای draw 30–50% افزایش یافت. OpenGL ES 3.1 (2014) شیدرهای محاسباتی (compute shaders) و عملیات اتمی روی بافرها را معرفی کرد — این امکان را فراهم کرد که روی GPU نه تنها وظایف گرافیکی، بلکه محاسباتی (پسپردازش، شبیهسازی پارچه، محاسبات فیزیک) نیز انجام شود.
OpenGL ES 3.2 (2015) — آخرین نسخه مشخصات — شیدرهای tesselation و هندسه و همچنین مجموعه گستردهای از بافتهای float و حالتهای blend را اضافه کرد. علیرغم انتشار Vulkan مدرنتر در سال 2016، OpenGL ES 3.2 به دلیل پایگاه عظیم کد موجود و سادگی انتقال برنامهها بین پلتفرمها یک API فعلی باقی مانده است.
| نسخه | سال | قابلیتهای کلیدی | سازگاری (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) — زبان برنامهنویسی شیدر بر اساس syntax C با انواع اضافی برای کار با بردارها و ماتریسها. هر شیدر برنامهای است که در مرحله مقداردهی اولیه برنامه به کد ماشین GPU کامپایل میشود. برخلاف کد CPU، شیدرها به صورت موازی انبوه اجرا میشوند: هزاران رأس یا fragment به طور همزمان پردازش میشوند.
شیدر رأس هر رأس مش را پردازش میکند. وظیفه اصلی آن محاسبه موقعیت نهایی رأس در clip space با ضرب موقعیت ورودی در ماتریس MVP است. علاوه بر این، شیدر رأس میتواند نرمالها، مختصات UV، رنگها را محاسبه کرده و آنها را از طریق متغیرهای varying به شیدر fragment منتقل کند. هر فراخوانی شیدر رأس به طور مستقل کار میکند که به 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;
}
شیدر fragment رنگ هر پیکسل روی صفحه را تعیین میکند. این شیدر مقادیر درونیابی شده varying را از شیدر رأس دریافت میکند، texelها را از بافتهای متصل انتخاب کرده و نورپردازی را اعمال میکند. برای نورپردازی صحیح از مدل Phong یا Blinn-Phong با محاسبه مؤلفههای diffuse، specular و ambient استفاده میشود. هر فراخوانی شیدر fragment معادل یک پیکسل است، بنابراین تعداد کل فراخوانیها برابر مساحت پروجکشن شیء روی صفحه است.
// شیدر ساده fragment با بافت و نورپردازی
#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);
}
در مثال بالا، شیدر fragment یک texel را از بافت 2D بر اساس مختصات UV انتخاب میکند، نورپردازی diffuse را به عنوان حاصل ضرب اسکالر نرمال و جهت نور محاسبه کرده و رنگ texel را در شدت نور ضرب میکند. Mediump — دقت توصیهشده برای شیدرهای fragment در 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) پیکربندی همه ویژگیها را در یک شیء ترکیب میکند و تعداد فراخوانیهای API را هنگام تغییر مشها کاهش میدهد.
EGL (Native Platform Graphics Interface) — لایه میانی بین OpenGL ES و سیستم پنجره است. در Android، EGL ایجاد سطح ترسیم، انتخاب پیکربندی framebuffer (عمق رنگ، stencil، MSAA) و همگامسازی با vsync را مدیریت میکند. پیکربندی معمول RGBA8888 با بافر depth 24 بیتی و بافر stencil 8 بیتی را درخواست میکند. در iOS نقش EGL توسط EAGL در ترکیب با CAEAGLLayer انجام میشود.
بهینهسازی عملکرد OpenGL ES در دستگاههای موبایل شامل چند روش کلیدی است. برای رندرینگ اشیاء مشابه متعدد از instancing (glDrawArraysInstanced) استفاده کنید — این تعداد فراخوانیهای draw را کاهش میدهد. از pool بافت استفاده کنید و از تغییر بافت بین فراخوانیهای draw خودداری کنید. اشیاء را ابتدا بر اساس شیدر، سپس بافت و سپس مش مرتب کنید — این ترتیب تغییرات حالت زمینه را به حداقل میرساند.
Metal — API گرافیکی سطح پایین از Apple، قابل دسترس در iOS و macOS از تراشه A7. Metal دسترسی مستقیم به GPU را با حداقل سربار درایور فراهم میکند اما فقط روی دستگاههای Apple کار میکند. بر اساس دادههای WWDC 2024، Metal تا 40% عملکرد بالاتر نسبت به OpenGL ES روی همان سختافزار با کاهش تعداد بررسیهای حالت در زمان اجرا ارائه میدهد.
Vulkan — جانشین چندسکویی OpenGL ES است که توسط Khronos Group توسعه یافته است. Vulkan از مدیریت صریح منابع استفاده میکند: توسعهدهنده خود poolهای حافظه را تخصیص میدهد، بافرهای فرمان ایجاد میکند و دسترسی به 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 خیر) |
| سطح API | بالا (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، در Android 4.3+ از 3.0، در Android 5.0+ از 3.1، در دستگاههای منتخب با Android 7.0+ از 3.2 پشتیبانی میکند. سطح پشتیبانی فعلی را میتوان از طریق 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.