আমার আগের নিবন্ধে পার্ল 5 এর ডিজাইন এবং এটির উপযুক্ততাকে "আঠালো ভাষা" হিসাবে বর্ণনা করে, আমি উল্লেখ করেছি যে আমি আগে ব্যাশের জন্য OpenGL বাইন্ডিং লিখেছিলাম। এটি সম্ভবত কোনও প্রমাণ ছাড়াই করা একটি বিবৃতিতে খুব অবিশ্বাস্য ছিল, তাই আমি আমার হার্ড ড্রাইভের ধুলোময় কোণে ফিরে গিয়েছিলাম, এটি খুঁড়ে বের করেছিলাম, এটিকে কিছুটা সতেজ করেছিলাম, ফন্ট সমর্থন উন্নত করেছিলাম, ডকুমেন্টেশন লিখেছিলাম এবং এটি প্রকাশ করেছিলাম আমার সাইট এবং গিটহাবে। (আপনাকে ব্যাশ এবং ওপেনজিএল উভয় সমর্থন সহ একটি সিস্টেমের প্রয়োজন হবে যাতে এটি সরাসরি অভিজ্ঞতা লাভ করে, তবে এখানে একটি ভিডিও রয়েছে৷)
তাই এখন আমার স্বীকারোক্তি:DeLorean ড্যাশবোর্ডের পার্ল গ্রাফিক্স যা আমি My DeLorean রান পার্ল এ বর্ণনা করেছি Bash প্রকল্পের জন্য আমার OpenGL এর সাথে একটি ইতিহাস শেয়ার করুন। একটি মজার এবং বিদ্রূপাত্মক মোড়ের মধ্যে, আমি মূলত 13 বছর আগে হিমায়িত বুদবুদ দেখার পরে এবং আমার প্রযুক্তিগত সংবেদনশীলতাকে বিরক্ত করার পরে এই প্রকল্পটি শুরু করেছিলাম যে কেউ পার্লে একটি রিয়েল-টাইম ভিডিও গেম লিখেছেন৷ তখন, আমার প্রাথমিক ভাষা ছিল C++, এবং আমি ভিডিও গেমের উদ্দেশ্যে OpenGL পড়ছিলাম। আমি আমার বন্ধুদের কাছে ঘোষণা করেছি যে একমাত্র জিনিসটি আরও খারাপ হবে যদি এটি 3D হত এবং বাশে লেখা হত। ধারণাটি উচ্চস্বরে বলার পরে, এটি আমাকে উৎসাহিত করতে থাকে এবং আমি অবশেষে এটিকে রিয়েল-টাইম গ্রাফিক্সের জন্য পার্ল ব্যবহার করার "ভয়াবহতা" এক করার চেষ্টা করার সিদ্ধান্ত নিয়েছিলাম।
ব্যাশ প্রসারিত করা হচ্ছে
Bash-এ OpenGL সমর্থন যোগ করার সবচেয়ে সরাসরি উপায় হল সোর্স কোড পরিবর্তন করা এবং প্রতিটি OpenGL ফাংশনকে শেল "বিল্টিন" হিসাবে যুক্ত করা; যাইহোক, একমাত্র লোকেরা যারা এটি অনুভব করতে সক্ষম হবেন তারাই ব্যাশের একটি কাস্টম সংস্করণ ইনস্টল করতে ইচ্ছুক, এবং সম্ভবত কেউ এটি করতে চাইবে না। এটা "ব্যাশ উপায়" করার চেতনায়ও মনে হয় না।
তারপরে আমি একটি ক্লায়েন্ট-সার্ভারের ধারণা নিয়ে এসেছি, যেখানে প্রতিটি ওপেনজিএল ফাংশন পাথে ইনস্টল করা হবে এবং একটি ক্লায়েন্টকে আমন্ত্রণ জানাবে যেটি একটি ওপেনজিএল সার্ভারের সাথে সংযোগ করবে যাতে সেই ফাংশনটি চালানোর জন্য একটি বার্তা সরবরাহ করা যায়। এটি একটি আনন্দদায়ক "ভয়াবহ" সমাধান হত, কিন্তু আমি যতই কঠিন জিনিসগুলিকে অপ্টিমাইজ করি না কেন, সামগ্রিক লক্ষ্যে আমি সফল হয়েছি তা বলা আমার পক্ষে এখনও খুব ধীর ছিল৷
অবশেষে, আমি একটি ডিজাইনে স্থির হয়েছি যেখানে আমার একটি "ওপেনজিএল ইন্টারপ্রেটার" প্রক্রিয়া থাকবে যা স্ট্যান্ডার্ড-ইন-এ ওপেনজিএল কমান্ড পড়বে এবং যেকোনো ব্যবহারকারীর ইনপুট ইভেন্টকে স্ট্যান্ডার্ড-আউটে লিখবে। তারপর একটি Bash স্ক্রিপ্ট পাইপের সাথে সংযুক্ত এই দোভাষীটি শুরু করতে পারে এবং প্রতিটি OpenGL কমান্ড একটি Bash ফাংশন হতে পারে যা পাইপে লিখতে পারে। আমি যখন এটিতে ছিলাম, তখন আমি আমার দক্ষতার কৌশলগুলির সম্পূর্ণ ব্যাগে ফেলে দেওয়ার সিদ্ধান্ত নিয়েছিলাম এবং কিছু স্ট্যাটিকভাবে কম্পাইল করা হ্যাশ টেবিল এবং লাল-কালো গাছগুলির সাথে প্লেইন সি তে দোভাষী লিখব৷
ওপেনজিএল তাৎক্ষণিক মোড
OpenGL এর বিশদ বিবরণ যেখানে এই প্রকল্পটি DeLorean ড্যাশবোর্ড প্রকল্পের সাথে ছেদ করতে শুরু করে। প্রথমে, আমি একধাপ পিছিয়ে যাব এবং OpenGL API রিক্যাপ করব।
OpenGL হল একটি প্রোগ্রাম লেখার বিষয়ে যা 3D স্থানাঙ্ক এবং টেক্সচারের পরিপ্রেক্ষিতে এর গ্রাফিক্সের পরিকল্পনা করে, তারপর সেই ডেটা গ্রাফিক্স কার্ডে পাঠায় যাতে একটি 2D স্ক্রিনে রেন্ডার করা হয়। সত্যিই সরলীকৃত হতে হলে, স্ক্রীনের যে অঞ্চলটি আঁকা হচ্ছে তা বর্ণনা করতে আপনি ব্যবহার করেন গণিতের একটি সেট এবং সেই অঞ্চলের প্রতিটি পিক্সেলের রঙ বর্ণনা করার জন্য গণিতের একটি সেট রয়েছে৷
একটি ভার্চুয়াল 3D স্পেসে একটি ত্রিভুজের তিনটি কোণ বর্ণনা করা সবচেয়ে সাধারণ ক্রিয়াকলাপ, OpenGL কে 2D স্ক্রিনে সেটি কোথায় ল্যান্ড করে তা বের করতে দিন, তারপরে সেই এলাকা জুড়ে একটি 2D চিত্র প্রসারিত করতে বলুন, হতে পারে অন্য চিত্রের সাথে মিলিত বা পরিবর্তিত কিছু উজ্জ্বলতা গণনা দ্বারা। প্রোগ্রামের প্রধান লুপ বাফারটি মুছে ভিডিওর একটি ফ্রেম তৈরি করে, দেখা যায় এমন প্রতিটি বহুভুজ প্লট করে এবং এটিকে স্ক্রিনে পাঠায়। আপনি যদি এই পুরো স্টান্টটি 16 মিলিসেকেন্ড বা তার কম সময়ে টেনে আনেন, তাহলে আপনি প্রতি সেকেন্ডে 60টি ফ্রেম বজায় রাখতে পারবেন এবং চমৎকার তরল গ্রাফিক্স থাকতে পারবেন।
আমি ওপেনজিএল এপিআই এর উৎপত্তি সম্পর্কে কর্তৃপক্ষের সাথে কথা বলতে পারি না, তবে এটি বেশ পরিষ্কার বলে মনে হচ্ছে যে এটি স্ট্রিমিংয়ের ধারণার চারপাশে তৈরি করা হয়েছে, সম্ভবত X11 ডিসপ্লে প্রোটোকলের সাথে সামঞ্জস্যপূর্ণ হতে পারে, তবে এটি একটি ভাল ধারণা। সুতরাং, বেশিরভাগ OpenGL ফাংশনের রিটার্ন মান থাকে না, অন্যান্য API-এর বিপরীতে যেখানে প্রতিটি ফাংশন কল একটি স্ট্যাটাস প্রদান করে যা আপনাকে অপারেশনের ফলাফল বলে। আপনি যদি একটি OpenGL ফাংশন কল্পনা করেন যেমন glVertex3f(1,2,3)
একটি মুদ্রণ বিবৃতি হিসাবে যা একটি পাইপের উপর তিনটি সংখ্যা লিখে, আপনি একটি সুন্দর ধারণা পেয়েছেন কিভাবে এটি পর্দার পিছনে কাজ করে। আসলে, ব্যাশ বাইন্ডিংয়ের জন্য, আমি আক্ষরিক অর্থে glVertex 1 2 3
লিখি পাইপের উপরে যখন glVertex 1 2 3
মৃত্যুদন্ড কার্যকর করা হয়। ব্যাশ স্ক্রিপ্ট অন্ধভাবে চলে, কোনো ধারণা ছাড়াই এর গ্রাফিক্স কমান্ডগুলি উদ্দেশ্য অনুযায়ী কিছু করছে কিনা।
কয়েক বছর ধরে ওপেনজিএল এপিআই-তে বেশ কয়েকটি বড় পরিমার্জন হয়েছে, এবং লোকেরা তাদের বইগুলিতে সম্পূর্ণ অধ্যায়গুলি "রিটেইনড" বনাম "তাত্ক্ষণিক" মোড সম্পর্কে লেখে, কিন্তু এটি সবই দুটি ধারণার মধ্যে ফুটে ওঠে:
- প্রত্যেক ফ্রেমের পাইপের উপর দিয়ে সেই সমস্ত ডেটা পুনরায় পাঠানো ধীরগতির, তাই এর কিছু অন্য প্রান্তে ক্যাশে করা যাক৷
- আমরা অন্তর্নির্মিত গণিত দিয়ে কখনই সবার চাহিদা পূরণ করতে পারি না, তাই আসুন মানুষকে তাদের নিজস্ব কাস্টম গণিত বর্ণনা করার জন্য একটি ভাষা দিই।
এতে বলা হয়েছে, নতুন OpenGL API-এর দ্বারা প্রদত্ত ক্যাশিং এবং কাস্টম গণিতগুলি অনেক বেশি দক্ষ এবং অবশ্যই শীর্ষ-স্তরের ভিডিও গেমগুলির জন্য প্রয়োজনীয়, তারা সেট আপ করার এবং কাজ করার (এবং শিখতে) আরও বেশি প্রচেষ্টা করে এবং সম্ভবত এর চেয়ে বেশি ক্ষতি করে শখীদের জন্য ভাল। আপনি উন্নত গ্রাফিক্স প্রভাব বা উচ্চ-বিস্তারিত মডেলগুলি না করলে এগুলি অপ্রয়োজনীয়।
তাই, যদিও ব্যাশ ওপেনজিএল বাইন্ডিং শুধুমাত্র "অপ্রচলিত" API-এর সাথে ডিল করে, তবুও আমি লোকেদের শিক্ষা এবং টিঙ্কারিং উদ্দেশ্যে এটি দেখতে উৎসাহিত করি।
তালিকা প্রদর্শন করুন
সৌভাগ্যবশত, মূল OpenGL API এর কিছু ক্যাশিং প্রক্রিয়া রয়েছে এবং সেগুলি ব্যবহার করা সহজ। তারা মোটামুটিভাবে এর ক্রম ধরে কাজ করে:
"আরে OpenGL, আমি চাই আপনি দূরবর্তী প্রান্তে অবজেক্ট 37 তৈরি করুন"
"এখানে কিছু ডেটা বর্ণনা করে অবজেক্ট 37"
"পরবর্তী রেন্ডারিং ধাপে অবজেক্ট 37 ব্যবহার করুন"
এটিকে আরও সহজ করতে, ব্যাশ বাইন্ডিং আপনাকে সংখ্যার পরিবর্তে নাম ব্যবহার করতে দেয়।
প্রথম প্রধান ধরনের অবজেক্ট হল টেক্সচার, যেখানে আপনি গ্রাফিক্স কার্ডে একটি 2D ইমেজ লোড করেন এবং তারপর এটি দিয়ে বহুভুজ "পেইন্ট" করুন। দ্বিতীয়টি হল "ডিসপ্লে তালিকা", যেখানে আপনি OpenGL কমান্ডের একটি ক্রম রেকর্ড করেন, তারপরে সেগুলিকে একটি একক OpenGL কমান্ডের মতো করে চালান৷
প্রদর্শন তালিকাগুলি অ্যাড-হক প্রোটোটাইপিংয়ের জন্য দুর্দান্ত কাজ করে। আপনি সাধারণ ভার্টেক্স কমান্ড ব্যবহার করে আপনার 3D (বা 2D) মডেলের বর্ণনা দিয়ে কিছু পয়েন্ট প্লট করতে পারেন, তারপর সেই পয়েন্টের ক্রমটি একটি প্রদর্শন তালিকা হিসাবে রেকর্ড করুন এবং এখন আপনি একটি একক কমান্ডের মাধ্যমে সেই মডেলটিকে রেন্ডার করতে পারেন৷
এই শক্তির একটি উদাহরণের জন্য, উদাহরণ ডিরেক্টরিতে Robot.sh দেখুন। এটি স্টার্টআপের সময় রোবটের শরীরের প্রতিটি অংশের জন্য একটি প্রদর্শন তালিকা তৈরি করে এবং চালানোর সময়, এটি রোবটকে রেন্ডার করার জন্য প্রতি ফ্রেমে শুধুমাত্র 58 টি লাইন পাঠ্য নির্গত করে। ব্যাশ খুব সহজে 16 মিলিসেকেন্ডে 58 লাইনের টেক্সট তৈরি করতে পারে (এটি এমনকি 12 বছর আগেও পারত), তাই ডেমো সাধারণ হার্ডওয়্যারে পূর্ণ গতিতে চলতে সক্ষম হয়েছিল।
ডিলোরিয়ান ড্যাশবোর্ড সফ্টওয়্যারে আমি যে পার্ল গ্রাফিক্স ব্যবহার করছি তা প্রদর্শনের তালিকাগুলি হল প্রাথমিক কৌশল। C-এর তুলনায় পার্ল ফাংশন কলগুলি কিছুটা ব্যয়বহুল, বিশেষ করে OpenGL 1.4-এর মতো একটি ফাংশন-ভারী API-এর জন্য, কিন্তু ডিসপ্লে তালিকায় জিনিসগুলিকে একত্রিত করে, প্রতি ভিডিও ফ্রেমে পার্লের খুব বেশি কাজ করতে হয় না। আমি যদি ব্যাশ প্রকল্পের জন্য এই কৌশলটি না শিখতাম, তাহলে পার্ল প্রকল্পটি প্রায় ততটা সফল হতো না।
আমি কেন এটি 12 বছর আগে প্রকাশ করিনি?
যখন আমি বাশে কিছু অভিনব অ্যানিমেশন ডেমো তৈরি করতে সক্ষম হয়েছিলাম, তখন আমার আসল লক্ষ্য ছিল এটি দিয়ে একটি সম্পূর্ণ গেম তৈরি করা। আমি পুরানো ফ্লাইট-সিম গেম টার্মিনাল ভেলোসিটির একটি ক্লোনের জন্য লক্ষ্য করছিলাম, এবং আমি এমন একটি স্পেসশিপ পেয়েছি যা কিউবগুলির একটি ক্ষেত্র দিয়ে উড়তে পারে (উদাহরণে Flight.sh দেখুন), কিন্তু পরবর্তী সমস্যাটি ছিল সংঘর্ষ সনাক্তকরণ। Bash-এ উপলব্ধ আদিমগুলি হল ভেরিয়েবলের নাম এবং অ্যারে ভেরিয়েবলের বৈশ্বিক "অ্যাসোসিয়েটিভ অ্যারে" (যদিও সংস্করণ 4-এ এখন সহযোগী-অ্যারে ভেরিয়েবল রয়েছে), এবং সমস্ত গণিত পূর্ণসংখ্যা। যখন আমি ফিক্সড-পয়েন্ট পূর্ণসংখ্যা গণিতে 3D ম্যাট্রিক্স ঘূর্ণন বন্ধ করতে সক্ষম হয়েছিলাম, তখন সংঘর্ষ শনাক্তকরণ বাস্তবায়ন করা একটি বড় বাধার মতো দেখায়। আমি আমার ফন্ট API নিয়েও সন্তুষ্ট ছিলাম না। এই সমস্যাগুলির সমাধানের চিন্তা করার সময়, প্রকল্পটি ধীরে ধীরে আমার তালিকা থেকে বাদ পড়ে যায়৷
৷এখানেই আমি উপসংহারে পৌঁছেছি (যেমন আমি লিখেছিলাম), "বাশ একটি ভয়ঙ্কর আঠালো ভাষা।" যদিও এই প্রকল্পটি একটি কৌতুক হিসাবে শুরু হয়েছিল এবং শেষ হয়েছিল (বা শিক্ষার সরঞ্জাম, হতে পারে), পার্লের একই প্রোগ্রাম শৈলীটি বাস্তব অ্যাপ্লিকেশনগুলির জন্য বেশ কার্যকর বলে প্রমাণিত হয়েছিল। আমি যদি 13 বছর আগে ফ্রোজেন বাবলকে আরও গুরুত্ব সহকারে বিবেচনা করতাম, তাহলে আমি হয়তো আমার এখন-প্রিয় ভাষা পার্লে শুরু করতে পারতাম।
বাগ ফিক্স বাদ দিয়ে এই প্রজেক্টটিকে উন্নত করার কোনো পরিকল্পনা আমার নেই, তবে আমি মনে করেছি যে এটি অন্ততপক্ষে OpenGL-এর ধারণা শিখতে চায় এমন লোকেদের জন্য উপযোগী হতে পারে বা যাদের অনেক অবসর সময় আছে এবং একটি Doom লেখার প্রবল ইচ্ছা আছে M4 এ ক্লোন।
উপভোগ করুন! এবং এই লিঙ্কটি ফরোয়ার্ড করে মজা নিন, অন্যথায়, কেউ আপনাকে বিশ্বাস করবে না।