ওপেনজিএল ইএস-এ পাঠ্য আঁকুন


131

আমি বর্তমানে অ্যান্ড্রয়েড প্ল্যাটফর্মের জন্য একটি ছোট ওপিজিএল গেমটি বিকাশ করছি এবং আমি অবাক হয়েছি যে রেন্ডার করা ফ্রেমের উপরে টেক্সট রেন্ডার করার কোনও সহজ উপায় আছে কিনা (প্লেয়ারের স্কোর সহ এইচডির মতো)। পাঠ্যের একটি কাস্টম ফন্টও ব্যবহার করা দরকার।

আমি ওভারলে হিসাবে একটি ভিউ ব্যবহার করে একটি উদাহরণ দেখেছি, তবে আমি জানি না যে আমি এটি করতে চাই যেহেতু পরে আমি অন্য প্ল্যাটফর্মগুলিতে গেমটি পোর্ট করতে চাই।

কোন ধারনা?


এই প্রকল্পটি একবার দেখুন: code.google.com/p/rokon
whunmr

বিটম্যাপ ফন্টের মাধ্যমে libgdx যেভাবে এটি করে তা দেখুন।
রবার্ট ম্যাসাওলি

উত্তর:


103

অ্যান্ড্রয়েড এসডিকে ওপেনজিএল ভিউগুলিতে পাঠ্য আঁকার কোনও সহজ উপায় নিয়ে আসে না। নিম্নলিখিত বিকল্পগুলি দিয়ে আপনাকে ছেড়ে চলেছে।

  1. আপনার সারফেসভিউয়ের উপরে একটি পাঠ্যদর্শন রাখুন। এটি ধীর এবং খারাপ, তবে সবচেয়ে সরাসরি পদ্ধতির।
  2. টেক্সচারগুলিতে সাধারণ স্ট্রিংগুলি রেন্ডার করুন এবং কেবল সেই টেক্সচারগুলি আঁকুন। এটি এখন পর্যন্ত সবচেয়ে সহজ এবং দ্রুততম তবে স্বল্পতম নমনীয়।
  3. একটি স্প্রাইটের উপর ভিত্তি করে আপনার নিজের পাঠ্য রেন্ডারিং কোডটি রোল করুন। 2 দ্বিতীয় বিকল্প না হলে সম্ভবত দ্বিতীয় সেরা পছন্দ। আপনার পা ভিজে যাওয়ার একটি ভাল উপায় তবে মনে রাখবেন যে এটি সহজ বলে মনে হচ্ছে (এবং প্রাথমিক বৈশিষ্ট্যগুলি হ'ল) ​​আপনি আরও বেশি বৈশিষ্ট্য যুক্ত করার সাথে সাথে (টেক্সচার-সারিবদ্ধকরণ, লাইন-ব্রেকগুলির সাথে সম্পর্কিত, ভেরিয়েবল-প্রস্থের ফন্ট ইত্যাদির) আরও শক্ত এবং চ্যালেঞ্জিং রয়েছে note ) - আপনি যদি এই রুটটি নেন তবে এটিকে যত সহজ আপনি সহজেই দূরে সরিয়ে নিতে পারবেন!
  4. অফ-দ্য শেল্ফ / ওপেন-সোর্স লাইব্রেরি ব্যবহার করুন। গুগলে শিকার করলে আশেপাশে কয়েকটি রয়েছে, কৌতুকপূর্ণ বিট সেগুলি সংহত এবং চলমান হয়ে উঠছে। তবে কমপক্ষে, একবার আপনি এটি করার পরে আপনার তাদের দেওয়া সমস্ত নমনীয়তা এবং পরিপক্কতা থাকবে।

3
আমি আমার জিএলভিউয়ের সাথে একটি ভিউ যুক্ত করার সিদ্ধান্ত নিয়েছি, এটি করার সবচেয়ে কার্যকর উপায় নাও হতে পারে তবে ভিউটি প্রায়শই আপডেট হয় না, এবং এটি আমাকে যা ফন্ট চাই তা যুক্ত করার নমনীয়তা দেয়। সব জবাব দেওয়ার জন্য ধন্যবাদ!

1
আমি কীভাবে টেক্সচারগুলিতে সাধারণ স্ট্রিংগুলি রেন্ডার করতে পারি এবং কেবল সেই টেক্সচারগুলি আঁকতে পারি? ধন্যবাদ।
ভ্যানসফ্যানেল

1
ভ্যানসফ্যানেল: আপনার সমস্ত স্ট্রিংগুলি একটি ইমেজে রাখার জন্য কেবল একটি পেইন্ট প্রোগ্রাম ব্যবহার করুন, তারপরে আপনার অ্যাপ্লিকেশনটিতে কেবল আপনি যে স্ট্রিংটি চান সেটির চিত্র সরবরাহ করতে অফসেটগুলি ব্যবহার করুন is ডিসপ্লেড।
ডেভ

2
অথবা এটি অর্জনের আরও প্রোগ্রামের পদ্ধতিতে নীচে জেভিটেলার উত্তর দেখুন।
ডেভ

4
জেভিটেলার উত্তর আরও ভাল। আমি বর্তমানে এটি ব্যবহার করছি। আপনি স্ট্যান্ডার্ড অ্যান্ড্রয়েড ভায়ার + ক্যানভাস থেকে ওপেনগল এ সরিয়ে যাওয়ার কারণটি (অন্যদের মধ্যে) গতির জন্য speed আপনার ওপেনগল ধরণের উপর একটি পাঠ্য বাক্স যুক্ত করা এটিকে উপেক্ষা করে।
শিবান ড্রাগন

166

কোনও টেক্সচারে টেক্সট রেন্ডারিং স্প্রেট টেক্সট ডেমো দেখতে যেমন দেখায় তার চেয়ে সহজ, মূল ধারণাটি হল ক্যানভাস ক্লাসটি একটি বিটম্যাপে রেন্ডার করার জন্য এবং তারপরে একটি বিটম্যাপকে একটি ওপেনএল টেক্সচারে পাস করা:

// Create an empty, mutable bitmap
Bitmap bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_4444);
// get a canvas to paint over the bitmap
Canvas canvas = new Canvas(bitmap);
bitmap.eraseColor(0);

// get a background image from resources
// note the image format must match the bitmap format
Drawable background = context.getResources().getDrawable(R.drawable.background);
background.setBounds(0, 0, 256, 256);
background.draw(canvas); // draw the background to our bitmap

// Draw the text
Paint textPaint = new Paint();
textPaint.setTextSize(32);
textPaint.setAntiAlias(true);
textPaint.setARGB(0xff, 0x00, 0x00, 0x00);
// draw the text centered
canvas.drawText("Hello World", 16,112, textPaint);

//Generate one texture pointer...
gl.glGenTextures(1, textures, 0);
//...and bind it to our array
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

//Create Nearest Filtered Texture
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

//Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);

//Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

//Clean up
bitmap.recycle();

5
এটি আমাকে ডিবাগিংয়ের জন্য আমার অ্যাপ্লিকেশনটিতে সামান্য fps কাউন্টারে প্রদর্শন করতে সহায়তা করেছে, ধন্যবাদ!
স্টিলথকপ্টার

2
আপনি যখন আপনার অন্যান্য টেক্সচার লোড করেন এবং তারপরে শব্দ বা সংখ্যা গঠনের জন্য সেগুলি একসাথে রাখেন তখন আপনি সমস্ত অক্ষর এবং সংখ্যা টেক্সচার হিসাবে তৈরি করতে ব্যবহার করতে পারেন। তারপরে এটি অন্য কোনও জিআল টেক্সচারের চেয়ে কম দক্ষ হবে না।
twDuke

9
এটি খুব ধীরে ধীরে, এটি সর্বদা পরিবর্তিত পাঠ্য (স্কোর ইত্যাদি) এর জন্য একটি গেমের উপরে fps মারবে, তবে এটি আধা-স্থির স্টাফ (খেলোয়াড়ের নাম, স্তরের নাম ইত্যাদি) জন্য ভাল কাজ করে।
নেতৃত্বে 42

3
আমি লক্ষ করতে চাই যে এই উত্তরের কোডটি সম্ভবত কেবলমাত্র একটি ডেমো এবং এটি এখনকার মতো অনুকূল নয়! আপনার নিজস্ব উপায়ে অপ্টিমাইজ / ক্যাশে করুন।
শেরিফ এল খতিব

1
আপনি ওপেনজিএল ইএস 2.0 এর জন্য এটি সরবরাহ করতে পারেন?
আনলিমিটেড

36

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

বিভিন্ন ফন্ট অ্যাটলাস জেনারেটরের তুলনায় আমার পদ্ধতির প্রধান সুবিধাটি হ'ল আপনি প্রতিটি ফন্টের তারতম্য এবং আকারের জন্য বড় বিটম্যাপগুলি প্রেরণ না করে আপনার প্রকল্পের সাহায্যে ছোট ফন্ট ফাইল (.ttf .otf) শিপ করতে পারেন। এটি কেবলমাত্র একটি ফন্ট ফাইল ব্যবহার করে যে কোনও রেজোলিউশনে নিখুঁত মানের ফন্ট তৈরি করতে পারে :)

টিউটোরিয়াল সম্পূর্ণ কোড যে কোনো প্রকল্পে ব্যবহার করা যেতে পারে অন্তর্ভুক্ত :)


আমি বর্তমানে এই সমাধানটি সন্ধান করছি, এবং আমি নিশ্চিত যে সময় মতো উত্তরটি খুঁজে পাব, তবে আপনার বাস্তবায়নটি কি কোনও রান সময় বরাদ্দ ব্যবহার করে?
নিক হার্টুং

@ নিক - সমস্ত বরাদ্দ (টেক্সচার, ভারটেক্স বাফারস, ইত্যাদি) একটি ফন্ট উদাহরণ তৈরি করার সময় সম্পন্ন হয়, ফন্ট উদাহরণ ব্যবহার করে স্ট্রিং রেন্ডারিংয়ের জন্য আর বরাদ্দ প্রয়োজন হয় না। সুতরাং আপনি রান সময়ে আর বরাদ্দ না দিয়ে "লোড টাইম" এ ফন্টটি তৈরি করতে পারেন।
free3dom 9

বাহ, দুর্দান্ত কাজ! আপনার পাঠ্য প্রায়শই পরিবর্তিত হয় সেই ক্ষেত্রে এটি সত্যই সহায়ক।
mdiener

রানটাইমটিতে ঘন ঘন পাঠ্য পরিবর্তন করতে হয় এমন অ্যাপ্লিকেশনগুলির জন্য এটি সর্বোত্তম উত্তর performance অ্যান্ড্রয়েডের জন্য এর চেয়ে সুন্দর আর কিছু দেখেনি। যদিও ওপেনজিএল ইএস-তে এটি কোনও বন্দর ব্যবহার করতে পারে।
গ্রিভেবল 31

1
আপনি যদি পাঠ্য সারিবদ্ধকরণ, লাইন ব্রেকগুলি ইত্যাদির সাথে ডিল করতে না চান - আপনি একটি টেক্সটভিউ ব্যবহার করতে পারেন। একটি টেক্সটভিউ সহজেই ক্যানভাসে রেন্ডার করা যায়। পারফরম্যান্স বুদ্ধি প্রদত্ত পদ্ধতির চেয়ে ভারী হওয়া উচিত নয়, আপনার প্রয়োজনীয় সমস্ত পাঠ্য রেন্ডার করতে আপনার কেবল একটি টেক্সটভিউ উদাহরণ প্রয়োজন। এইভাবে আপনি বিনামূল্যে এইচএমএল এইচএমএল ফর্ম্যাটিং পান।
Gena Batsyan

8

এই লিঙ্ক অনুযায়ী:

http://code.neenbedankt.com/how-to-render-an-android-view-to-a-bitmap

আপনি যে কোনও ভিউ বিটম্যাপে রেন্ডার করতে পারেন । এটি সম্ভবত ধরে নেওয়া উপযুক্ত যে আপনি যেমন প্রয়োজন তেমন একটি ভিউ বিন্যাস করতে পারেন (পাঠ্য, চিত্রগুলি সহ) এবং তারপরে এটি একটি বিটম্যাপে রেন্ডার করতে পারেন।

উপরের জেভিটেলার কোড ব্যবহার করা আপনার সেই বিটম্যাপটিকে একটি ওপেনএল টেক্সচার হিসাবে ব্যবহার করতে সক্ষম হওয়া উচিত।


হ্যাঁ, আমি এটি একটি গেমের মানচিত্রের সাথে করেছি এবং এটি একটি গ্লোভ টেক্সচারের সাথে আবদ্ধ করেছি যাতে মানচিত্র এবং ওপেনগল একত্রিত করুন। হ্যাঁ, সমস্ত মতামত ড্র (ক্যানভাস সি) এ রয়েছে এবং আপনি কোনও ক্যানভাস পাস করতে এবং কোনও বিটম্যাপে কোনও ক্যানভাসকে বেঁধে রাখতে পারেন।
এইচএমএমআরইড

7

সিবিএফজি এবং লোডিং / রেন্ডারিং কোডটির অ্যান্ড্রয়েড বন্দরটি দেখুন। আপনার কোডটি আপনার প্রকল্পে ফেলে দিতে এবং সরাসরি এটি ব্যবহার করতে সক্ষম হওয়া উচিত।

সিবিএফজি - http://www.codehead.co.uk/cbfg

অ্যান্ড্রয়েড লোডার - http://www.codehead.co.uk/cbfg/TexFont.java


6

আমি স্প্রাইট টেক্সট উদাহরণটি দেখেছিলাম এবং এ জাতীয় কাজের জন্য এটি অত্যন্ত জটিল দেখায়, আমি একটি টেক্সচারকেও রেন্ডারিং হিসাবে বিবেচনা করি, তবে পারফরম্যান্সের আঘাতের কারণে আমি উদ্বিগ্ন। এর পরিবর্তে আমাকে কেবল একটি দৃশ্যের সাথে যেতে হবে এবং সেই ব্রিজটি পার হওয়ার সময় পোর্টিংয়ের বিষয়ে চিন্তা করতে হবে :)



4

আইএমএইচও একটি গেমের ওপেনজিএল ইএস ব্যবহারের তিনটি কারণ রয়েছে:

  1. একটি মুক্ত স্ট্যান্ডার্ড ব্যবহার করে মোবাইল প্ল্যাটফর্মগুলির মধ্যে পার্থক্য এড়াতে;
  2. রেন্ডার প্রক্রিয়া আরও নিয়ন্ত্রণ করতে;
  3. জিপিইউ সমান্তরাল প্রক্রিয়াকরণ থেকে উপকৃত হতে;

গেম ডিজাইনে টেক্সট আঁকাই সর্বদা সমস্যা, কারণ আপনি জিনিসগুলি আঁকছেন তাই উইজেট ইত্যাদির সাথে আপনার কোনও সাধারণ ক্রিয়াকলাপের চেহারা এবং অনুভূতি থাকতে পারে না।

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

সর্বোত্তম উপায় হ'ল অঙ্কের সময়ে অলস স্মৃতি স্থানান্তর ক্রিয়াকলাপগুলি এড়ানোর জন্য কোডের শুরুর দিকের শিখর এবং টেক্সচারের জন্য দূরবর্তী বাফারগুলি (ভারটেক্স বাফার অবজেক্টস - ভিবিও) বরাদ্দ করা।

মনে রাখবেন যে গেম খেলোয়াড়েরা পাঠ্য পড়তে পছন্দ করেন না, তাই আপনি দীর্ঘ গতিশীল উত্পন্ন পাঠ্য লিখবেন না। লেবেলগুলির জন্য, আপনি সময় এবং স্কোরের জন্য গতিশীল পাঠ্য রেখে স্ট্যাটিক টেক্সচার ব্যবহার করতে পারেন এবং কয়েকটি অক্ষর দীর্ঘ দিয়ে উভয়ই সংখ্যাসূচক।

সুতরাং, আমার সমাধানটি সহজ:

  1. সাধারণ লেবেল এবং সতর্কতাগুলির জন্য টেক্সচার তৈরি করুন;
  2. 0-9, ":", "+" এবং "-" সংখ্যাগুলির জন্য টেক্সচার তৈরি করুন। প্রতিটি চরিত্রের জন্য একটি জমিন;
  3. স্ক্রিনের সমস্ত পদের জন্য রিমোট ভিবিও তৈরি করুন। আমি সেই অবস্থানগুলিতে স্থির বা গতিশীল পাঠ্য রেন্ডার করতে পারি, তবে ভিবিওগুলি স্থির;
  4. কেবলমাত্র একটি টেক্সচার ভিবিও তৈরি করুন, কারণ পাঠ্যটি সর্বদা একটি উপায়ে রেন্ডার করা হয়;
  5. ড্র সময়, আমি স্থির পাঠ্য রেন্ডার;
  6. গতিশীল পাঠ্যের জন্য, আমি ভিবিও অবস্থানটিতে উঁকি দিতে পারি, অক্ষরের টেক্সচারটি পেতে পারি এবং এটি আঁকতে পারি, একবারে একটি অক্ষর।

আপনি যদি দূরবর্তী স্ট্যাটিক বাফার ব্যবহার করেন তবে অঙ্কন অপারেশনগুলি দ্রুত।

আমি পর্দার অবস্থানগুলি (স্ক্রিনের তির্যক শতাংশের ভিত্তিতে) এবং টেক্সচার (স্ট্যাটিক এবং অক্ষর) সহ একটি এক্সএমএল ফাইল তৈরি করি এবং তারপরে রেন্ডারিংয়ের আগে আমি এই এক্সএমএলটি লোড করি।

উচ্চতর এফপিএস রেট পেতে, আপনার ড্র করার সময় ভিবিও তৈরি করা এড়ানো উচিত।


"ভিওবি" দ্বারা, আপনার অর্থ কি "ভিবিও" (ভার্টেক্স বাফার অবজেক্ট)?
ড্যান হাল্মে

3

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


3

দেখুন CBFGএবং লোডিং / রেন্ডারিং কোডটির অ্যান্ড্রয়েড বন্দর। আপনার কোডটি আপনার প্রকল্পে ফেলে দিতে এবং সরাসরি এটি ব্যবহার করতে সক্ষম হওয়া উচিত।

  1. CBFG

  2. অ্যান্ড্রয়েড লোডার

এই বাস্তবায়নে আমার সমস্যা আছে। এটি কেবলমাত্র একটি অক্ষর প্রদর্শন করে, যখন আমি ফন্টের বিটম্যাপের আকার পরিবর্তন করার চেষ্টা করি (আমার বিশেষ অক্ষরের প্রয়োজন) পুরো অঙ্কটি ব্যর্থ হয় :(


2

আমি এটি কয়েক ঘন্টার জন্য সন্ধান করেছি, এটি প্রথম নিবন্ধটি ছিল যা আমি পুরোপুরি এসেছি এবং যদিও এর সেরা উত্তর রয়েছে, তবে আমার কাছে সর্বাধিক জনপ্রিয় উত্তরগুলি দাগী নয়। অবশ্যই আমার যা প্রয়োজন ছিল তার জন্য ওয়েইচসেলের এবং শকাজেদের উত্তরগুলি ঠিক বোতামে ছিল তবে নিবন্ধগুলিতে কিছুটা অস্পষ্ট। আপনাকে প্রজেক্টে ডেকে আনতে। এখানে: বিদ্যমান বিদ্যমান নমুনার ভিত্তিতে একটি নতুন অ্যান্ড্রয়েড প্রকল্প তৈরি করুন। অ্যাপিডেমোস চয়ন করুন:

উত্স ফোল্ডারের নিচে দেখুন

ApiDemos/src/com/example/android/apis/graphics/spritetext

এবং আপনার প্রয়োজনীয় সমস্ত জিনিস আপনি খুঁজে পাবেন।


1

জন্য স্ট্যাটিক টেক্সট :

  • আপনার পিসিতে ব্যবহৃত সমস্ত শব্দের সাথে একটি চিত্র তৈরি করুন (উদাহরণস্বরূপ জিম্প সহ)।
  • এটি একটি টেক্সচার হিসাবে লোড করুন এবং এটি বিমানের জন্য উপাদান হিসাবে ব্যবহার করুন।

জন্য দীর্ঘ টেক্সট যে চাহিদা কখনোসখনো আপডেট করা:

  • অ্যান্ড্রয়েড একটি বিটম্যাপ ক্যানভাসে আঁকুন (জেভিটেলার সমাধান)।
  • এটি একটি প্লেনের উপাদান হিসাবে লোড করুন।
  • প্রতিটি শব্দের জন্য বিভিন্ন টেক্সচার সমন্বয় ব্যবহার করুন।

জন্য একটি সংখ্যা (00.0 ফরম্যাট):

  • সমস্ত সংখ্যা এবং একটি বিন্দু সহ একটি চিত্র তৈরি করুন।
  • এটি একটি প্লেনের উপাদান হিসাবে লোড করুন।
  • শেডার নীচে ব্যবহার করুন।
  • আপনার অনড্র ইভেন্টে কেবল শেডারকে প্রেরিত মান ভেরিয়েবল আপডেট করুন।

    precision highp float;
    precision highp sampler2D;
    
    uniform float uTime;
    uniform float uValue;
    uniform vec3 iResolution;
    
    varying vec4 v_Color;
    varying vec2 vTextureCoord;
    uniform sampler2D s_texture;
    
    void main() {
    
    vec4 fragColor = vec4(1.0, 0.5, 0.2, 0.5);
    vec2 uv = vTextureCoord;
    
    float devisor = 10.75;
    float digit;
    float i;
    float uCol;
    float uRow;
    
    if (uv.y < 0.45) {
        if (uv.x > 0.75) {
            digit = floor(uValue*10.0);
            digit = digit - floor(digit/10.0)*10.0;
            i = 48.0 - 32.0 + digit;
            uRow = floor(i / 10.0);
            uCol = i - 10.0 * uRow;
            fragColor = texture2D( s_texture, uv / devisor * 2.0 + vec2((uCol-1.5) / devisor, uRow / devisor) );
        } else if (uv.x > 0.5) {
            uCol = 4.0;
            uRow = 1.0;
            fragColor = texture2D( s_texture, uv / devisor * 2.0 + vec2((uCol-1.0) / devisor, uRow / devisor) );
        } else if (uv.x > 0.25) {
            digit = floor(uValue);
            digit = digit - floor(digit/10.0)*10.0;
            i = 48.0 - 32.0 + digit;
            uRow = floor(i / 10.0);
            uCol = i - 10.0 * uRow;
            fragColor = texture2D( s_texture, uv / devisor * 2.0 + vec2((uCol-0.5) / devisor, uRow / devisor) );
        } else if (uValue >= 10.0) {
            digit = floor(uValue/10.0);
            digit = digit - floor(digit/10.0)*10.0;
            i = 48.0 - 32.0 + digit;
            uRow = floor(i / 10.0);
            uCol = i - 10.0 * uRow;
            fragColor = texture2D( s_texture, uv / devisor * 2.0 + vec2((uCol-0.0) / devisor, uRow / devisor) );
        } else {
            fragColor = vec4(0.0, 0.0, 0.0, 0.0);
        }
    } else {
        fragColor = vec4(0.0, 0.0, 0.0, 0.0);
    }
    gl_FragColor = fragColor;
    
    }

উপরের কোডটি একটি টেক্সচার অ্যাটলাসের জন্য কাজ করে যেখানে ফন্ট অ্যাটলাসের (টেক্সচার) দ্বিতীয় সারির 7 ম কলামে সংখ্যা 0 থেকে শুরু হয়।

বিক্ষোভের জন্য https://www.shadertoy.com/view/Xl23Dw দেখুন (যদিও ভুল টেক্সচার সহ)


0

ওপেনএল ইএস 2.0 / 3.0 এ আপনি ওজিএল ভিউ এবং অ্যান্ড্রয়েডের ইউআই-উপাদানগুলিও একত্রিত করতে পারেন:

public class GameActivity extends AppCompatActivity {
    private SurfaceView surfaceView;
    @Override
    protected void onCreate(Bundle state) { 
        setContentView(R.layout.activity_gl);
        surfaceView = findViewById(R.id.oglView);
        surfaceView.init(this.getApplicationContext());
        ...
    } 
}

public class SurfaceView extends GLSurfaceView {
    private SceneRenderer renderer;
    public SurfaceView(Context context) {
        super(context);
    }

    public SurfaceView(Context context, AttributeSet attributes) {
        super(context, attributes);
    }

    public void init(Context context) {
        renderer = new SceneRenderer(context);
        setRenderer(renderer);
        ...
    }
}

বিন্যাস ক্রিয়াকলাপ তৈরি করুন: gl.xml:

<?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
        tools:context=".activities.GameActivity">
    <com.app.SurfaceView
        android:id="@+id/oglView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <TextView ... />
    <TextView ... />
    <TextView ... />
</androidx.constraintlayout.widget.ConstraintLayout>

রেন্ডার থ্রেড থেকে উপাদানগুলি আপডেট করতে, হ্যান্ডলার / লুপার ব্যবহার করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.