OpenGL ES এনভায়রনমেন্ট তৈরি করা

আপনার Android অ্যাপ্লিকেশনে OpenGL ES-এর সাহায্যে গ্রাফিক্স আঁকতে, আপনাকে অবশ্যই সেগুলির জন্য একটি ভিউ কন্টেনার তৈরি করতে হবে। এটি করার আরও একটি সহজ উপায় হল, GLSurfaceView এবং GLSurfaceView.Renderer, দুটিই প্রয়োগ করা। GLSurfaceView হল OpenGL-এর মাধ্যমে আঁকা গ্রাফিক্সের জন্য একটি ভিউ কন্টেনার এবং GLSurfaceView.Renderer সেই ভিউয়ের মধ্যে কী আঁকা হয়েছে তা নিয়ন্ত্রণ করে। এইসব ক্লাস সম্পর্কে আরও তথ্যের জন্য, OpenGL ES ডেভেলপার নির্দেশিকা দেখুন।

আপনার অ্যাপ্লিকেশনে OpenGL ES গ্রাফিক্স অন্তর্ভুক্ত করার একটি উপায় হল GLSurfaceView। ফুল-স্ক্রিন বা প্রায় ফুল-স্ক্রিন গ্রাফিক্স ভিউয়ের জন্য এটি একটি যুক্তিযুক্ত বিকল্প। যেসব ডেভেলপার তাদের লেআউটের একটি ছোট অংশে OpenGL ES গ্রাফিক্স অন্তর্ভুক্ত করতে চান, তাদের TextureView দেখতে হবে। সত্যিই, নিজে করে দেখা ডেভেলপারদের জন্য, SurfaceView ব্যবহার করে OpenGL ES ভিউ তৈরি করাও সম্ভব, তবে এর জন্য বেশ কিছুটা অতিরিক্ত কোড লিখতে হবে।

এই পাঠে ব্যাখ্যা করা হয়েছে যে কীভাবে একটি সাধারণ অ্যাপ্লিকেশন অ্যাক্টিভিটিতে 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 গ্রাফিক্সের জন্য অ্যাক্টিভিটি তৈরি করুন

OpenGL ES ব্যবহার করে এমন Android অ্যাপ্লিকেশনে ইউজার ইন্টারফেস আছে এমন অন্যান্য অ্যাপ্লিকেশনের মতোই অ্যাক্টিভিটি থাকে। অন্যান্য অ্যাপ্লিকেশনের সাথে প্রধান পার্থক্য হল আপনার অ্যাক্টিভিটির জন্য লেআউটে আপনি কী রাখছেন। আপনি অনেক অ্যাপ্লিকেশনে 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)
    }
}

জাভা

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 (API লেভেল 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)
    }
}

জাভা

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

জাভা

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

এই সেটিং GLSurfaceView ফ্রেমকে আবার আঁকা থেকে আটকায় যতক্ষণ না আপনি requestRender() কল করেন, যা এই স্যাম্পেল অ্যাপের জন্য আরও দক্ষ।

রেন্ডারার ক্লাস তৈরি করুন

OpenGL ES ব্যবহার করে এমন অ্যাপ্লিকেশনের মধ্যে GLSurfaceView.Renderer ক্লাস বা রেন্ডারার প্রয়োগ করার সময় জিনিসগুলি আরও আকর্ষণীয় হয়ে ওঠে। এই ক্লাস নিয়ন্ত্রণ করে যে 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)
    }
}

জাভা

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-এর সাহায্যে গ্রাফিক এলিমেন্ট আঁকা শুরু করার জন্য প্রয়োজনীয় ভিত্তি স্থাপন করেছেন।

মনে রাখবেন: আপনি OpengGL ES 2.0 API ব্যবহার করার সময়, এইসব পদ্ধতিতে কেন GL10 প্যারামিটার আছে তা নিয়ে আপনার মনে প্রশ্ন জাগতে পারে। Android ফ্রেমওয়ার্ক কোড আরও সহজ রাখতে 2.0 API-এর জন্য এই মেথড সিগনেচারগুলি সহজেই আবার ব্যবহার করা হয়।

আপনি যদি OpenGL ES API-এর সাথে পরিচিত হন, তাহলে এখন আপনার অ্যাপে OpenGL ES এনভায়রনমেন্ট সেট-আপ করতে এবং গ্রাফিক্স আঁকা শুরু করতে পারবেন। তবে, OpenGL ব্যবহার শুরু করার ব্যাপারে আপনার আরও সাহায্যের প্রয়োজন হলে, আরও কিছু ইঙ্গিত পেতে পরবর্তী পাঠে যান।