Android-এ Open Graphics Library (OpenGL®), বিশেষ করে OpenGL ES API-এর মাধ্যমে হাই-পারফর্ম্যান্স 2D ও 3D গ্রাফিক্সের জন্য সহায়তা অন্তর্ভুক্ত থাকে। OpenGL হল একটি ক্রস-প্ল্যাটফর্ম গ্রাফিক্স API যা 3D গ্রাফিক্স প্রসেসিং হার্ডওয়্যারের জন্য স্ট্যান্ডার্ড সফ্টওয়্যার ইন্টারফেস নির্দিষ্ট করে। OpenGL ES হল এম্বেডেড ডিভাইসের জন্য তৈরি করা OpenGL স্পেসিফিকেশনের একটি ফ্লেভার। Android-এ OpenGL ES API-এর বিভিন্ন ভার্সন কাজ করে:
- OpenGL ES 2.0 - এই API স্পেসিফিকেশন Android 2.2 (API লেভেল 8) ও তার পরবর্তী যেকোনও ভার্সনে কাজ করে।
- OpenGL ES 3.0 - এই API স্পেসিফিকেশন Android 4.3 (API লেভেল 18) এবং তার পরবর্তী যেকোনও ভার্সনে কাজ করে।
- OpenGL ES 3.1 - এই API স্পেসিফিকেশন Android 5.0 (API লেভেল 21) এবং তার পরবর্তী যেকোনও ভার্সনে কাজ করে।
- OpenGL ES 3.2 - এই API স্পেসিফিকেশন Android 7.0 (API লেভেল 24) ও তার পরবর্তী যেকোনও ভার্সনে কাজ করে।
সতর্কতা: Android প্ল্যাটফর্মের ভার্সন যাই হোক না কেন, ডিভাইস প্রস্তুতকারী সংস্থা এই গ্রাফিক্স পাইপলাইনের কোনও প্রয়োগ না করলে, কোনও ডিভাইস OpenGL ES 3.0 API-কে সাপোর্ট করতে পারে না। আপনি যদি ম্যানিফেস্টে উল্লেখ করেন যে OpenGL ES 3.0 প্রয়োজন, তাহলে আপনি নিশ্চিত থাকতে পারেন যে সেই ভার্সনটি ডিভাইসে থাকবে। আপনি যদি নির্দিষ্ট করেন যে একটি লোয়ার-লেভেল ভার্সন প্রয়োজন কিন্তু আপনি 3.0 ফিচার উপলভ্য থাকলে তা ব্যবহার করতে চান, তাহলে ডিভাইসটি কোন ভার্সনের OpenGL-এ কাজ করে তা দেখতে আপনাকে রান টাইমে চেক করতে হবে। এটি কীভাবে করবেন সেই সম্পর্কিত তথ্যের জন্য, OpenGL ES ভার্সন চেক করা দেখুন।
মনে রাখবেন: Android-এ OpenGL ES 1.0 ও 1.1-এর জন্য সহায়তা অন্তর্ভুক্ত থাকে, কিন্তু API-এর এইসব ভার্সন পুরনো হয়ে গেছে এবং আধুনিক অ্যাপ্লিকেশন দ্বারা ব্যবহার করা উচিত নয়।
মনে রাখবেন: Android ফ্রেমওয়ার্কের মাধ্যমে প্রদান করা নির্দিষ্ট API, J2ME JSR239 OpenGL ES API-এর মতো, তবে একই নয়। আপনি যদি J2ME JSR239 স্পেসিফিকেশন সম্পর্কে পরিচিত হন, তাহলে পরিবর্তন সম্পর্কে সতর্ক থাকুন।
এও দেখুন
- OpenGL ES-এর মাধ্যমে গ্রাফিক্স দেখানো
- OpenGL ES
- OpenGL ES 2.x স্পেসিফিকেশন
- OpenGL ES 3.x স্পেসিফিকেশন
প্রাথমিক বিষয়
Android-এ ফ্রেমওয়ার্ক API ও নেটিভ ডেভেলপমেন্ট কিট (NDK) দুটির মাধ্যমেই OpenGL কাজ করে। এই বিষয় Android ফ্রেমওয়ার্ক ইন্টারফেসের উপর ফোকাস করে। NDK সম্পর্কে আরও জানতে, Android NDK দেখুন।
Android ফ্রেমওয়ার্কে দুটি মৌলিক ক্লাস আছে যা আপনাকে OpenGL ES API-এর সাহায্যে
গ্রাফিক্স তৈরি ও ম্যানিপুলেট করতে দেয়: GLSurfaceView এবং
GLSurfaceView.Renderer. আপনার উদ্দেশ্য যদি Android অ্যাপ্লিকেশনে OpenGL ব্যবহার করা হয়,
তাহলে অ্যাক্টিভিটিতে এইসব ক্লাস কীভাবে প্রয়োগ করতে হয় তা বোঝা আপনার প্রথম উদ্দেশ্য হওয়া উচিত।
GLSurfaceView- এই ক্লাসটি হল একটি
Viewযেখানে আপনি OpenGL API কল ব্যবহার করে অবজেক্ট আঁকতে ও ম্যানিপুলেট করতে পারেন এবং এটিSurfaceView-এর মতো একই ফাংশন ব্যবহার করে।GLSurfaceView-এর ইনস্ট্যান্স তৈরি করে এবং এতে আপনারRendererযোগ করে আপনি এই ক্লাস ব্যবহার করতে পারেন। তবে, আপনি যদি টাচ স্ক্রিন ইভেন্ট ক্যাপচার করতে চান, তাহলে আপনাকে টাচ লিসনার প্রয়োগ করার জন্যGLSurfaceViewক্লাসকে এক্সটেন্ড করতে হবে, যেমন OpenGL ট্রেনিং লেসনে, টাচ ইভেন্টে প্রতিক্রিয়া জানানো দেখানো হয়েছে। GLSurfaceView.Renderer- এই ইন্টারফেস
GLSurfaceView-এ গ্রাফিক্স আঁকার জন্য প্রয়োজনীয় পদ্ধতিগুলি সংজ্ঞায়িত করে। আপনাকে অবশ্যই এই ইন্টারফেসের একটি ইমপ্লিমেন্টেশন আলাদা ক্লাস হিসেবে প্রদান করতে হবে এবংGLSurfaceView.setRenderer()ব্যবহার করে এটিকে আপনারGLSurfaceViewইনস্ট্যান্সের সাথে অ্যাটাচ করতে হবে।GLSurfaceView.Rendererইন্টারফেসের জন্য আপনাকে নিম্নলিখিত মেথড প্রয়োগ করতে হবে:-
onSurfaceCreated():GLSurfaceViewতৈরি করার সময়, সিস্টেম একবার এই পদ্ধতি কল করে। শুধুমাত্র একবার করতে হবে এমন অ্যাকশন পারফর্ম করতে এই পদ্ধতি ব্যবহার করুন, যেমন OpenGL এনভায়রনমেন্ট প্যারামিটার সেট করা বা OpenGL গ্রাফিক অবজেক্ট ইনিশিয়ালাইজ করা। -
onDrawFrame():GLSurfaceView-এর প্রতিটি রিড্রয়ের সময় সিস্টেম এই পদ্ধতি কল করে। গ্রাফিক অবজেক্ট আঁকার (এবং আবার আঁকার) জন্য এই পদ্ধতিকে প্রাথমিক এক্সিকিউশন পয়েন্ট হিসেবে ব্যবহার করুন। -
onSurfaceChanged():GLSurfaceViewজ্যামিতি পরিবর্তন হলে সিস্টেম এই পদ্ধতিকে কল করে, যার মধ্যেGLSurfaceView-এর সাইজ বা ডিভাইসের স্ক্রিনের ওরিয়েন্টেশনে পরিবর্তনও অন্তর্ভুক্ত। যেমন, ডিভাইস পোর্ট্রেট থেকে ল্যান্ডস্কেপ ওরিয়েন্টেশনে পরিবর্তিত হলে, সিস্টেম এই মেথড কল করে।GLSurfaceViewকন্টেনারে হওয়া পরিবর্তনের প্রতিক্রিয়া জানাতে এই পদ্ধতি ব্যবহার করুন।
-
OpenGL ES প্যাকেজ
GLSurfaceView এবং GLSurfaceView.Renderer ব্যবহার করে OpenGL ES-এর জন্য কন্টেনার ভিউ তৈরি করার পরে, আপনি নিম্নলিখিত ক্লাস ব্যবহার করে
OpenGL API কল করা শুরু করতে পারবেন:
- OpenGL ES 2.0 API Class
android.opengl.GLES20- এই প্যাকেজ OpenGL ES 2.0-এর ইন্টারফেস প্রদান করে এবং Android 2.2 (API লেভেল ৮) থেকে শুরু করে উপলভ্য।
- OpenGL ES 3.0/3.1/3.2 API প্যাকেজ
android.opengl- এই প্যাকেজটি OpenGL ES 3.0/3.1 ক্লাসের ইন্টারফেস প্রদান করে। Android 4.3 (API লেভেল ১৮) থেকে শুরু করে ভার্সন ৩.০ উপলভ্য। Android 5.0 (API লেভেল ২১) থেকে শুরু করে ভার্সন ৩.১ উপলভ্য। Android 7.0 (API লেভেল ২৪) থেকে শুরু করে ভার্সন ৩.২ উপলভ্য।
আপনি যদি এখনই 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 API হল 2.0 API-এর সাথে পুরনো মানানসই, যার অর্থ হল আপনার অ্যাপ্লিকেশনে OpenGL ES-এর ইমপ্লিমেন্টেশনের ক্ষেত্রে আপনি আরও বেশি নমনীয় হতে পারবেন। আপনার ম্যানিফেস্টে OpenGL ES 2.0 API-কে প্রয়োজনীয় হিসেবে ঘোষণা করার মাধ্যমে, আপনি সেই API ভার্সনকে ডিফল্ট হিসেবে ব্যবহার করতে পারবেন, রান টাইমে 3.x API-এর উপলভ্যতা চেক করতে পারবেন এবং তারপর ডিভাইস সেটি সাপোর্ট করলে OpenGL ES 3.x ফিচার ব্যবহার করতে পারবেন। ডিভাইসে কাজ করে এমন OpenGL ES ভার্সন চেক করা সম্পর্কে আরও জানতে, OpenGL ES ভার্সন চেক করা দেখুন।
- টেক্সচার কম্প্রেশন সংক্রান্ত প্রয়োজনীয়তা - আপনার অ্যাপ্লিকেশন টেক্সচার
কম্প্রেশন ফর্ম্যাট ব্যবহার করলে,
<supports-gl-texture>ব্যবহার করে আপনার ম্যানিফেস্ট ফাইলে আপনার অ্যাপ্লিকেশন কোন ফর্ম্যাট কাজ করে তা আপনাকে ঘোষণা করতে হবে। উপলভ্য টেক্সচার কম্প্রেশন ফর্ম্যাট সম্পর্কে আরও জানতে, টেক্সচার কম্প্রেশন সাপোর্ট দেখুন।আপনার ম্যানিফেস্টে টেক্সচার কম্প্রেশনের প্রয়োজনীয়তা ঘোষণা করলে, আপনার ঘোষিত কম্প্রেশনের প্রকারের মধ্যে অন্তত একটি প্রকার সাপোর্ট করে না এমন ডিভাইস ব্যবহারকারীদের থেকে আপনার অ্যাপ্লিকেশন লুকানো থাকে। টেক্সচার কম্প্রেশনের জন্য Google Play ফিল্টারিং কীভাবে কাজ করে সেই সম্পর্কে আরও তথ্য পেতে,
<supports-gl-texture>ডকুমেন্টেশনের Google Play ও টেক্সচার কম্প্রেশন ফিল্টারিং বিভাগ দেখুন।
আঁকা অবজেক্টের জন্য কোঅর্ডিনেট ম্যাপ করা
Android ডিভাইসে গ্রাফিক্স দেখানোর ক্ষেত্রে একটি প্রাথমিক সমস্যা হল, সেগুলির স্ক্রিনের সাইজ ও আকার আলাদা আলাদা হতে পারে। OpenGL একটি বর্গাকার, অভিন্ন কোঅর্ডিনেট সিস্টেম ধরে নেয় এবং ডিফল্ট হিসেবে, আপনার সাধারণত বর্গাকার নয় এমন স্ক্রিনে সেইসব কোঅর্ডিনেট এমনভাবে ড্র করে যেন সেটি নিখুঁতভাবে বর্গাকার।
ছবি ১. সাধারণ Android ডিভাইস স্ক্রিনে (ডানদিকে) ম্যাপ করা ডিফল্ট OpenGL কোঅর্ডিনেট সিস্টেম (বাঁদিকে)।
উপরের ছবিতে, বাঁদিকে OpenGL ফ্রেমের জন্য ধরে নেওয়া ইউনিফর্ম কোঅর্ডিনেট সিস্টেম এবং ডানদিকে ল্যান্ডস্কেপ ওরিয়েন্টেশনে এইসব কোঅর্ডিনেট কীভাবে একটি সাধারণ ডিভাইস স্ক্রিনে ম্যাপ করা হয় তা দেখানো হয়েছে। এই সমস্যার সমাধান করতে, আপনি OpenGL প্রোজেকশন মোড এবং ক্যামেরা ভিউ প্রয়োগ করতে পারেন কোঅর্ডিনেট ট্রান্সফর্ম করতে যাতে আপনার গ্রাফিক অবজেক্টের যেকোনও ডিসপ্লেতে সঠিক অনুপাত থাকে।
প্রোজেকশন ও ক্যামেরা ভিউ প্রয়োগ করতে, আপনাকে একটি প্রোজেকশন ম্যাট্রিক্স ও ক্যামেরা ভিউ ম্যাট্রিক্স তৈরি করতে হবে এবং সেগুলি OpenGL রেন্ডারিং পাইপলাইনে প্রয়োগ করতে হবে। প্রোজেকশন ম্যাট্রিক্স আপনার গ্রাফিক্সের কোঅর্ডিনেট আবার গণনা করে যাতে সেগুলি Android ডিভাইসের স্ক্রিনে সঠিকভাবে ম্যাপ করা যায়। ক্যামেরা ভিউ ম্যাট্রিক্স এমন একটি ট্রান্সফর্মেশন তৈরি করে যা নির্দিষ্ট চোখের পজিশন থেকে অবজেক্ট রেন্ডার করে।
OpenGL ES 2.0 ও এর পরের যেকোনও ভার্সনে প্রজেকশন ও ক্যামেরা ভিউ
ES 2.0 এবং 3.0 API-তে, আপনার গ্রাফিক্স অবজেক্টের ভার্টেক্স শেডারগুলিতে প্রথমে একটি ম্যাট্রিক্স মেম্বার যোগ করে আপনি প্রজেকশন এবং ক্যামেরা ভিউ প্রয়োগ করেন। এই ম্যাট্রিক্স মেম্বার যোগ করার পরে, আপনি নিজের অবজেক্টে প্রজেকশন ও ক্যামেরা ভিউয়িং ম্যাট্রিক্স তৈরি ও প্রয়োগ করতে পারবেন।
- ভার্টেক্স শেডারে ম্যাট্রিক্স যোগ করুন - ভিউ প্রজেকশন ম্যাট্রিক্সের জন্য একটি ভেরিয়েবল তৈরি করুন
এবং এটিকে শেডারের পজিশনের মাল্টিপ্লায়ার হিসেবে অন্তর্ভুক্ত করুন। নিচের উদাহরণে দেওয়া ভার্টেক্স শেডার
কোডে, অন্তর্ভুক্ত
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"
জাভা
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";
মনে রাখবেন: উপরের উদাহরণে ভার্টেক্স শেডারে একটি ট্রান্সফর্মেশন ম্যাট্রিক্স মেম্বারকে সংজ্ঞায়িত করা হয়েছে, যার উপর আপনি একটি কম্বাইন্ড প্রোজেকশন ম্যাট্রিক্স এবং ক্যামেরা ভিউ ম্যাট্রিক্স প্রয়োগ করেন। আপনার অ্যাপ্লিকেশনের প্রয়োজনীয়তা অনুযায়ী, আপনি হয়ত নিজের ভার্টেক্স শেডারে আলাদা প্রজেকশন ম্যাট্রিক্স ও ক্যামেরা ভিউয়িং ম্যাট্রিক্স মেম্বারকে ডিফাইন করতে চাইবেন যাতে আপনি সেগুলিকে আলাদাভাবে পরিবর্তন করতে পারেন।
- শেডার ম্যাট্রিক্স অ্যাক্সেস করা - প্রজেকশন ও ক্যামেরা ভিউ প্রয়োগ করার জন্য আপনার ভার্টেক্স শেডারে হুক তৈরি করার পরে, প্রজেকশন ও ক্যামেরা ভিউয়িং ম্যাট্রিক্স প্রয়োগ করার জন্য আপনি সেই ভেরিয়েবল অ্যাক্সেস করতে পারবেন।
উপরের ভার্টেক্স শেডারে সংজ্ঞায়িত ম্যাট্রিক্স ভেরিয়েবল অ্যাক্সেস করার জন্য
GLSurfaceView.Rendererইমপ্লিমেন্টেশনেরonSurfaceCreated()পদ্ধতি কীভাবে পরিবর্তন করতে হয় তা নিম্নলিখিত কোড থেকে জানতে পারবেন।Kotlin
override fun onSurfaceCreated(gl: GL10, config: EGLConfig) { ... muMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix") ... }
জাভা
public void onSurfaceCreated(GL10 unused, EGLConfig config) { ... muMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); ... }
- প্রোজেকশন ও ক্যামেরা ভিউয়িং ম্যাট্রিক্স তৈরি করা - গ্রাফিক অবজেক্টে প্রয়োগ করার জন্য প্রোজেকশন ও
ভিউয়িং ম্যাট্রিক্স তৈরি করুন। নিচে দেওয়া উদাহরণ কোড থেকে আপনি জানতে পারবেন যে কীভাবে
GLSurfaceView.Rendererইমপ্লিমেন্টেশনেরonSurfaceCreated()এবংonSurfaceChanged()মেথড পরিবর্তন করে ক্যামেরা ভিউ ম্যাট্রিক্স এবং ডিভাইসের স্ক্রিন অ্যাস্পেক্ট রেশিওর উপর ভিত্তি করে প্রোজেকশন ম্যাট্রিক্স তৈরি করা যায়।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) }
জাভা
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); }
- প্রোজেকশন ও ক্যামেরা ভিউয়িং ম্যাট্রিক্স প্রয়োগ করা - প্রোজেকশন ও
ক্যামেরা ভিউ ট্রান্সফর্মেশন প্রয়োগ করতে, ম্যাট্রিক্সগুলিকে একসাথে গুণ করুন এবং তারপর সেগুলিকে ভার্টেক্স
শেডারে সেট করুন। নিম্নলিখিত উদাহরণ কোডটি দেখায় যে কীভাবে
GLSurfaceView.Rendererইমপ্লিমেন্টেশনেরonDrawFrame()পদ্ধতিটি পরিবর্তন করে উপরের কোডে তৈরি করা প্রজেকশন ম্যাট্রিক্স এবং ক্যামেরা ভিউকে একত্রিত করা যায় এবং তারপরে 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 ... }
জাভা
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-এ ভার্টিসেস বলা হয়) একটি সেটের সামনের ও পিছনের ফেস থাকে। কোন দিকটি সামনের দিক এবং কোন দিকটি পিছনের দিক তা আপনি কীভাবে বুঝবেন? ভালো প্রশ্ন। উত্তরটি উইন্ডিং বা আপনি যে দিকে কোনও আকারের পয়েন্টগুলি সংজ্ঞায়িত করেন তার সাথে সম্পর্কিত।
ছবি ১. কোঅর্ডিনেট লিস্টের ইলাস্ট্রেশন যা ঘড়ির কাঁটার বিপরীত দিকে আঁকার ক্রম হিসেবে অনুবাদ করা হয়।
এই উদাহরণে, ত্রিভুজের পয়েন্টগুলি এমনভাবে সংজ্ঞায়িত করা হয়েছে যে সেগুলি ঘড়ির কাঁটার বিপরীত দিকে আঁকা হয়েছে। যে ক্রমে এই কোঅর্ডিনেটগুলি আঁকা হয় তা আকারের জন্য উইন্ডিংয়ের দিক নির্ধারণ করে। OpenGL-এ, ডিফল্ট হিসেবে, যে ফেসটি ঘড়ির কাঁটার বিপরীত দিকে আঁকা হয় সেটি হল ফ্রন্ট ফেস। ১ নম্বর ছবিতে দেখানো ত্রিভুজটি এমনভাবে সংজ্ঞায়িত করা হয়েছে যাতে আপনি শেপের সামনের দিকটি দেখছেন (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) }
জাভা
// 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 ভার্সন ও ডিভাইসের সাথে মানানসই হওয়া
Android 1.0 থেকে OpenGL ES 1.0 এবং 1.1 API স্পেসিফিকেশন কাজ করে। OpenGL ES 1.0/1.1 API-এর সাহায্যে গ্রাফিক্স প্রোগ্রামিং করা 2.0 এবং তার পরবর্তী যেকোনও ভার্সন ব্যবহার করার থেকে উল্লেখযোগ্যভাবে আলাদা। Android 2.2 (API লেভেল 8) থেকে শুরু করে সমস্ত Android ডিভাইসে OpenGL ES 2.0 কাজ করে এবং এটি OpenGL ES-এর মাধ্যমে তৈরি করা নতুন অ্যাপ্লিকেশনের জন্য প্রস্তাবিত সবচেয়ে পুরনো ভার্সন। OpenGL ES 3.0, Android 4.3 (API লেভেল 18) ও এর পরবর্তী যেকোনও ভার্সনের সাথে কাজ করে। যেসব ডিভাইসে OpenGL ES 3.0 API-এর ইমপ্লিমেন্টেশন প্রদান করা হয় সেগুলিতে এটি কাজ করে। OpenGL ES-এর কোনও নির্দিষ্ট ভার্সন কাজ করে এমন Android-চালিত ডিভাইসের আপেক্ষিক সংখ্যা সম্পর্কে তথ্য পেতে, OpenGL ES ভার্সন ড্যাশবোর্ড দেখুন।
আপনাকে গ্রাফিক্স সংক্রান্ত প্রয়োজনীয়তা ভালোভাবে বিবেচনা করে দেখতে হবে এবং আপনার অ্যাপ্লিকেশনের জন্য সবচেয়ে ভালো কাজ করে এমন API ভার্সন বেছে নিতে হবে। আরও তথ্যের জন্য, OpenGL API ভার্সন বেছে নেওয়া দেখুন।
OpenGL ES 3.0 API, 2.0 API-এর তুলনায় অতিরিক্ত ফিচার ও আরও ভালো পারফর্ম্যান্স প্রদান করে এবং এটি পুরনো ভার্সনের সাথেও মানানসই। এর অর্থ হল, আপনি OpenGL ES 2.0-কে টার্গেট করে আপনার অ্যাপ্লিকেশন লিখতে পারেন এবং OpenGL ES 3.0 গ্রাফিক্স ফিচার উপলভ্য থাকলে শর্তসাপেক্ষে তা অন্তর্ভুক্ত করতে পারেন। 3.0 API-এর উপলভ্যতা চেক করা সম্পর্কে আরও তথ্যের জন্য, OpenGL ES ভার্সন চেক করা লিঙ্কটি দেখুন
টেক্সচার কম্প্রেশন সাপোর্ট
টেক্সচার কম্প্রেশন, মেমরির প্রয়োজনীয়তা কমিয়ে এবং মেমরি ব্যান্ডউইথ আরও দক্ষতার সাথে ব্যবহার করে
আপনার OpenGL অ্যাপ্লিকেশনের পারফর্ম্যান্স উল্লেখযোগ্যভাবে বাড়াতে পারে। Android
ফ্রেমওয়ার্ক, ETC1 কম্প্রেশন ফর্ম্যাটের জন্য স্ট্যান্ডার্ড ফিচার হিসেবে সহায়তা প্রদান করে, এর মধ্যে রয়েছে
ETC1Util ইউটিলিটি ক্লাস এবং etc1tool কম্প্রেশন টুল (যা
Android SDK-তে <sdk>/tools/-এ অবস্থিত)। টেক্সচার কম্প্রেশন ব্যবহার করে এমন Android অ্যাপ্লিকেশনের
উদাহরণ দেখতে, Android SDK
(<sdk>/samples/<version>/ApiDemos/src/com/example/android/apis/graphics/)-তে CompressedTextureActivity কোড স্যাম্পেল দেখুন।
OpenGL ES 2.0 বা তার পরবর্তী যেকোনও ভার্সন কাজ করে এমন সব Android ডিভাইসে ETC1 ফর্ম্যাট কাজ করে।
মনে রাখবেন: ETC1 টেক্সচার কম্প্রেশন ফর্ম্যাট, ট্রান্সপারেন্সি (আলফা চ্যানেল) সহ টেক্সচার সাপোর্ট করে না। আপনার অ্যাপ্লিকেশনে ট্রান্সপারেন্সি সহ টেক্সচার প্রয়োজন হলে, আপনাকে টার্গেট ডিভাইসে উপলভ্য অন্যান্য টেক্সচার কম্প্রেশন ফর্ম্যাট খতিয়ে দেখতে হবে। ETC1 ব্যবহার করে আলফা চ্যানেল টেক্সচার রেন্ডার করার একটি পদ্ধতি হল দুটি ETC1 টেক্সচার অবজেক্ট বাইন্ড করা: প্রথমটি কালার ডেটা সহ, দ্বিতীয়টি আলফা চ্যানেল ডেটা সহ এবং তারপরে ফ্র্যাগমেন্ট শেডারে দুটি টেক্সচারের ভ্যালু একত্রিত করা।
OpenGL ES 3.0 API ব্যবহার করার সময় ETC2/EAC টেক্সচার কম্প্রেশন ফর্ম্যাট উপলভ্য থাকার ব্যাপারে গ্যারান্টি দেওয়া হয়। এই টেক্সচার ফর্ম্যাটটি উচ্চ ভিজ্যুয়াল কোয়ালিটি সহ চমৎকার কম্প্রেশন রেশিও অফার করে এবং ফর্ম্যাটটি ট্রান্সপারেন্সি (আলফা চ্যানেল)-কেও সাপোর্ট করে।
ETC ফর্ম্যাট ছাড়াও, Android ডিভাইসে টেক্সচার কম্প্রেশনের জন্য বিভিন্ন ধরনের সাপোর্ট আছে, যা এর GPU চিপসেট এবং OpenGL ইমপ্লিমেন্টেশনের উপর নির্ভর করে। আপনার অ্যাপ্লিকেশন কোন ধরনের কম্প্রেশন সাপোর্ট করবে তা নির্ধারণ করতে, আপনার টার্গেট করা ডিভাইসগুলিতে টেক্সচার কম্প্রেশন সাপোর্ট করে কিনা তা আপনাকে খতিয়ে দেখতে হবে। কোনও ডিভাইসে কোন টেক্সচার ফর্ম্যাট কাজ করে তা নির্ধারণ করতে, আপনাকে অবশ্যই ডিভাইস কোয়েরি করতে হবে এবং OpenGL এক্সটেনশনের নাম পর্যালোচনা করতে হবে, যা ডিভাইসে কোন টেক্সচার কম্প্রেশন ফর্ম্যাট (এবং অন্যান্য OpenGL ফিচার) কাজ করে তা শনাক্ত করে। সাধারণত কাজ করে এমন কিছু টেক্সচার কম্প্রেশন ফর্ম্যাট নিচে দেওয়া হল:
- অ্যাডাপ্টেবল স্কেলেবল টেক্সচার কম্প্রেশন (ASTC) - একটি টেক্সচার কম্প্রেশন ফর্ম্যাট
যা আগের ফর্ম্যাটকে প্রতিস্থাপন করার জন্য ডিজাইন করা হয়েছে। বিভিন্ন
ব্লক সাইজের জন্য কাজ করে বলে আগের ফর্ম্যাটের চেয়ে বেশি নমনীয়।
GL_KHR_texture_compression_astc_ldrGL_KHR_texture_compression_astc_hdr(উচ্চ মাত্রার ডায়নামিক ব্যাপ্তি)
- S3TC (DXTn/DXTC) - S3 টেক্সচার কম্প্রেশন (S3TC)-এর বিভিন্ন
ফর্ম্যাট ভ্যারিয়েশন (DXT1 থেকে DXT5) আছে এবং এটি কম উপলভ্য। এই ফর্ম্যাট ৪-বিট আলফা বা ৮-বিট আলফা চ্যানেল সহ
RGB টেক্সচার সাপোর্ট করে। এইসব ফর্ম্যাট নিম্নলিখিত OpenGL এক্সটেনশন
নামের মাধ্যমে দেখানো হয়:
GL_EXT_texture_compression_s3tc
GL_EXT_texture_compression_dxt1
নিম্নলিখিত টেক্সচার কম্প্রেশন ফর্ম্যাটগুলি পুরনো ফর্ম্যাট হিসেবে বিবেচিত হয় এবং নতুন অ্যাপ্লিকেশনগুলিতে ব্যবহার করার জন্য সাজেস্ট করা হয় না:
- ATITC (ATC) - ATI টেক্সচার কম্প্রেশন (ATITC বা ATC) বিভিন্ন ধরনের ডিভাইসে উপলভ্য এবং এটি আলফা চ্যানেল সহ ও আলফা চ্যানেল ছাড়া RGB টেক্সচারের জন্য
নির্দিষ্ট রেট কম্প্রেশন কাজ করে। এই ফর্ম্যাটটি একাধিক OpenGL এক্সটেনশন নামের মাধ্যমে দেখানো হতে পারে, যেমন:
GL_AMD_compressed_ATC_textureGL_ATI_texture_compression_atitc
- PVRTC - PowerVR টেক্সচার কম্প্রেশন (PVRTC) বিভিন্ন ধরনের ডিভাইসে উপলভ্য
এবং আলফা চ্যানেল সহ বা এটি ছাড়া প্রতি পিক্সেল ২-বিট ও ৪-বিট টেক্সচার কাজ করে।
এই ফর্ম্যাটটি নিম্নলিখিত OpenGL এক্সটেনশনের নাম দ্বারা উপস্থাপিত হয়:
GL_IMG_texture_compression_pvrtc
- 3DC - 3DC টেক্সচার কম্প্রেশন (3DC) হল তুলনামূলকভাবে কম উপলভ্য ফর্ম্যাট যা
আলফা চ্যানেল সহ RGB টেক্সচার কাজ করে। এই ফর্ম্যাটটি নিম্নলিখিত OpenGL
এক্সটেনশনের নাম দ্বারা
প্রতিনিধিত্ব করা হয়:
GL_AMD_compressed_3DC_texture
সতর্কতা: এই টেক্সচার কম্প্রেশন ফর্ম্যাট সব ডিভাইসে কাজ করে না। এইসব ফর্ম্যাটের জন্য সহায়তা প্রস্তুতকারক ও ডিভাইস অনুযায়ী আলাদা আলাদা হতে পারে। কোনও নির্দিষ্ট ডিভাইসে টেক্সচার কম্প্রেশন ফর্ম্যাট কী তা কীভাবে নির্ধারণ করা যায় সেই সম্পর্কে তথ্যের জন্য, পরবর্তী বিভাগ দেখুন।
মনে রাখবেন: আপনার অ্যাপ্লিকেশন কোন টেক্সচার কম্প্রেশন ফর্ম্যাট সাপোর্ট করবে তা ঠিক করার পরে, <supports-gl-texture> ব্যবহার করে ম্যানিফেস্টে তা ঘোষণা করতে ভুলবেন না। এই ঘোষণা ব্যবহার করলে Google Play-এর মতো এক্সটার্নাল পরিষেবা ফিল্টার করতে পারে, যাতে আপনার অ্যাপ শুধুমাত্র সেইসব ডিভাইসে ইনস্টল করা হয় যেগুলিতে আপনার অ্যাপের প্রয়োজনীয় ফর্ম্যাট কাজ করে। বিস্তারিত জানতে, OpenGL ম্যানিফেস্ট ঘোষণা দেখুন।
OpenGL এক্সটেনশন নির্ধারণ করা
OpenGL ES API-এর এক্সটেনশনের ক্ষেত্রে Android ডিভাইস অনুযায়ী OpenGL-এর প্রয়োগ আলাদা হয় যা কাজ করে। এইসব এক্সটেনশনের মধ্যে টেক্সচার কম্প্রেশন অন্তর্ভুক্ত থাকলেও, সাধারণত OpenGL ফিচার সেটের অন্যান্য এক্সটেনশনও অন্তর্ভুক্ত থাকে।
কোনও নির্দিষ্ট ডিভাইসে কোন টেক্সচার কম্প্রেশন ফর্ম্যাট এবং অন্যান্য OpenGL এক্সটেনশন কাজ করে তা নির্ধারণ করতে:
- কোন টেক্সচার কম্প্রেশন
ফর্ম্যাট কাজ করে তা নির্ধারণ করতে আপনার টার্গেট ডিভাইসে নিম্নলিখিত কোডটি চালান:
Kotlin
var extensions = gl.glGetString(GL10.GL_EXTENSIONS)
জাভা
String extensions = gl.glGetString(GL10.GL_EXTENSIONS);
সতর্কতা: এই কলের ফলাফল ডিভাইস মডেল অনুযায়ী আলাদা আলাদা হয়! কোন ধরনের কম্প্রেশন সাধারণত কাজ করে তা নির্ধারণ করতে আপনাকে একাধিক টার্গেট ডিভাইসে এই কলটি চালাতে হবে।
- ডিভাইসে কোন OpenGL এক্সটেনশন কাজ করে তা নির্ধারণ করতে এই পদ্ধতির আউটপুট পর্যালোচনা করুন।
Android এক্সটেনশন প্যাক (AEP)
AEP নিশ্চিত করে যে আপনার অ্যাপ্লিকেশন OpenGL 3.1 স্পেসিফিকেশনে বর্ণিত মূল সেটের উপরে এবং তার বাইরে OpenGL এক্সটেনশনের একটি স্ট্যান্ডার্ডাইজড সেটকে সমর্থন করে। এইসব এক্সটেনশন একসাথে প্যাকেজ করা হলে বিভিন্ন ডিভাইস জুড়ে কার্যকারিতার একটি সামঞ্জস্যপূর্ণ সেট তৈরি হয়, পাশাপাশি ডেভেলপাররা মোবাইল 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)
জাভা
boolean deviceSupportsAEP = getPackageManager().hasSystemFeature (PackageManager.FEATURE_OPENGLES_EXTENSION_PACK);
পদ্ধতিটি true রিটার্ন করলে, AEP কাজ করে।
AEP সম্পর্কে আরও তথ্যের জন্য, Khronos OpenGL ES রেজিস্ট্রি-তে এর পৃষ্ঠা দেখুন।
OpenGL ES ভার্সন চেক করা হচ্ছে
Android ডিভাইসে OpenGL ES-এর একাধিক ভার্সন উপলভ্য। আপনার অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় API-এর ন্যূনতম ভার্সন আপনি ম্যানিফেস্টে উল্লেখ করতে পারেন, তবে একই সাথে আপনি হয়ত নতুন API-এর ফিচারগুলিও ব্যবহার করতে চান। যেমন, OpenGL ES 3.0 API, API-এর 2.0 ভার্সনের সাথে ব্যাকওয়ার্ড-কম্প্যাটিবল, তাই আপনি এমনভাবে অ্যাপ্লিকেশন লিখতে পারেন যাতে এটি OpenGL ES 3.0 ফিচার ব্যবহার করে, কিন্তু 3.0 API উপলভ্য না থাকলে 2.0 API ব্যবহার করে।
আপনার অ্যাপ্লিকেশন ম্যানিফেস্টে ন্যূনতম প্রয়োজনীয় ভার্সনের চেয়ে বেশি ভার্সন থেকে OpenGL ES ফিচার ব্যবহার করার আগে, আপনার অ্যাপ্লিকেশনটির ডিভাইসে উপলভ্য API-এর ভার্সন চেক করা উচিত। আপনি দুটি উপায়ের মধ্যে যেকোনও একটির মাধ্যমে এটি করতে পারবেন:
- উচ্চ-লেভেলের OpenGL ES কনটেক্সট (
EGLContext) তৈরি করার চেষ্টা করুন এবং ফলাফল চেক করুন। - ন্যূনতম কাজ করে এমন OpenGL ES কনটেক্সট তৈরি করুন এবং ভার্সন ভ্যালু চেক করুন।
নিচে দেওয়া কোডের উদাহরণ থেকে কীভাবে
EGLContext তৈরি করে এবং ফলাফল চেক করে উপলভ্য OpenGL ES ভার্সন চেক করতে হয় তা জানতে পারবেন। এই উদাহরণে দেখানো হয়েছে কীভাবে
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 } }
জাভা
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() উপরের পদ্ধতিটি যদি null রিটার্ন করে, তাহলে আপনার কোডকে OpenGL
ES 2.0 কনটেক্সট তৈরি করতে হবে এবং শুধুমাত্র সেই API ব্যবহার করতে হবে।
নিম্নলিখিত কোডের উদাহরণ থেকে বোঝা যায় যে কীভাবে প্রথমে ন্যূনতম কাজ করে এমন কনটেক্সট তৈরি করে 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.
জাভা
// 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.
এই পদ্ধতিতে, আপনি যদি দেখেন যে ডিভাইসটি একটি উচ্চ-স্তরের API ভার্সনে কাজ করে, তাহলে আপনাকে অবশ্যই সর্বনিম্ন OpenGL ES কনটেক্সট ধ্বংস করতে হবে এবং উপলভ্য উচ্চতর API ভার্সন সহ একটি নতুন কনটেক্সট তৈরি করতে হবে।
OpenGL API ভার্সন বেছে নেওয়া
OpenGL ES ভার্সন 2.0 এবং ভার্সন 3.0, দু'টিই 3D গেম, ভিজ্যুয়ালাইজেশন এবং ইউজার ইন্টারফেস তৈরি করার জন্য হাই পারফর্ম্যান্স গ্রাফিক্স ইন্টারফেস প্রদান করে। OpenGL ES 2.0 ও 3.0-এর জন্য গ্রাফিক্স প্রোগ্রামিং মূলত একই রকম, তবে 3.0 ভার্সনটি অতিরিক্ত ফিচার সহ 2.0 API-এর একটি সুপারসেট প্রতিনিধিত্ব করে। OpenGL ES 1.0/1.1 API-এর জন্য প্রোগ্রামিং বনাম OpenGL ES 2.0 এবং 3.0-এর মধ্যে উল্লেখযোগ্য পার্থক্য রয়েছে এবং নতুন অ্যাপ্লিকেশনের জন্য সাজেস্ট করা হয় না। এইসব API ব্যবহার করে ডেভেলপমেন্ট শুরু করার আগে ডেভেলপারদের নিম্নলিখিত বিষয়গুলি ভালোভাবে বিবেচনা করে দেখা উচিত:
- ডিভাইসের সাথে মানানসই - ডেভেলপারদের ডিভাইসের ধরন, Android ভার্সন এবং তাদের গ্রাহকদের জন্য উপলভ্য OpenGL ES ভার্সন বিবেচনা করা উচিত। বিভিন্ন ডিভাইসে OpenGL কম্প্যাটিবিলিটি সম্পর্কে আরও তথ্য জানতে, OpenGL ভার্সন ও ডিভাইস কম্প্যাটিবিলিটি বিভাগ দেখুন।
- টেক্সচার সাপোর্ট - OpenGL ES 3.0 API-তে টেক্সচার কম্প্রেশনের জন্য সেরা সাপোর্ট রয়েছে কারণ এটি ETC2 কম্প্রেশন ফর্ম্যাটের উপলভ্যতা নিশ্চিত করে, যা স্বচ্ছতা সাপোর্ট করে। 2.0 API প্রয়োগের মধ্যে ETC1-এর জন্য সহায়তা অন্তর্ভুক্ত, তবে এই টেক্সচার ফর্ম্যাট ট্রান্সপারেন্সি সমর্থন করে না। কমপ্রেস করা টেক্সচারের ক্ষেত্রে স্বচ্ছতা প্রয়োগ করতে, আপনাকে অবশ্যই দুটি ETC1 টেক্সচার (কালার ও আলফার মধ্যে ভাগ করা) ব্যবহার করতে হবে অথবা আপনি যেসব ডিভাইসকে টার্গেট করছেন সেগুলিতে কাজ করে এমন অন্যান্য কম্প্রেশন ফর্ম্যাটে রিসোর্স প্রদান করতে হবে। আরও তথ্যের জন্য, টেক্সচার কম্প্রেশন সাপোর্ট দেখুন।
সামঞ্জস্য ও টেক্সচার সাপোর্ট আপনার সিদ্ধান্তকে প্রভাবিত করতে পারে, তবে আপনার ব্যবহারকারীদের জন্য কোনটি সবচেয়ে ভালো অভিজ্ঞতা প্রদান করে বলে আপনি মনে করেন তার ভিত্তিতে আপনাকে OpenGL API ভার্সন বেছে নিতে হবে।