OpenGL ES

يتيح نظام التشغيل Android استخدام الرسومات ثنائية وثلاثية الأبعاد عالية الأداء من خلال مكتبة الرسومات المفتوحة. (OpenGL® )، وتحديدًا، OpenGL ES API. OpenGL هي واجهة برمجة تطبيقات للرسومات عبر الأنظمة الأساسية يحدد وواجهة برنامج قياسية لأجهزة معالجة الرسومات ثلاثية الأبعاد. OpenGL ES هو أحد أشكال OpenGL المواصفات المخصصة للأجهزة المضمنة. يتوافق Android مع العديد من إصدارات OpenGL ES. واجهة برمجة التطبيقات:

  • OpenGL ES 2.0 - يتوافق مع مواصفات واجهة برمجة التطبيقات هذه مع الإصدار Android 2.2 (المستوى 8 من واجهة برمجة التطبيقات) والإصدارات الأحدث.
  • OpenGL ES 3.0 - يتم دعم مواصفات واجهة برمجة التطبيقات هذه في نظام التشغيل Android 4.3 (المستوى 18 من واجهة برمجة التطبيقات) والإصدارات الأحدث.
  • OpenGL ES 3.1 - يتم دعم مواصفات واجهة برمجة التطبيقات هذه في Android 5.0 (مستوى واجهة برمجة التطبيقات 21) والإصدارات الأحدث.
  • OpenGL ES 3.2 - يتوافق مع مواصفات واجهة برمجة التطبيقات هذه مع الإصدار Android 7.0 (مستوى واجهة برمجة التطبيقات 24) والإصدارات الأحدث.

تنبيه: بغض النظر عن إصدار نظام Android الأساسي، لا يمكن أن يتوافق الجهاز مع واجهة برمجة التطبيقات OpenGL ES 3.0 ما لم توفر الشركة المصنعة تنفيذ مسار الرسومات هذا. إذا حددت في البيان أن يجب توفُّر OpenGL ES 3.0، لذا يمكنك التأكُّد من توفُّر هذا الإصدار على الجهاز. إذا حددت أن الإصدار الأدنى مطلوب ولكن يمكنك تريد استخدام ميزات 3.0 إذا كانت متاحة، فيجب عليك التحقق في وقت التشغيل لمعرفة إصدار OpenGL الذي يتوافق معه الجهاز. للحصول على معلومات حول كيفية لإجراء ذلك، راجِع التحقُّق من إصدار OpenGL ES.

ملاحظة: يتيح Android استخدام OpenGL ES 1.0 و1.1، ولكن هذه الإصدارات من واجهة برمجة التطبيقات تم إيقافها نهائيًا، وبالتالي يجب ألا تستخدمها التطبيقات الحديثة.

ملاحظة: تشبه واجهة برمجة التطبيقات المحددة التي يوفرها إطار عمل Android واجهة برمجة التطبيقات J2ME JSR239 OpenGL ES API، لكنها ليست متطابقة. إذا كنت على دراية بمواصفات J2ME JSR239، احذر من المختلفة.

راجع أيضًا

الأساسيات

يدعم Android OpenGL من خلال كل من واجهة برمجة التطبيقات الخاصة بإطار العمل والتطوير الأصلي Kit (NDK). يركّز هذا الموضوع على واجهات إطار عمل Android. لمزيد من المعلومات عن NDK، راجع Android NDK.

هناك فئتان أساسيتان في إطار عمل Android تتيحان لك إنشاء المحتوى ومعالجتها الرسومات باستخدام OpenGL ES API: GLSurfaceView و GLSurfaceView.Renderer إذا كان هدفك هو استخدام OpenGL في تطبيق Android، فهم كيفية تنفيذ هذه الفئات في نشاط ما يجب أن يكون هدفك الأول.

GLSurfaceView
هذه الفئة هي View حيث يمكنك رسم العناصر ومعالجتها باستخدام تطلب واجهة برمجة التطبيقات OpenGL وهي تشبه في وظيفتها SurfaceView. يمكنك استخدام هذا الصف عن طريق إنشاء مثيل لـ GLSurfaceView وإضافة Renderer إليها. ومع ذلك، إذا كنت تريد الحصول على أحداث الشاشة التي تعمل باللمس، عليك تمديد فئة GLSurfaceView وتنفيذ أدوات معالجة اللمس، كما هو موضح في درس تدريب OpenGL، الاستجابة لأحداث اللمس
GLSurfaceView.Renderer
تحدّد هذه الواجهة الطرق المطلوبة لرسم الرسومات في GLSurfaceView. يجب تقديم تنفيذ لهذه الواجهة كـ فصل الصف وإرفاقه بالمثيل GLSurfaceView باستخدام GLSurfaceView.setRenderer()

تشترط واجهة GLSurfaceView.Renderer تنفيذ الطرق التالية:

  • onSurfaceCreated(): يستدعي النظام هذا مرة واحدة، عند إنشاء GLSurfaceView. استخدِم هذه الطريقة لإجراء الإجراءات التي ينبغي أن تحدث مرة واحدة فقط، مثل تعيين معلمات بيئة OpenGL أو تهيئة كائنات رسوم OpenGL.
  • onDrawFrame(): يستدعي النظام هذه الطريقة عند كل عملية إعادة رسم من GLSurfaceView. استخدم هذه الطريقة كنقطة تنفيذ أساسية رسم (وإعادة رسم) الكائنات الرسومية.
  • onSurfaceChanged(): يطلب النظام هذه الطريقة عند تغيُّر الشكل الهندسي لـ GLSurfaceView، بما في ذلك التغييرات في حجم GLSurfaceView أو اتجاه شاشة الجهاز. على سبيل المثال، يطلب النظام هذه الطريقة عندما يتغير الجهاز من الاتجاه العمودي إلى الاتجاه الأفقي. استخدِم هذه الطريقة الاستجابة للتغييرات في حاوية GLSurfaceView.

حزم OpenGL ES

بعد إنشاء عرض حاوية لبرنامج OpenGL ES باستخدام GLSurfaceView وGLSurfaceView.Renderer، يمكنك البدء استدعاء واجهات برمجة تطبيقات OpenGL باستخدام الفئات التالية:

  • فئة واجهة برمجة التطبيقات OpenGL ES 2.0
    • android.opengl.GLES20 - توفر هذه الحزمة إلى OpenGL ES 2.0 ومتاحة بدءًا من Android 2.2 (مستوى واجهة برمجة التطبيقات 8).
  • حزم واجهة برمجة التطبيقات OpenGL ES 3.0/3.1/3.2
    • android.opengl - توفر هذه الحزمة الواجهة لبرنامج OpenGL ES 3.0/3.1 الصفوف. يتوفّر الإصدار 3.0 بدءًا من Android 4.3 (المستوى 18 من واجهة برمجة التطبيقات). الإصدار 3.1 متاح بدءًا من Android 5.0 (مستوى واجهة برمجة التطبيقات 21). يتوفّر الإصدار 3.2 بدءًا من الإصدار Android 7.0 (واجهة برمجة التطبيقات). المستوى 24).

إذا كنت تريد البدء في إنشاء تطبيق باستخدام OpenGL ES على الفور، اتبع التعليمات التالية: عرض الرسومات باستخدام OpenGL ES الصف.

الإعلان عن متطلبات OpenGL

إذا كان تطبيقك يستخدم ميزات OpenGL غير المتاحة على جميع الأجهزة، يجب تضمين هذه المتطلبات في ملف AndroidManifest.xml الملف. في ما يلي أكثر تعريفات بيان OpenGL شيوعًا:

  • متطلبات إصدار OpenGL ES: إذا كان تطبيقك يتطلب مجموعة إصدار OpenGL ES، يجب توضيح هذا الشرط من خلال إضافة الإعدادات التالية إلى ملف البيان كما هو موضح أدناه.

    لبرنامج OpenGL ES 2.0:

    <!-- Tell the system this app requires OpenGL ES 2.0. -->
    <uses-feature android:glEsVersion="0x00020000" android:required="true" />
    

    تؤدي إضافة هذا البيان إلى حظر Google Play من حظر تطبيقك مثبتة على الأجهزة التي لا تدعم OpenGL ES 2.0. إذا كان طلبك حصريًا الأجهزة التي تتوافق مع OpenGL ES 3.0، يمكنك أيضًا تحديد ذلك في ملف البيان:

    لبرنامج OpenGL ES 3.0:

    <!-- Tell the system this app requires OpenGL ES 3.0. -->
    <uses-feature android:glEsVersion="0x00030000" android:required="true" />
    

    لبرنامج OpenGL ES 3.1:

    <!-- Tell the system this app requires OpenGL ES 3.1. -->
    <uses-feature android:glEsVersion="0x00030001" android:required="true" />
    

    لبرنامج OpenGL ES 3.2:

    <!-- Tell the system this app requires OpenGL ES 3.2. -->
    <uses-feature android:glEsVersion="0x00030002" android:required="true" />
    

    ملاحظة: تتوافق واجهة برمجة التطبيقات OpenGL ES 3.x مع الإصدارات القديمة من واجهة برمجة التطبيقات 2.0، ما يعني أنّه يمكنكم الاستفادة من بالمرونة في تنفيذ OpenGL ES في تطبيقك. عن طريق الإعلان عن برنامج OpenGL ES 2.0 API كمتطلبات في البيان، ويمكنك استخدام إصدار واجهة برمجة التطبيقات كإعداد تلقائي عن مدى توفُّر واجهة برمجة التطبيقات 3.x في وقت التشغيل، ثم استخدام ميزات OpenGL ES 3.x إذا كانت الجهاز يدعم ذلك. لمزيد من المعلومات حول التحقق من إصدار OpenGL ES المدعوم من يُرجى الاطِّلاع على التحقُّق من إصدار OpenGL ES.

  • متطلبات ضغط الهيئة - إذا كان التطبيق يستخدم الزخرفة يجب أن تذكر التنسيقات التي يتوافق معها تطبيقك في ملف البيان. باستخدام <supports-gl-texture>. لمزيد من المعلومات حول ميزة ضغط الهيئة المتاحة يُرجى الاطّلاع على دعم ضغط الهيئة.

    يؤدي تحديد متطلبات ضغط البنية في ملف البيان إلى إخفاء تطبيقك عن المستخدمين. باستخدام أجهزة لا تتوافق مع نوع واحد على الأقل من أنواع الضغط التي أفصحتَ عنها في البيان. لمزيد من المعلومات، معلومات حول طريقة عمل فلترة Google Play لضغطات القوام، راجِع قسم Google Play وفلترة ضغط البنية ضِمن مستندات <supports-gl-texture>

تعيين إحداثيات العناصر المرسومة

إحدى المشكلات الأساسية في عرض الرسومات على أجهزة Android هي أن شاشاتهم يمكن أن تختلف في الحجم والشكل. يفترض OpenGL نظامًا إحداثيًا مربعًا وموحَّدًا، وبشكلٍ افتراضي، ترسم هذه الإحداثيات على شاشتك غير المربعة عادةً كما لو كانت مربعة تمامًا.

الشكل 1. تم تعيين نظام إحداثي OpenGL الافتراضي (اليسار) إلى Android نموذجي شاشة الجهاز (اليمنى).

توضح الرسوم التوضيحية أعلاه نظام الإحداثيات الموحدة المفترَض لإطار OpenGL على اليسار، وكيف يتم تعيين هذه الإحداثيات بالفعل لشاشة جهاز نموذجية في الاتجاه الأفقي على اليمين. لحل هذه المشكلة، يمكنك تطبيق أوضاع عرض OpenGL وطرق عرض الكاميرا على وتحويل الإحداثيات بحيث يكون للكائنات الرسومية النسب الصحيحة على أي شاشة.

لتطبيق طرق عرض العرض والكاميرا، يمكنك إنشاء مصفوفة عرض وعرض للكاميرا المصفوفة وتطبقها على مسار عرض OpenGL. ستعيد مصفوفة الإسقاط حساب إحداثيات الرسومات الخاصة بك بحيث يتم تعيينها بشكل صحيح مع شاشات جهاز Android. شاشة الكاميرا تنشئ مصفوفة تحويلًا يُظهر الكائنات من موضع معين للعين.

العرض وعرض الكاميرا في OpenGL ES 2.0 والإصدارات الأحدث

في واجهتَي برمجة التطبيقات ES 2.0 و3.0، يمكنك تطبيق العرض وعرض الكاميرا من خلال إضافة عضو مصفوفة أولاً. إلى أدوات تظليل الرؤوس لكائنات الرسومات. وبإضافة عضو المصفوفة هذا، يمكنك إنشاء مصفوفات الإسقاط وعرض الكاميرا وتطبيقها على الكائنات.

  1. إضافة مصفوفة إلى أدوات تظليل رأسي - إنشاء متغير لمصفوفة إسقاط طريقة العرض وإدراجه كمضاعف لموضع أداة التظليل. في المثال التالي لأداة تظليل رأس الصفحة الرمز، فإن عضو uMVPMatrix المُدرج يتيح لك إمكانية عرض شاشة الكاميرا والعرض والمصفوفات إلى إحداثيات الكائنات التي تستخدم أداة التظليل هذه.

    Kotlin

    private val vertexShaderCode =
    
        // This matrix member variable provides a hook to manipulate
        // the coordinates of objects that use this vertex shader.
        "uniform mat4 uMVPMatrix;   \n" +
    
        "attribute vec4 vPosition;  \n" +
        "void main(){               \n" +
        // The matrix must be included as part of gl_Position
        // Note that the uMVPMatrix factor *must be first* in order
        // for the matrix multiplication product to be correct.
        " gl_Position = uMVPMatrix * vPosition; \n" +
    
        "}  \n"
    

    Java

    private final String vertexShaderCode =
    
        // This matrix member variable provides a hook to manipulate
        // the coordinates of objects that use this vertex shader.
        "uniform mat4 uMVPMatrix;   \n" +
    
        "attribute vec4 vPosition;  \n" +
        "void main(){               \n" +
        // The matrix must be included as part of gl_Position
        // Note that the uMVPMatrix factor *must be first* in order
        // for the matrix multiplication product to be correct.
        " gl_Position = uMVPMatrix * vPosition; \n" +
    
        "}  \n";
    

    ملاحظة: يوضّح المثال أعلاه مصفوفة تحويل واحدة. في أداة تظليل الرأس الذي تطبِّق عليه مصفوفة عرض مجمّعة وعرض الكاميرا ومصفوفة. استنادًا إلى متطلبات التطبيق، قد تحتاج إلى تحديد توقعات منفصلة أعضاء مصفوفة عرض الكاميرا والمصفوفة في أدوات تظليل رأسك كي تتمكّن من تغييرها كل على حدة.

  2. الوصول إلى مصفوفة أدوات التظليل: بعد إنشاء عنصر جذب في أدوات تظليل الرأس، العرض وطريقة عرض الكاميرا، يمكنك بعد ذلك الوصول إلى هذا المتغير لتطبيق الإسقاط مصفوفات عرض الكاميرا. يوضح الرمز التالي كيفية تعديل طريقة onSurfaceCreated() لتنفيذ GLSurfaceView.Renderer للوصول إلى المصفوفة المتغير المحدد في أداة تظليل الرأس أعلاه.

    Kotlin

    override fun onSurfaceCreated(gl: GL10, config: EGLConfig) {
        ...
        muMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix")
        ...
    }
    

    Java

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        ...
        muMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
        ...
    }
    
  3. إنشاء مصفوفات للعرض والكاميرا - إنشاء مصفوفات العرض عرض المصفوفات لتطبيق الكائنات الرسومية عليها. يعرض الرمز في المثال التالي كيفية تعديل onSurfaceCreated() onSurfaceChanged() طريقة لإجراء تنفيذ GLSurfaceView.Renderer لإنشاء مصفوفة مشاهدة الكاميرا مصفوفة عرض بناءً على نسبة عرض إلى ارتفاع شاشة الجهاز.

    Kotlin

    override fun onSurfaceCreated(gl: GL10, config: EGLConfig) {
        ...
        // Create a camera view matrix
        Matrix.setLookAtM(vMatrix, 0, 0f, 0f, -3f, 0f, 0f, 0f, 0f, 1.0f, 0.0f)
    }
    
    override fun onSurfaceChanged(gl: GL10, width: Int, height: Int) {
        GLES20.glViewport(0, 0, width, height)
    
        val ratio: Float = width.toFloat() / height.toFloat()
    
        // create a projection matrix from device screen geometry
        Matrix.frustumM(projMatrix, 0, -ratio, ratio, -1f, 1f, 3f, 7f)
    }
    

    Java

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        ...
        // Create a camera view matrix
        Matrix.setLookAtM(vMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    }
    
    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    
        float ratio = (float) width / height;
    
        // create a projection matrix from device screen geometry
        Matrix.frustumM(projMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
    }
    
  4. تطبيق مصفوفات العرض والكاميرا - لتطبيق الإسقاط ثم اضرب المصفوفات معًا ثم ضعها في رأسي أداة تظليل. يعرض الرمز في المثال التالي كيفية تعديل طريقة onDrawFrame() لتنفيذ GLSurfaceView.Renderer من أجل دمج مصفوفة العرض وعرض الكاميرا التي تم إنشاؤها في الرمز البرمجي أعلاه ثم تطبيقها على الرسم الكائنات المراد عرضها بواسطة OpenGL.

    Kotlin

    override fun onDrawFrame(gl: GL10) {
        ...
        // Combine the projection and camera view matrices
        Matrix.multiplyMM(vPMatrix, 0, projMatrix, 0, vMatrix, 0)
    
        // Apply the combined projection and camera view transformations
        GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, vPMatrix, 0)
    
        // Draw objects
        ...
    }
    

    Java

    public void onDrawFrame(GL10 unused) {
        ...
        // Combine the projection and camera view matrices
        Matrix.multiplyMM(vPMatrix, 0, projMatrix, 0, vMatrix, 0);
    
        // Apply the combined projection and camera view transformations
        GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, vPMatrix, 0);
    
        // Draw objects
        ...
    }
    

للحصول على مثال كامل لكيفية تطبيق العرض وعرض الكاميرا باستخدام OpenGL ES 2.0، يمكنك الاطّلاع على مقالة عرض الرسومات باستخدام OpenGL ES. الصف.

تشكيل الوجوه بطريقة متعرّجة

في OpenGL، يكون وجه الشكل عبارة عن سطح محدد بثلاث نقاط أو أكثر في شكل ثلاثي الأبعاد مساحة. مجموعة من ثلاث نقاط ثلاثية الأبعاد أو أكثر (تسمى الرؤوس في OpenGL) لها واجهة أمامية ووجه خلفي. كيف تعرف الوجه الأمامي وأي الوجه الخلفي؟ هذا سؤال وجيه. تشير رسالة الأشكال البيانية الإجابة متعلقة بالاتجاه الدائري أو الاتجاه الذي تحدد به نقاط الشكل.

الإحداثيات في
رؤوس المثلّث

الشكل 1. رسم توضيحي لقائمة إحداثيات تُترجم إلى ترتيب رسم عكس عقارب الساعة.

في هذا المثال، يتم تحديد نقاط المثلث بالترتيب بحيث يتم رسمها عكس اتجاه عقارب الساعة. يُحدد ترتيب رسم هذه الإحداثيات الاتجاه المتعرج اتجاه الشكل. بشكل افتراضي، في OpenGL، الوجه الذي يتم رسمه عكس اتجاه عقارب الساعة هو الوجه الأمامي. المثلث الموضح في الشكل 1 محدد بحيث تنظر إلى الوجه الأمامي الشكل (كما يفسر بواسطة OpenGL) والجانب الآخر هو الوجه الخلفي.

لماذا من المهم معرفة أي وجه شكل هو الوجه الأمامي؟ تتعلق الإجابة وهي ميزة شائعة الاستخدام في OpenGL، تسمى اختفاء الوجه. اختيار الوجه هو خيار لبرنامج OpenGL تسمح لمسار العرض بتجاهل (وليس حساب أو رسم) الواجهة الخلفية الشكل، وتوفير الوقت، والذاكرة ودورات المعالجة:

Kotlin

gl.apply {
    // enable face culling feature
    glEnable(GL10.GL_CULL_FACE)
    // specify which faces to not draw
    glCullFace(GL10.GL_BACK)
}

Java

// enable face culling feature
gl.glEnable(GL10.GL_CULL_FACE);
// specify which faces to not draw
gl.glCullFace(GL10.GL_BACK);

إذا حاولت استخدام ميزة انتقاء الوجوه دون معرفة جوانب أشكالك ستبدو رسومات OpenGL الخاصة بك قليلاً جدًا، أو ربما لا تظهر على الإطلاق. لذا، عليك دائمًا تحديد إحداثيات أشكال OpenGL بترتيب رسم عكس عقارب الساعة.

ملاحظة: من الممكن ضبط بيئة OpenGL لمعالجة استخدام الوجه باتجاه عقارب الساعة كالجهة الأمامية، لكن إجراء ذلك يتطلب مزيدًا من الرموز ومن المحتمل أن يؤدي إلى إرباك بمطوّري برامج OpenGL ذوي الخبرة عندما تطلب منهم المساعدة. لذا لا تفعل ذلك.

إصدارات OpenGL وتوافق الأجهزة

تتوفّر مواصفات واجهة برمجة التطبيقات OpenGL ES 1.0 و1.1 منذ نظام التشغيل Android 1.0. تختلف برمجة الرسومات باستخدام واجهة برمجة التطبيقات OpenGL ES 1.0/1.1 بشكل كبير عن استخدام الإصدار 2.0 والإصدارات الأحدث. يتوافق OpenGL ES 2.0 مع جميع أجهزة Android التي تبدأ بالإصدار Android 2.2 (المستوى 8 من واجهة برمجة التطبيقات)، هو الإصدار الأقدم الموصى به للتطبيقات الجديدة التي يتم تطويرها باستخدام OpenGL ES. يتوافق OpenGL ES 3.0 مع نظام التشغيل Android 4.3 (المستوى 18 لواجهة برمجة التطبيقات) والإصدارات الأحدث، على الأجهزة التي توفر تنفيذ واجهة برمجة التطبيقات OpenGL ES 3.0 API. للاطّلاع على معلومات حول العدد النسبي للأجهزة التي تعمل بنظام التشغيل Android التي تدعم إصدارًا معيّنًا من OpenGL ES، راجع لوحة بيانات إصدار OpenGL ES.

يجب التفكير بعناية في متطلبات الرسومات واختيار واجهة برمجة التطبيقات الإصدار الأنسب لتطبيقك. لمزيد من المعلومات، يُرجى مراجعة اختيار إصدار واجهة برمجة تطبيقات OpenGL

توفّر واجهة برمجة التطبيقات OpenGL ES 3.0 ميزات إضافية وأداء أفضل من واجهة برمجة التطبيقات 2.0 وهي متوافقة أيضًا مع الأنظمة القديمة وهذا يعني أنه يمكنك كتابة استهداف التطبيقات يتضمن OpenGL ES 2.0 بشكل مشروط ميزات رسومات OpenGL ES 3.0 إذا كانت متاحة. بالنسبة لمعرفة مزيد من المعلومات حول التحقق من توفر الإصدار 3.0 من واجهة برمجة التطبيقات، راجع التحقّق من إصدار OpenGL ES

دعم ضغط الهيئة

يمكن أن يؤدي ضغط الهيئة إلى زيادة أداء تطبيق OpenGL بشكل كبير من خلال تقليل متطلبات الذاكرة والاستفادة بشكل أكثر كفاءة من معدل نقل البيانات للذاكرة. نظام التشغيل Android يتيح استخدام تنسيق ETC1 كميزة قياسية، بما في ذلك فئة الأداة ETC1Util وأداة الضغط etc1tool (الموجودة في حزمة تطوير البرامج (SDK) لنظام التشغيل Android على <sdk>/tools/). للحصول على مثال لأحد تطبيقات Android التي تستخدم ضغط بنية الصورة، يُرجى الاطّلاع على نموذج الرمز البرمجي CompressedTextureActivity في حزمة تطوير البرامج (SDK) لنظام التشغيل Android. (<sdk>/samples/<version>/ApiDemos/src/com/example/android/apis/graphics/).

يتوافق تنسيق ETC1 مع جميع أجهزة Android التي تتوافق مع OpenGL ES 2.0 أو الإصدارات الأحدث.

ملاحظة: لا يتوافق تنسيق ضغط البنية ETC1 مع الزخارف التي تحتوي على الشفافية (قناة ألفا). إذا كان التطبيق يتطلب زخارف بشفافية، فيجب يمكنك التحقق من تنسيقات ضغط البنية الأخرى المتاحة على الأجهزة المستهدفة. حاسمة لعرض زخارف قناة ألفا باستخدام ETC1، وهي ربط كائنين زخرفة لـ ETC1: أولًا ببيانات الألوان، والثانية ببيانات قناة ألفا، ثم ندمج القيم من الاثنين والزخارف في تظليل الأجزاء.

نضمن توفّر تنسيقات ضغط البنية ETC2/EAC عند استخدام OpenGL ES. 3.0 واجهة برمجة التطبيقات. يوفر تنسيق الزخرفة هذا نسب ضغط ممتازة مع جودة مرئية عالية يدعم التنسيق أيضًا الشفافية (قناة ألفا).

بالإضافة إلى تنسيقات ETC، توافق أجهزة Android مع مجموعة متنوعة من ضغطات البنية استنادًا إلى شرائح GPU وتطبيقات OpenGL. يجب التحقق من دعم ضغط البنية على الأجهزة التي تستهدفها لتحديد أنواع الضغط التي يجب أن يستخدمها تطبيقك والدعم. لتحديد تنسيقات الزخرفة المتوافقة مع جهاز معين، يجب إجراء طلب بحث عن الجهاز ومراجعة أسماء إضافات OpenGL، التي تحدد تنسيقات ضغط الطبقة (وميزات OpenGL الأخرى) المتوافقة مع الخاص بك. في ما يلي بعض تنسيقات ضغط البنية الشائعة الاستخدام:

  • ضغط الهيئة القابل للتكيّف والقابل للتطوير (ASTC) - تنسيق ضغط القوام وتحل محل التنسيقات السابقة. أكثر مرونة من التنسيقات السابقة بفضل توافقها مع العديد من التنسيقات أحجام الكتل.
    • GL_KHR_texture_compression_astc_ldr
    • GL_KHR_texture_compression_astc_hdr(النطاق الديناميكي العالي)
  • S3TC (DXTn/DXTC) - لدى ضغط بنية S3 (S3TC) عدة خيارات من الأشكال المختلفة (من DXT1 إلى DXT5) وهو أقل شيوعًا. يدعم التنسيق زخارف RGB مع قنوات ألفا ذات 4 بت أو 8 بت. يتم تمثيل هذه التنسيقات من خلال إضافة OpenGL التالية الاسم:
    • GL_EXT_texture_compression_s3tc
    ولا تتوافق بعض الأجهزة إلا مع صيغة DXT1. يتم تمثيل هذا الدعم المحدود من خلال اسم إضافة OpenGL التالي:
    • GL_EXT_texture_compression_dxt1

تُعدّ تنسيقات ضغط البنية التالية تنسيقات قديمة ولا يُنصح باستخدامها. للاستخدام في التطبيقات الجديدة:

  • ATITC (ATC) - يتوفر ضغط بنية ATI (ATITC أو ATC) على مجموعة كبيرة من الأجهزة ويدعم ضغط المعدل الثابت لزخرفات النموذج اللوني أحمر أخضر أزرق (RGB) مع أو بدون قناة ألفا. ويمكن تمثيل هذا التنسيق بعدة أسماء إضافات OpenGL، على سبيل المثال:
    • GL_AMD_compressed_ATC_texture
    • GL_ATI_texture_compression_atitc
  • PVRTC - يتوفر ضغط بنية PowerVR (PVRTC) على نطاق واسع مجموعة متنوعة من الأجهزة ويدعم زخارف 2 بت و4 بت لكل بكسل مع قناة ألفا أو بدونها. يتم تمثيل هذا التنسيق باسم إضافة OpenGL التالي:
    • GL_IMG_texture_compression_pvrtc
  • 3DC - يُعد ضغط بنية 3DC (3DC) تنسيقًا أقل توفرًا على نطاق واسع ويتوافق مع زخارف النموذج اللوني RGB مع قناة ألفا. يتم تمثيل هذا التنسيق بواسطة OpenGL التالي اسم الإضافة:
    • GL_AMD_compressed_3DC_texture

تحذير: تنسيقات ضغط البنية هذه ليست متاحة على جميع الأجهزة. يمكن أن يختلف التوافق مع هذه التنسيقات حسب الشركة المصنّعة والجهاز. بالنسبة لمزيد من المعلومات حول كيفية تحديد تنسيقات ضغط السطح على جهاز معين، راجع القسم التالي.

ملاحظة: بعد تحديد تنسيقات ضغط البنية التي متوفّرة، فاحرص على الإفصاح عنها في البيان باستخدام <supports-gl-texture> . يؤدي استخدام هذا البيان إلى تفعيل الفلترة حسب الخدمات الخارجية مثل Google Play، بحيث عدم تثبيت تطبيقك إلا على الأجهزة التي تتيح التنسيقات التي يتطلبها تطبيقك. للحصول على التفاصيل، يمكنك مراجعة تعريفات بيان OpenGL.

تحديد إضافات OpenGL

تختلف عمليات تنفيذ OpenGL حسب جهاز Android في ما يتعلّق بإضافات واجهة برمجة التطبيقات OpenGL ES API. المتاحة. تتضمن هذه الإضافات ضغطات القوام، ولكنها عادةً ما تتضمن أيضًا إضافات أخرى الإضافات إلى مجموعة ميزات OpenGL.

لتحديد تنسيقات ضغط البنية وإضافات OpenGL الأخرى، يتم دعم جهاز معين:

  1. شغِّل الرمز التالي على الأجهزة المستهدَفة لتحديد نوع ضغط البنية. التنسيقات المتوافقة:

    Kotlin

    var extensions = gl.glGetString(GL10.GL_EXTENSIONS)
    

    Java

    String extensions = gl.glGetString(GL10.GL_EXTENSIONS);
    

    تحذير: تختلف نتائج هذه المكالمة حسب طراز الجهاز. إِنْتَ يجب تشغيل هذا الاستدعاء على العديد من الأجهزة المستهدفة لتحديد أنواع الضغط الشائعة

  2. راجِع نتائج هذه الطريقة لتحديد إضافات OpenGL المتوافقة مع الخاص بك.

حزمة إضافات Android (AEP)

يضمن بروتوكول AEP أن تطبيقك يتوافق مع مجموعة موحدة من إضافات OpenGL المذكورة أعلاه. وأكثر المجموعة الأساسية الموضحة في مواصفات OpenGL 3.1. تجميع هذه الإضافات معًا مجموعة متسقة من الوظائف عبر الأجهزة، مع السماح لمطوّري البرامج بالاستفادة من للاستفادة من أحدث إصدار من أجهزة GPU للأجهزة الجوّالة.

تعمل أداة AEP أيضًا على تحسين التوافق مع الصور ومخزن التخزين المؤقت لأدوات التظليل والعدادات الذرية في أدوات تظليل الأجزاء.

ليتمكّن تطبيقك من استخدام AEP، يجب أن يذكر بيان التطبيق أنّ بروتوكول AEP مطلوب. بالإضافة إلى ذلك، يجب أن يكون إصدار النظام الأساسي متوافقًا مع هذه الميزة.

جميع الميزات الإضافية المحدّدة في AEP مضمّنة في الإصدار الأساسي OpenGL ES 3.2. المواصفات. إذا كان تطبيقك يتطلب OpenGL ES 3.2، لن تحتاج إلى طلب AEP.

يُرجى تعريف متطلبات AEP في البيان على النحو التالي:

<uses-feature android:name="android.hardware.opengles.aep"
              android:required="true" />

للتحقّق من أنّ إصدار النظام الأساسي يتوافق مع AEP، استخدِم طريقة واحدة (hasSystemFeature(String)) تؤدي إلى الدوران FEATURE_OPENGLES_EXTENSION_PACK كوسيطة. مقتطف الرمز التالي مثالاً على كيفية القيام بذلك:

Kotlin

var deviceSupportsAEP: Boolean =
        packageManager.hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)

Java

boolean deviceSupportsAEP = getPackageManager().hasSystemFeature
     (PackageManager.FEATURE_OPENGLES_EXTENSION_PACK);

إذا أرجعت الطريقة القيمة "true"، سيتم دعم AEP.

لمزيد من المعلومات حول AEP، يُرجى زيارة صفحتها على سجل Khronos OpenGL ES Registry.

جارٍ التحقّق من إصدار OpenGL ES

تتوفر العديد من إصدارات OpenGL ES على أجهزة Android. يمكنك تحديد الحد الأدنى لإصدار واجهة برمجة التطبيقات التي يتطلبها تطبيقك في بيانك، ولكن قد تحتاج أيضًا إلى الاستفادة من الميزات المتوفرة في واجهة برمجة تطبيقات أحدث في الوقت نفسه. على سبيل المثال: تتوافق واجهة برمجة التطبيقات OpenGL ES 3.0 مع الإصدارات القديمة من واجهة برمجة التطبيقات (2.0)، لذا ننصحك كتابة تطبيقك بحيث يستخدم ميزات OpenGL ES 3.0، ولكن يتم الرجوع إلى واجهة برمجة التطبيقات 2.0 إذا كانت الإصدار 3.0 من واجهة برمجة التطبيقات غير متاح.

قبل استخدام ميزات OpenGL ES من إصدار أعلى من الحد الأدنى المطلوب في التطبيق، يجب أن يتحقق تطبيقك من إصدار واجهة برمجة التطبيقات المتاحة على الجهاز. يمكنك القيام بذلك بإحدى الطريقتين:

  1. حاوِل إنشاء سياق OpenGL ES ذو المستوى الأعلى (EGLContext) و تحقق من النتيجة.
  2. أنشِئ سياق OpenGL ES متوافق مع الحد الأدنى وتحقَّق من قيمة الإصدار.

يوضح المثال التالي كيفية التحقق من إصدار OpenGL ES المتاح من خلال إنشاء EGLContext والتحقق من النتيجة. يوضح هذا المثال كيفية التحقق من إصدار OpenGL ES 3.0:

Kotlin

private const val EGL_CONTEXT_CLIENT_VERSION = 0x3098
private const val glVersion = 3.0
private class ContextFactory : GLSurfaceView.EGLContextFactory {

    override fun createContext(egl: EGL10, display: EGLDisplay, eglConfig: EGLConfig): EGLContext {

        Log.w(TAG, "creating OpenGL ES $glVersion context")
        return egl.eglCreateContext(
                display,
                eglConfig,
                EGL10.EGL_NO_CONTEXT,
                intArrayOf(EGL_CONTEXT_CLIENT_VERSION, glVersion.toInt(), EGL10.EGL_NONE)
        ) // returns null if 3.0 is not supported
    }
}

Java

private static double glVersion = 3.0;

private static class ContextFactory implements GLSurfaceView.EGLContextFactory {

  private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;

  public EGLContext createContext(
          EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {

      Log.w(TAG, "creating OpenGL ES " + glVersion + " context");
      int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, (int) glVersion,
              EGL10.EGL_NONE };
      // attempt to create a OpenGL ES 3.0 context
      EGLContext context = egl.eglCreateContext(
              display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
      return context; // returns null if 3.0 is not supported;
  }
}

إذا عرضت الطريقة createContext() أعلاه قيمة فارغة، فيجب أن ينشئ الرمز برنامج OpenGL ES 2.0 ، بدلاً من ذلك، ونعود إلى استخدام واجهة برمجة التطبيقات هذه فقط.

يوضح مثال الرمز التالي كيفية التحقق من إصدار OpenGL ES من خلال إنشاء حد أدنى السياق المتوافق أولاً، ثم التحقق من سلسلة الإصدار:

Kotlin

// Create a minimum supported OpenGL ES context, then check:
gl.glGetString(GL10.GL_VERSION).also {
    Log.w(TAG, "Version: $it")
}
 // The version format is displayed as: "OpenGL ES <major>.<minor>"
 // followed by optional content provided by the implementation.

Java

// Create a minimum supported OpenGL ES context, then check:
String version = gl.glGetString(GL10.GL_VERSION);
Log.w(TAG, "Version: " + version );
// The version format is displayed as: "OpenGL ES <major>.<minor>"
// followed by optional content provided by the implementation.

بهذه الطريقة، إذا اكتشفت أنّ الجهاز يتوافق مع إصدار ذي مستوى أعلى من واجهة برمجة التطبيقات، عليك تدمير الحد الأدنى لسياق OpenGL ES وإنشاء سياق جديد الإصدار المتوفر من واجهة برمجة التطبيقات.

اختيار إصدار واجهة برمجة تطبيقات OpenGL

يوفّر كل من الإصدار 2.0 والإصدار 3.0 من OpenGL ES واجهات رسومات الأداء لإنشاء ألعاب ثلاثية الأبعاد ومؤثرات عرض وواجهات مستخدم. الرسومات تعتبر برامج OpenGL ES 2.0 و3.0 متشابهة إلى حد كبير، ويمثل الإصدار 3.0 مجموعة رئيسية للإصدار 2.0 من واجهة برمجة التطبيقات مع ميزات إضافية. برمجة واجهة برمجة التطبيقات OpenGL ES 1.0/1.1 مقابل OpenGL ES تختلف 2.0 و3.0 إلى حد كبير، ولا يوصى بها للتطبيقات الجديدة. على المطوّرين مراعاة العوامل التالية بعناية قبل بدء التطوير واجهات برمجة التطبيقات التالية:

  • التوافق مع الأجهزة: على مطوّري البرامج مراعاة أنواع الأجهزة تتوفّر إصدارات Android وإصدارات OpenGL ES للعملاء. لمزيد من المعلومات حول توافق OpenGL عبر الأجهزة، راجع إصدارات OpenGL توافق الجهاز.
  • دعم الزخرفة - تقدم واجهة برمجة التطبيقات OpenGL ES 3.0 أفضل توافق مع الهيئة لأنّه يضمن توفّر تنسيق الضغط ETC2 الذي يتيح والشفافية. في المقابل، تتيح عمليات تنفيذ واجهة برمجة التطبيقات الإصدار 2.0 استخدام ETC1. تنسيق الهيئة هذا لا يتيح الشفافية. لتنفيذ الشفافية باستخدام الملفات المضغوطة يجب استخدام زخارف ETC1 (التقسيم بين اللون وألفا) أو توفير موارد بتنسيقات ضغط أخرى متوافقة مع الأجهزة التي تستهدفها. لمزيد من المعلومات راجِع دعم ضغط الهيئة.

وعلى الرغم من أن التوافق والزخرفة قد يؤثران في فيجب عليك اختيار إصدار OpenGL API بناءً على ما تعتقد أنه يوفر أفضل تجربة للمستخدمين.