إنشاء بيئة OpenGL ES

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

تُعد GLSurfaceView طريقة واحدة فقط لدمج رسومات OpenGL ES في التطبيق. بالنسبة إلى عرض الرسومات بملء الشاشة أو شبه الشاشة، يعد هذا اختيارًا معقولاً. يجب على المطوّرين الذين يريدون دمج رسومات OpenGL ES في جزء صغير من تنسيقاتهم مُمْكِنْ إِلْقَاءْ نَظْرَة عَلَى TextureView. بالنسبة للمطورين الحقيقيين الذين يطورونهم بأنفسهم، إنشاء عرض OpenGL ES باستخدام SurfaceView، ولكن هذا يتطلب وكتابة الكثير من التعليمات البرمجية الإضافية.

يشرح هذا الدرس كيفية إكمال عملية تنفيذ GLSurfaceView وGLSurfaceView.Renderer بطريقة بسيطة نشاط التطبيق.

يُرجى توضيح استخدام OpenGL ES في البيان.

لكي يستخدم التطبيق واجهة برمجة التطبيقات OpenGL ES 2.0 API، يجب إضافة ما يلي: بيان خاص في بيان التطبيق:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

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

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

لمزيد من المعلومات حول تنسيقات ضغط المادة، راجع دليل مطوّري برامج OpenGL.

إنشاء نشاط لرسومات OpenGL ES

تحتوي تطبيقات Android التي تستخدم OpenGL ES على أنشطة مثل أي تطبيق آخر له واجهة مستخدم. الاختلاف الرئيسي عن التطبيقات الأخرى هو ما تضعه في تخطيط الأخرى. بينما قد تستخدم في العديد من التطبيقات TextView وButton وListView، في تطبيق يستخدم OpenGL ES، يمكنك تنفيذ ما يلي: عليك أيضًا إضافة GLSurfaceView.

يوضح مثال الرمز التالي الحد الأدنى من التنفيذ لأحد الأنشطة التي تستخدم GLSurfaceView كعرضه الأساسي:

Kotlin

class OpenGLES20Activity : Activity() {

    private lateinit var gLView: GLSurfaceView

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        gLView = MyGLSurfaceView(this)
        setContentView(gLView)
    }
}

Java

public class OpenGLES20Activity extends Activity {

    private GLSurfaceView gLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        gLView = new MyGLSurfaceView(this);
        setContentView(gLView);
    }
}

ملاحظة: يتطلب OpenGL ES 2.0 Android 2.2 (مستوى واجهة برمجة التطبيقات 8) أو إصدارًا أحدث، لذا، تأكَّد من أنّ مشروعك على Android يستهدف واجهة برمجة التطبيقات (API) هذه أو أعلى.

إنشاء كائن GLSurfaceView

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

الرمز الأساسي لـ GLSurfaceView هو رمز الحدّ الأدنى، لذلك للحصول على التنفيذ، فمن الشائع ما عليك سوى إنشاء فئة داخلية في النشاط الذي تستخدمه:

Kotlin

import android.content.Context
import android.opengl.GLSurfaceView

class MyGLSurfaceView(context: Context) : GLSurfaceView(context) {

    private val renderer: MyGLRenderer

    init {

        // Create an OpenGL ES 2.0 context
        setEGLContextClientVersion(2)

        renderer = MyGLRenderer()

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(renderer)
    }
}

Java

import android.content.Context;
import android.opengl.GLSurfaceView;

class MyGLSurfaceView extends GLSurfaceView {

    private final MyGLRenderer renderer;

    public MyGLSurfaceView(Context context){
        super(context);

        // Create an OpenGL ES 2.0 context
        setEGLContextClientVersion(2);

        renderer = new MyGLRenderer();

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(renderer);
    }
}

إنّ إضافة اختيارية أخرى إلى عملية تنفيذ GLSurfaceView هي ضبط. وضع العرض لرسم طريقة العرض فقط عندما يكون هناك تغيير في بيانات الرسم باستخدام GLSurfaceView.RENDERMODE_WHEN_DIRTY الإعداد:

Kotlin

// Render the view only when there is a change in the drawing data
renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY

Java

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

يؤدي هذا الإعداد إلى منع إعادة رسم إطار GLSurfaceView حتى الاتصال بـ requestRender()، وهو أكثر كفاءة لهذا التطبيق النموذجي.

إنشاء فئة عارض

يؤدي تنفيذ فئة GLSurfaceView.Renderer، أو العارض، داخل أحد التطبيقات التي تستخدم OpenGL ES هو المكان الذي تبدأ فيه الأمور لتصبح مثيرة للاهتمام. هذا الصف عناصر التحكّم ما يتم رسمه على GLSurfaceView المرتبطة به. تتوفر ثلاث طرق في عارض يستدعي نظام Android لمعرفة طريقة الرسم على GLSurfaceView:

  • onSurfaceCreated() - تم استدعاء هذا الإجراء مرة واحدة لإعداد بيئة OpenGL ES في العرض.
  • onDrawFrame() - تم الاتصال لكل منهم إعادة رسم العرض.
  • onSurfaceChanged() - يتم الاتصال إذا يتغير الشكل الهندسي لطريقة العرض، على سبيل المثال عندما يتغير اتجاه شاشة الجهاز.

في ما يلي تنفيذ أساسي لعارض OpenGL ES الذي لا يفعل سوى رسم خلفية سوداء في GLSurfaceView:

Kotlin

import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

import android.opengl.GLES20
import android.opengl.GLSurfaceView

class MyGLRenderer : GLSurfaceView.Renderer {

    override fun onSurfaceCreated(unused: GL10, config: EGLConfig) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
    }

    override fun onDrawFrame(unused: GL10) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
    }

    override fun onSurfaceChanged(unused: GL10, width: Int, height: Int) {
        GLES20.glViewport(0, 0, width, height)
    }
}

Java

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLES20;
import android.opengl.GLSurfaceView;

public class MyGLRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }

    public void onDrawFrame(GL10 unused) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }
}

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

ملاحظة: قد تتساءل عن سبب توفُّر مَعلمة GL10 لهذه الطرق عند استخدام واجهات برمجة تطبيقات OpengGL ES 2.0. تتم إعادة استخدام توقيعات الطرق هذه ببساطة مع واجهات برمجة التطبيقات 2.0 للاحتفاظ برمز إطار العمل في Android. أكثر بساطة.

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