OpenGL ES هي واجهة برمجة رسومات ذات مواصفات مفتوحة مصممة للأنظمة المدمجة والمحمولة. توفر عرض رسومات ثنائية وثلاثية الأبعاد مسرع بالأجهزة من خلال خط أنابيب قابل للبرمجة للشادرات. وفقًا لـ Khronos Group، 2025، لا يزال OpenGL ES واجهة برمجة الرسومات الأكثر انتشارًا على الأجهزة المحمولة، مع دعم أكثر من 10 مليارات تثبيت في جميع أنحاء العالم. تُستخدم المكتبة في الألعاب وخدمات الخرائط وتطبيقات الواقع المعزز والواجهات على Android و iOS.
النقاط الرئيسية
OpenGL ES (مكتبة الرسومات المفتوحة للأنظمة المدمجة) هي مجموعة فرعية من واجهة برمجة 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 (العرض الفيزيائي)، الظلال الديناميكية، المعالجة اللاحقة و HDR. كان خط الأنابيب الثابت يتطلب تعليمات برمجية أقل لكنه لم يسمح بإنشاء أنماط بصرية فريدة. تعمل الألعاب المحمولة الحديثة بالكامل على خط الأنابيب القابل للبرمجة.
خط أنابيب الرسومات لـ OpenGL ES يتكون من عدة مراحل متتالية، كل منها تحول بيانات الإدخال في المسار من الرؤوس إلى البكسلات على الشاشة. فهم بنية خط الأنابيب أمر بالغ الأهمية لتحسين أداء العرض على الأجهزة المحمولة ذات الميزانية المحدودة للطاقة والحرارة.
| مرحلة خط الأنابيب | الغرض | قابل للبرمجة |
|---|---|---|
| شادر الرؤوس | تحويل الرؤوس، تطبيق مصفوفات النموذج-العرض-الإسقاط | نعم — GLSL |
| التقسيم | تقسيم الهندسة (ES 3.2 فقط) | نعم — GLSL |
| شادر الهندسة | توليد هندسة جديدة من البدائيات | نعم — GLSL |
| التنقيط | تحويل البدائيات إلى أجزاء (بكسلات) | لا — ثابت |
| شادر الأجزاء | حساب لون كل جزء، التكسية، الإضاءة | نعم — GLSL |
| عمليات لكل جزء | اختبار العمق، اختبار الاستنسل، المزج، اختبار المقص | تكوين المعلمات |
المرحلة الأولى — شادر الرؤوس — تعالج كل رأس بشكل مستقل. في هذه المرحلة تُطبق التحويلات: الانتقال من الفضاء المحلي للنموذج إلى الفضاء العالمي، ثم إلى فضاء الكاميرا وأخيرًا إلى فضاء القص (clip space). التحويلات تُعرف من خلال مصفوفات MVP (Model-View-Projection) المنتظمة، والتي يتم تحديثها كل إطار عند تحريك الكاميرا أو الكائنات.
بعد تجميع البدائيات (النقاط، الخطوط، المثلثات)، يتم التنقيط — عملية تحديد بكسلات الشاشة التي تغطيها كل بدائية. المُنقِّط يولد أجزاء — بكسلات محتملة بسمات مقحمة (اللون، الطبيعية، إحداثيات UV). يعتمد عدد الأجزاء بشكل مباشر على دقة الشاشة ومساحة إسقاط البدائية.
يتم تنفيذ شادر الأجزاء لكل جزء مولَّد. يحسب اللون النهائي للبكسل مع مراعاة القوام ومصادر الضوء والمواد. يمر مخرج شادر الأجزاء عبر سلسلة من اختبارات كل جزء: يحدد اختبار العمق ما إذا كان الجزء مرئيًا؛ يقيد اختبار الاستنسل العرض حسب القناع؛ يخلط المزج لون الجزء مع اللون المكتوب بالفعل في مخزن الإطار.
يعمل OpenGL ES كـ آلة حالة: جميع الإعدادات — الشادر الحالي، القوام المرتبط، الاختبارات المفعلة — تُخزَّن في الحالة العامة للسياق. تغيير الحالة عبر glEnable أو glBindTexture أو glUseProgram يؤثر على جميع أوامر الرسم اللاحقة. كل تبديل حالة يسبب عبئًا في برنامج التشغيل، لذا فإن تجميع استدعاءات الرسم حسب الحالة هو الأسلوب الرئيسي للتحسين.
OpenGL ES 1.0 و 1.1 (الصادران في 2003–2004) كانا يعتمدان على خط أنابيب ثابت. كانا يدعمان التحويلات والتكسية والإضاءة والمزج، لكنهما لم يسمحا ببرمجة الشادرات. استُخدمت الواجهة في الهواتف المحمولة المبكرة والأجهزة القائمة على 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)، تغذية التحويل، الاستنساخ، القوام بأي تنسيق عبر ETC2/EAC. زاد أداء العرض بنسبة 30–50% مقارنة بالإصدار 2.0 من خلال تقليل عدد استدعاءات الرسم. OpenGL ES 3.1 (2014) قدم شادرات الحوسبة والعمليات الذرية مع المخازن المؤقتة — مما سمح بتنفيذ مهام ليس فقط رسومية بل وحسابية على GPU (المعالجة اللاحقة، محاكاة الأقمشة، حساب الفيزياء).
OpenGL ES 3.2 (2015) — أحدث إصدار من المواصفات — أضاف شادرات التقسيم والهندسة، بالإضافة إلى مجموعة موسعة من القوام العائم وأنماط المزج. على الرغم من إطلاق Vulkan الأكثر حداثة في 2016، يظل OpenGL ES 3.2 واجهة برمجة ذات صلة بفضل قاعدة الشفرات الضخمة الموجودة وسهولة نقل التطبيقات بين المنصات.
| الإصدار | السنة | الإمكانيات الرئيسية | التوافق (2026) |
|---|---|---|---|
| 1.x | 2003 | خط أنابيب ثابت، إضاءة، قوام | قديم |
| 2.0 | 2007 | خط أنابيب قابل للبرمجة، GLSL ES | 99% الأجهزة |
| 3.0 | 2012 | MRT، استنساخ، ETC2، تغذية التحويل | 92% الأجهزة |
| 3.1 | 2014 | شادرات حوسبة، مخازن ذرية | 80% الأجهزة |
| 3.2 | 2015 | تقسيم، شادرات هندسة | 65% الأجهزة |
GLSL ES (لغة تظليل OpenGL للأنظمة المدمجة) هي لغة برمجة شادرات مبنية على بناء جملة C مع أنواع إضافية للعمل مع المتجهات والمصفوفات. كل شادر هو برنامج يُصرَّف إلى كود آلة GPU في مرحلة تهيئة التطبيق. على عكس كود CPU، تُنفَّذ الشادرات بشكل متوازي هائل: تتم معالجة آلاف الرؤوس أو الأجزاء في وقت واحد.
شادر الرؤوس يعالج كل رأس في الشبكة. مهمته الرئيسية هي حساب الموضع النهائي للرأس في فضاء القص بضرب الموضع الداخل في مصفوفة MVP. بالإضافة إلى ذلك، يمكن لشادر الرؤوس حساب الطبيعية وإحداثيات UV والألوان وتمريرها إلى شادر الأجزاء عبر متغيرات varying. كل استدعاء لشادر الرؤوس يعمل بشكل مستقل، مما يسمح لـ GPU بمعالجة ملايين الرؤوس في الإطار.
// 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 المقحمة من شادر الرؤوس، ويأخذ عينات من التكسيل من القوام المرتبط ويطبق الإضاءة. للإضاءة الصحيحة يُستخدم نموذج فونغ أو بلين-فونغ مع حساب مكونات الانتشار والمرآة والمحيط. كل استدعاء لشادر الأجزاء يتوافق مع بكسل واحد، لذا فإن العدد الإجمالي للاستدعاءات يساوي مساحة إسقاط الكائن على الشاشة.
// 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);
}
في المثال أعلاه، يأخذ شادر الأجزاء عينة تكسيل من نسيج ثنائي الأبعاد بإحداثيات UV، ويحسب الإضاءة المنتشرة كحاصل ضرب نقطي للطبيعية واتجاه الضوء، ويضرب لون التكسيل في شدة الإضاءة. Mediump هي الدقة الموصى بها لشادرات الأجزاء على GPUs المحمولة: توفر جودة كافية باستهلاك طاقة أدنى.
للعمل مع OpenGL ES على Android، تحتاج إلى إنشاء سياق EGL — سطح سيتم عرض الرسومات عليه. على iOS، تُستخدم طبقة EAGL (المشابهة لـ EGL) المقدمة من إطار GLKit. في كلتا الحالتين، تتضمن عملية التهيئة إنشاء سطح نافذة، وتكوين سمات السياق، والربط بسلك العرض الحالي.
// 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 (كائن مصفوفة الرؤوس) يدمج تكوين جميع السمات في كائن واحد، مما يقلل عدد استدعاءات API عند تغيير الشبكات.
EGL (واجهة الرسومات الأصلية للمنصة) هي طبقة وسيطة بين OpenGL ES ونظام النوافذ. على Android، يدير EGL إنشاء سطح العرض، واختيار تكوين مخزن الإطار (عمق الألوان، الاستنسل، MSAA) والمزامنة مع vsync. طلب تكوين نموذجي هو RGBA8888 مع مخزن عمق 24 بت ومخزن استنسل 8 بت. على iOS، دور EGL يؤديه EAGL بالاشتراك مع CAEAGLLayer.
يتحسين أداء OpenGL ES على الأجهزة المحمولة يتضمن عدة ممارسات رئيسية. استخدم الاستنساخ (glDrawArraysInstanced) لعرض العديد من الكائنات المتطابقة — مما يقلل عدد استدعاءات الرسم. طبق تجمعات القوام وتجنب تبديل القوام بين استدعاءات الرسم. رتب الكائنات حسب الشادر، ثم حسب القوام، ثم حسب الشبكة — هذا الترتيب يقلل من تبديلات حالة السياق.
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) |
| مستوى API | عالي (آلة حالة) | متوسط | منخفض (صريح) |
| كود التهيئة | 50–100 سطر | 100–200 سطر | 300–500 سطر |
| التحكم في الذاكرة | تلقائي | شبه تلقائي | يدوي بالكامل |
| الأداء | أساسي | +20–40% مقارنة بـ ES | +30–60% مقارنة بـ 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 للأنظمة المدمجة) هي لغة شبيهة بـ 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. سوف نقدم لك النصح ونقترح أفضل حل.