OpenGL ES

অ্যান্ড্রয়েড ওপেন গ্রাফিক্স লাইব্রেরি (ওপেনজিএল®), বিশেষত, ওপেনজিএল ইএস এপিআই সহ উচ্চ কার্যক্ষমতা 2D এবং 3D গ্রাফিক্সের জন্য সমর্থন অন্তর্ভুক্ত করে। OpenGL হল একটি ক্রস-প্ল্যাটফর্ম গ্রাফিক্স API যা 3D গ্রাফিক্স প্রসেসিং হার্ডওয়্যারের জন্য একটি আদর্শ সফ্টওয়্যার ইন্টারফেস নির্দিষ্ট করে। OpenGL ES হল OpenGL স্পেসিফিকেশনের একটি ফ্লেভার যা এম্বেড করা ডিভাইসের জন্য তৈরি করা হয়েছে। অ্যান্ড্রয়েড 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 স্পেসিফিকেশনের সাথে পরিচিত হন, তাহলে ভিন্নতার জন্য সতর্ক থাকুন।

এছাড়াও দেখুন

বুনিয়াদি

অ্যান্ড্রয়েড এর ফ্রেমওয়ার্ক API এবং নেটিভ ডেভেলপমেন্ট কিট (NDK) উভয়ের মাধ্যমে OpenGL সমর্থন করে। এই বিষয়টি অ্যান্ড্রয়েড ফ্রেমওয়ার্ক ইন্টারফেসে ফোকাস করে। NDK সম্পর্কে আরও তথ্যের জন্য, Android NDK দেখুন।

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

GLSurfaceView
এই ক্লাসটি হল একটি View যেখানে আপনি OpenGL API কল ব্যবহার করে অবজেক্ট আঁকতে এবং ম্যানিপুলেট করতে পারেন এবং এটি একটি SurfaceView এর মতই। আপনি GLSurfaceView এর একটি উদাহরণ তৈরি করে এবং এতে আপনার Renderer যোগ করে এই ক্লাসটি ব্যবহার করতে পারেন। যাইহোক, আপনি যদি টাচ স্ক্রিন ইভেন্টগুলি ক্যাপচার করতে চান, তাহলে স্পর্শ শ্রোতাদের বাস্তবায়নের জন্য আপনার GLSurfaceView ক্লাস প্রসারিত করা উচিত, যেমনটি OpenGL প্রশিক্ষণ পাঠে দেখানো হয়েছে, স্পর্শ ইভেন্টের প্রতিক্রিয়া
GLSurfaceView.Renderer
এই ইন্টারফেসটি GLSurfaceView এ গ্রাফিক্স আঁকার জন্য প্রয়োজনীয় পদ্ধতিগুলিকে সংজ্ঞায়িত করে। আপনাকে অবশ্যই একটি পৃথক শ্রেণী হিসাবে এই ইন্টারফেসের একটি বাস্তবায়ন প্রদান করতে হবে এবং GLSurfaceView.setRenderer() ব্যবহার করে আপনার GLSurfaceView উদাহরণে এটি সংযুক্ত করতে হবে।

GLSurfaceView.Renderer ইন্টারফেসের জন্য আপনাকে নিম্নলিখিত পদ্ধতিগুলি প্রয়োগ করতে হবে:

  • onSurfaceCreated() : GLSurfaceView তৈরি করার সময় সিস্টেমটি একবার এই পদ্ধতিটিকে কল করে। ওপেনজিএল এনভায়রনমেন্ট প্যারামিটার সেট করা বা ওপেনজিএল গ্রাফিক অবজেক্ট শুরু করার মতো ক্রিয়া সম্পাদন করতে এই পদ্ধতিটি ব্যবহার করুন।
  • onDrawFrame() : সিস্টেমটি GLSurfaceView এর প্রতিটি পুনঃআঁকে এই পদ্ধতিটিকে কল করে। গ্রাফিক বস্তু অঙ্কন (এবং পুনরায় অঙ্কন) জন্য প্রাথমিক নির্বাহ বিন্দু হিসাবে এই পদ্ধতি ব্যবহার করুন.
  • onSurfaceChanged() : সিস্টেমটি এই পদ্ধতিটিকে কল করে যখন GLSurfaceView জ্যামিতি পরিবর্তিত হয়, যার মধ্যে GLSurfaceView এর আকার বা ডিভাইস স্ক্রিনের ওরিয়েন্টেশন পরিবর্তন হয়। উদাহরণস্বরূপ, যখন ডিভাইসটি প্রতিকৃতি থেকে ল্যান্ডস্কেপ অভিযোজনে পরিবর্তিত হয় তখন সিস্টেমটি এই পদ্ধতিটিকে কল করে। GLSurfaceView পাত্রে পরিবর্তনের প্রতিক্রিয়া জানাতে এই পদ্ধতিটি ব্যবহার করুন।

OpenGL ES প্যাকেজ

একবার আপনি GLSurfaceView এবং GLSurfaceView.Renderer ব্যবহার করে OpenGL ES-এর জন্য একটি কন্টেইনার ভিউ স্থাপন করলে, আপনি নিম্নলিখিত ক্লাসগুলি ব্যবহার করে OpenGL API-কে কল করা শুরু করতে পারেন:

  • OpenGL ES 2.0 API ক্লাস
    • android.opengl.GLES20 - এই প্যাকেজটি OpenGL ES 2.0-এর ইন্টারফেস প্রদান করে এবং Android 2.2 (API স্তর 8) থেকে শুরু করে উপলব্ধ।
  • OpenGL ES 3.0/3.1/3.2 API প্যাকেজ
    • android.opengl - এই প্যাকেজটি OpenGL ES 3.0/3.1 ক্লাসে ইন্টারফেস প্রদান করে। সংস্করণ 3.0 Android 4.3 (API স্তর 18) থেকে শুরু করে উপলব্ধ। সংস্করণ 3.1 Android 5.0 (API স্তর 21) থেকে শুরু করে উপলব্ধ। সংস্করণ 3.2 Android 7.0 (API স্তর 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 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 এবং টেক্সচার কম্প্রেশন ফিল্টারিং বিভাগটি দেখুন।

অঙ্কিত বস্তুর জন্য ম্যাপিং স্থানাঙ্ক

অ্যান্ড্রয়েড ডিভাইসে গ্রাফিক্স প্রদর্শনের ক্ষেত্রে একটি মৌলিক সমস্যা হল তাদের স্ক্রীনের আকার এবং আকৃতি ভিন্ন হতে পারে। OpenGL একটি বর্গক্ষেত্র, অভিন্ন স্থানাঙ্ক সিস্টেম অনুমান করে এবং, ডিফল্টরূপে, আনন্দের সাথে সেই স্থানাঙ্কগুলিকে আপনার সাধারণত নন-স্কোয়ার স্ক্রিনে আঁকেন যেন এটি পুরোপুরি বর্গাকার।

চিত্র 1. ডিফল্ট ওপেনজিএল কোঅর্ডিনেট সিস্টেম (বাম) একটি সাধারণ অ্যান্ড্রয়েড ডিভাইসের স্ক্রিনে (ডানে) ম্যাপ করা হয়েছে।

উপরের চিত্রটি বাম দিকে একটি OpenGL ফ্রেমের জন্য অনুমান করা অভিন্ন স্থানাঙ্ক সিস্টেম দেখায় এবং কীভাবে এই স্থানাঙ্কগুলি ডানদিকে ল্যান্ডস্কেপ ওরিয়েন্টেশনে একটি সাধারণ ডিভাইসের স্ক্রিনে ম্যাপ করে। এই সমস্যার সমাধান করার জন্য, আপনি স্থানাঙ্ক রূপান্তর করতে OpenGL প্রজেকশন মোড এবং ক্যামেরা ভিউ প্রয়োগ করতে পারেন যাতে আপনার গ্রাফিক বস্তুর যেকোনো ডিসপ্লেতে সঠিক অনুপাত থাকে।

প্রজেকশন এবং ক্যামেরা ভিউ প্রয়োগ করার জন্য, আপনি একটি প্রজেকশন ম্যাট্রিক্স এবং একটি ক্যামেরা ভিউ ম্যাট্রিক্স তৈরি করুন এবং সেগুলি OpenGL রেন্ডারিং পাইপলাইনে প্রয়োগ করুন। প্রজেকশন ম্যাট্রিক্স আপনার গ্রাফিক্সের স্থানাঙ্কগুলিকে পুনরায় গণনা করে যাতে তারা Android ডিভাইসের স্ক্রিনে সঠিকভাবে ম্যাপ করে। ক্যামেরা ভিউ ম্যাট্রিক্স একটি রূপান্তর তৈরি করে যা একটি নির্দিষ্ট চোখের অবস্থান থেকে বস্তুকে রেন্ডার করে।

OpenGL ES 2.0 এবং উচ্চতর প্রজেকশন এবং ক্যামেরা ভিউ

ES 2.0 এবং 3.0 API-এ, আপনি প্রথমে আপনার গ্রাফিক্স অবজেক্টের ভার্টেক্স শেডারে একটি ম্যাট্রিক্স সদস্য যোগ করে প্রজেকশন এবং ক্যামেরা ভিউ প্রয়োগ করেন। এই ম্যাট্রিক্স সদস্য যোগ করার সাথে, আপনি তারপরে আপনার বস্তুগুলিতে প্রজেকশন এবং ক্যামেরা দেখার ম্যাট্রিক্স তৈরি এবং প্রয়োগ করতে পারেন।

  1. ভার্টেক্স শেডারে ম্যাট্রিক্স যুক্ত করুন - ভিউ প্রজেকশন ম্যাট্রিক্সের জন্য একটি ভেরিয়েবল তৈরি করুন এবং এটিকে শেডারের অবস্থানের গুণক হিসাবে অন্তর্ভুক্ত করুন। নিম্নলিখিত উদাহরণে ভার্টেক্স শেডার কোডে, অন্তর্ভুক্ত uMVPMatrix সদস্য আপনাকে এই শেডার ব্যবহার করে এমন বস্তুর স্থানাঙ্কগুলিতে প্রজেকশন এবং ক্যামেরা দেখার ম্যাট্রিক্স প্রয়োগ করতে দেয়।

    কোটলিন

    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";

    দ্রষ্টব্য: উপরের উদাহরণটি ভার্টেক্স শেডারে একটি একক রূপান্তর ম্যাট্রিক্স সদস্যকে সংজ্ঞায়িত করে যেখানে আপনি একটি সম্মিলিত প্রজেকশন ম্যাট্রিক্স এবং ক্যামেরা ভিউ ম্যাট্রিক্স প্রয়োগ করেন। আপনার আবেদনের প্রয়োজনীয়তার উপর নির্ভর করে, আপনি আপনার ভার্টেক্স শেডারগুলিতে পৃথক প্রজেকশন ম্যাট্রিক্স এবং ক্যামেরা দেখার ম্যাট্রিক্স সদস্যদের সংজ্ঞায়িত করতে চাইতে পারেন যাতে আপনি তাদের স্বাধীনভাবে পরিবর্তন করতে পারেন।

  2. শেডার ম্যাট্রিক্স অ্যাক্সেস করুন - প্রজেকশন এবং ক্যামেরা ভিউ প্রয়োগ করতে আপনার ভার্টেক্স শেডারগুলিতে একটি হুক তৈরি করার পরে, আপনি প্রজেকশন এবং ক্যামেরা দেখার ম্যাট্রিক্স প্রয়োগ করতে সেই ভেরিয়েবলটি অ্যাক্সেস করতে পারেন। উপরের ভার্টেক্স শেডারে সংজ্ঞায়িত ম্যাট্রিক্স ভেরিয়েবল অ্যাক্সেস করার জন্য নিচের কোডটি দেখায় কিভাবে একটি GLSurfaceView.Renderer বাস্তবায়নের onSurfaceCreated() পদ্ধতি পরিবর্তন করতে হয়।

    কোটলিন

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

    জাভা

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        ...
        muMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix");
        ...
    }
  3. প্রজেকশন এবং ক্যামেরা দেখার ম্যাট্রিক্স তৈরি করুন - গ্রাফিক বস্তুগুলি প্রয়োগ করার জন্য প্রজেকশন এবং দেখার ম্যাট্রিক্স তৈরি করুন। নিম্নলিখিত উদাহরণ কোডটি দেখায় কিভাবে একটি GLSurfaceView.Renderer বাস্তবায়নের onSurfaceCreated() এবং onSurfaceChanged() পদ্ধতিগুলিকে সংশোধন করতে হয় যাতে ক্যামেরা ভিউ ম্যাট্রিক্স এবং ডিভাইসের স্ক্রীন আকৃতির অনুপাতের উপর ভিত্তি করে একটি প্রজেকশন ম্যাট্রিক্স তৈরি করা যায়।

    কোটলিন

    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);
    }
  4. প্রজেকশন এবং ক্যামেরা দেখার ম্যাট্রিক্স প্রয়োগ করুন - প্রজেকশন এবং ক্যামেরা ভিউ ট্রান্সফর্মেশন প্রয়োগ করতে, ম্যাট্রিক্সগুলিকে একসাথে গুণ করুন এবং তারপরে সেগুলিকে ভার্টেক্স শেডারে সেট করুন। নিচের উদাহরণ কোডটি দেখায় যে কীভাবে একটি GLSurfaceView.Renderer বাস্তবায়নের onDrawFrame() পদ্ধতিটি উপরের কোডে তৈরি করা প্রজেকশন ম্যাট্রিক্স এবং ক্যামেরা ভিউকে একত্রিত করতে এবং তারপর OpenGL দ্বারা রেন্ডার করা গ্রাফিক বস্তুতে এটি প্রয়োগ করুন।

    কোটলিন

    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-এ শীর্ষবিন্দু বলা হয়) সামনের মুখ এবং পিছনের মুখ থাকে। আপনি কিভাবে জানবেন কোন মুখ সামনে এবং কোনটি পিছনে? ভাল প্রশ্ন. উত্তরটি উইন্ডিং বা, আপনি যে দিকে একটি আকৃতির বিন্দু সংজ্ঞায়িত করেন তার সাথে সম্পর্কিত।

একটি ত্রিভুজের শীর্ষবিন্দুতে স্থানাঙ্ক

চিত্র 1. একটি স্থানাঙ্ক তালিকার চিত্রণ যা ঘড়ির কাঁটার বিপরীতে অঙ্কন ক্রমে অনুবাদ করে।

এই উদাহরণে, ত্রিভুজের বিন্দুগুলিকে এমন ক্রমে সংজ্ঞায়িত করা হয়েছে যাতে সেগুলি ঘড়ির কাঁটার বিপরীত দিকে আঁকা হয়। এই স্থানাঙ্কগুলি যে ক্রমে আঁকা হয় তা আকৃতির জন্য ঘুরার দিক নির্ধারণ করে। ডিফল্টরূপে, OpenGL-এ, যে মুখটি ঘড়ির কাঁটার বিপরীত দিকে আঁকা হয় সেটি হল সামনের মুখ। চিত্র 1-এ দেখানো ত্রিভুজটি সংজ্ঞায়িত করা হয়েছে যাতে আপনি আকৃতির সামনের মুখের দিকে তাকাচ্ছেন (যেমনটি OpenGL দ্বারা ব্যাখ্যা করা হয়েছে) এবং অন্য দিকটি পিছনের মুখ।

কোন আকৃতির মুখের সামনের মুখটি জানা গুরুত্বপূর্ণ কেন? উত্তরটি OpenGL-এর একটি সাধারণভাবে ব্যবহৃত বৈশিষ্ট্যের সাথে সম্পর্কযুক্ত, যাকে বলা হয় ফেস কুলিং। ওপেনজিএল এনভায়রনমেন্টের জন্য ফেস কুলিং একটি বিকল্প যা রেন্ডারিং পাইপলাইনকে একটি আকৃতির পিছনের মুখকে উপেক্ষা করতে (গণনা বা আঁকতে নয়), সময়, মেমরি এবং প্রক্রিয়াকরণ চক্র বাঁচাতে দেয়:

কোটলিন

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 সংস্করণ এবং ডিভাইস সামঞ্জস্য

OpenGL ES 1.0 এবং 1.1 API স্পেসিফিকেশনগুলি Android 1.0 থেকে সমর্থিত। OpenGL ES 1.0/1.1 API সহ গ্রাফিক্স প্রোগ্রামিং 2.0 এবং উচ্চতর সংস্করণ ব্যবহার করার চেয়ে উল্লেখযোগ্যভাবে আলাদা। ওপেনজিএল ইএস 2.0 অ্যান্ড্রয়েড 2.2 (এপিআই লেভেল 8) দিয়ে শুরু হওয়া সমস্ত অ্যান্ড্রয়েড ডিভাইস দ্বারা সমর্থিত এবং এটি ওপেনজিএল ইএস-এর সাথে তৈরি করা নতুন অ্যাপ্লিকেশনগুলির জন্য প্রস্তাবিত প্রথমতম সংস্করণ। 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 অ্যাপ্লিকেশনের কার্যকারিতা উল্লেখযোগ্যভাবে বৃদ্ধি করতে পারে। অ্যান্ড্রয়েড ফ্রেমওয়ার্ক একটি ETC1 কম্প্রেশন ফরম্যাটকে একটি স্ট্যান্ডার্ড বৈশিষ্ট্য হিসাবে সমর্থন করে, যার মধ্যে রয়েছে একটি ETC1Util ইউটিলিটি ক্লাস এবং etc1tool কম্প্রেশন টুল (এটি Android SDK-এ <sdk>/tools/ এ অবস্থিত)। টেক্সচার কম্প্রেশন ব্যবহার করে এমন একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশানের উদাহরণের জন্য, Android SDK ( <sdk>/samples/<version>/ApiDemos/src/com/example/android/apis/graphics/ ) এ CompressedTextureActivity কোডের নমুনা দেখুন।

ETC1 ফর্ম্যাটটি সমস্ত Android ডিভাইস দ্বারা সমর্থিত যা OpenGL ES 2.0 বা উচ্চতর সমর্থন করে৷

দ্রষ্টব্য: ETC1 টেক্সচার কম্প্রেশন ফরম্যাট একটি স্বচ্ছতা (আলফা চ্যানেল) সহ টেক্সচার সমর্থন করে না। যদি আপনার অ্যাপ্লিকেশনের স্বচ্ছতার সাথে টেক্সচারের প্রয়োজন হয়, তাহলে আপনার লক্ষ্য ডিভাইসে উপলব্ধ অন্যান্য টেক্সচার কম্প্রেশন বিন্যাসগুলি তদন্ত করা উচিত। ETC1 ব্যবহার করে আলফা চ্যানেল টেক্সচার রেন্ডার করার একটি পদ্ধতি হল দুটি ETC1 টেক্সচার অবজেক্টকে আবদ্ধ করা: প্রথমটি রঙিন ডেটা সহ, দ্বিতীয়টি আলফা চ্যানেল ডেটা সহ এবং তারপরে ফ্র্যাগমেন্ট শেডারে দুটি টেক্সচার থেকে মানগুলিকে একত্রিত করা৷

OpenGL ES 3.0 API ব্যবহার করার সময় ETC2/EAC টেক্সচার কম্প্রেশন ফর্ম্যাটগুলি উপলব্ধ হওয়ার নিশ্চয়তা দেওয়া হয়। এই টেক্সচার বিন্যাসটি উচ্চ ভিজ্যুয়াল মানের সাথে চমৎকার কম্প্রেশন অনুপাত সরবরাহ করে এবং বিন্যাসটি স্বচ্ছতা (আলফা চ্যানেল) সমর্থন করে।

ইটিসি ফরম্যাটের বাইরে, অ্যান্ড্রয়েড ডিভাইসগুলিতে তাদের জিপিইউ চিপসেট এবং ওপেনজিএল বাস্তবায়নের উপর ভিত্তি করে টেক্সচার কম্প্রেশনের জন্য বিভিন্ন সমর্থন রয়েছে। আপনার অ্যাপ্লিকেশানের কোন ধরনের কম্প্রেশন সমর্থন করা উচিত তা নির্ধারণ করতে আপনার লক্ষ্য করা ডিভাইসগুলিতে টেক্সচার কম্প্রেশন সমর্থন তদন্ত করা উচিত। একটি প্রদত্ত ডিভাইসে কোন টেক্সচার ফর্ম্যাটগুলি সমর্থিত তা নির্ধারণ করার জন্য, আপনাকে অবশ্যই ডিভাইসটি জিজ্ঞাসা করতে হবে এবং OpenGL এক্সটেনশনের নামগুলি পর্যালোচনা করতে হবে, যা ডিভাইস দ্বারা কোন টেক্সচার কম্প্রেশন ফর্ম্যাটগুলি (এবং অন্যান্য OpenGL বৈশিষ্ট্যগুলি) সমর্থিত তা সনাক্ত করে৷ কিছু সাধারণভাবে সমর্থিত টেক্সচার কম্প্রেশন ফরম্যাট নিম্নরূপ:

  • অ্যাডাপ্টেবল স্কেলেবল টেক্সচার কম্প্রেশন (ASTC) - একটি টেক্সচার কম্প্রেশন ফরম্যাট যা পূর্বের ফরম্যাটগুলিকে ছাড়িয়ে যাওয়ার জন্য ডিজাইন করা হয়েছে। বিভিন্ন ব্লক মাপের জন্য সমর্থনের কারণে পূর্ববর্তী বিন্যাসের তুলনায় আরো নমনীয়।
    • GL_KHR_texture_compression_astc_ldr
    • GL_KHR_texture_compression_astc_hdr astc_hdr (উচ্চ গতিশীল পরিসর)
  • S3TC (DXT n /DXTC) - S3 টেক্সচার কম্প্রেশন (S3TC) এর বিভিন্ন ফর্ম্যাট বৈচিত্র রয়েছে (DXT1 থেকে DXT5) এবং এটি কম ব্যাপকভাবে উপলব্ধ। ফরম্যাটটি 4-বিট আলফা বা 8-বিট আলফা চ্যানেলের সাথে RGB টেক্সচার সমর্থন করে। এই ফর্ম্যাটগুলিকে নিম্নলিখিত 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 ES API-এর এক্সটেনশনগুলির পরিপ্রেক্ষিতে Android ডিভাইস অনুসারে OpenGL-এর বাস্তবায়ন পরিবর্তিত হয়। এই এক্সটেনশনগুলিতে টেক্সচার কম্প্রেশন অন্তর্ভুক্ত থাকে, তবে সাধারণত OpenGL বৈশিষ্ট্য সেটের অন্যান্য এক্সটেনশনগুলিও অন্তর্ভুক্ত করে।

কোন নির্দিষ্ট ডিভাইসে টেক্সচার কম্প্রেশন ফরম্যাট এবং অন্যান্য OpenGL এক্সটেনশন সমর্থিত তা নির্ধারণ করতে:

  1. কোন টেক্সচার কম্প্রেশন ফর্ম্যাটগুলি সমর্থিত তা নির্ধারণ করতে আপনার লক্ষ্য ডিভাইসগুলিতে নিম্নলিখিত কোডটি চালান:

    কোটলিন

    var extensions = gl.glGetString(GL10.GL_EXTENSIONS)

    জাভা

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

    সতর্কতা: এই কলের ফলাফল ডিভাইস মডেল অনুসারে পরিবর্তিত হয়! কোন কম্প্রেশন প্রকারগুলি সাধারণত সমর্থিত তা নির্ধারণ করতে আপনাকে অবশ্যই কয়েকটি লক্ষ্য ডিভাইসে এই কলটি চালাতে হবে।

  2. ডিভাইসে কোন OpenGL এক্সটেনশন সমর্থিত তা নির্ধারণ করতে এই পদ্ধতির আউটপুট পর্যালোচনা করুন।

অ্যান্ড্রয়েড এক্সটেনশন প্যাক (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 এ যুক্তি হিসাবে পাস করুন৷ নিম্নলিখিত কোড স্নিপেট এটি কিভাবে করতে হয় তার একটি উদাহরণ দেখায়:

কোটলিন

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

জাভা

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

পদ্ধতিটি সত্য হলে, AEP সমর্থিত।

AEP সম্পর্কে আরও তথ্যের জন্য, Khronos OpenGL ES রেজিস্ট্রিতে এর পৃষ্ঠা দেখুন।

OpenGL ES সংস্করণ পরীক্ষা করা হচ্ছে

অ্যান্ড্রয়েড ডিভাইসে 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-এর সংস্করণটি পরীক্ষা করা উচিত। আপনি দুটি উপায়ে এটি করতে পারেন:

  1. উচ্চ-স্তরের OpenGL ES প্রসঙ্গ ( EGLContext ) তৈরি করার চেষ্টা করুন এবং ফলাফল পরীক্ষা করুন।
  2. একটি সর্বনিম্ন-সমর্থিত OpenGL ES প্রসঙ্গ তৈরি করুন এবং সংস্করণের মান পরীক্ষা করুন।

নিম্নলিখিত উদাহরণ কোডটি দেখায় কিভাবে একটি EGLContext তৈরি করে এবং ফলাফল পরীক্ষা করে উপলব্ধ OpenGL ES সংস্করণটি পরীক্ষা করা যায়। এই উদাহরণটি দেখায় কিভাবে OpenGL ES 3.0 সংস্করণ পরীক্ষা করতে হয়:

কোটলিন

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() পদ্ধতিটি উপরের প্রদর্শন শূন্য হয়, তাহলে আপনার কোডের পরিবর্তে একটি OpenGL ES 2.0 প্রসঙ্গ তৈরি করা উচিত এবং শুধুমাত্র সেই API ব্যবহার করে ফিরে আসা উচিত।

নিম্নলিখিত কোড উদাহরণটি দেখায় যে কীভাবে প্রথমে একটি ন্যূনতম সমর্থিত প্রসঙ্গ তৈরি করে ওপেনজিএল ইএস সংস্করণটি পরীক্ষা করতে হয় এবং তারপরে সংস্করণ স্ট্রিংটি পরীক্ষা করে:

কোটলিন

// 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 এপিআই বাস্তবায়নে ETC1 সমর্থন অন্তর্ভুক্ত রয়েছে, তবে এই টেক্সচার ফর্ম্যাট স্বচ্ছতা সমর্থন করে না। সংকুচিত টেক্সচারের সাথে স্বচ্ছতা বাস্তবায়নের জন্য আপনাকে অবশ্যই দুটি ETC1 টেক্সচার ব্যবহার করতে হবে (রঙ এবং আলফার মধ্যে বিভক্ত) অথবা আপনার লক্ষ্য করা ডিভাইসগুলির দ্বারা সমর্থিত অন্যান্য কম্প্রেশন ফর্ম্যাটে সংস্থান সরবরাহ করতে হবে। আরও তথ্যের জন্য, টেক্সচার কম্প্রেশন সমর্থন দেখুন।

যদিও সামঞ্জস্য, এবং টেক্সচার সমর্থন আপনার সিদ্ধান্তকে প্রভাবিত করতে পারে, আপনার ব্যবহারকারীদের জন্য সেরা অভিজ্ঞতা প্রদান করে বলে আপনি মনে করেন তার উপর ভিত্তি করে একটি OpenGL API সংস্করণ বেছে নেওয়া উচিত।