আমি ওপেনজিএল ইএস ২.০ (আপাতত আইওএস) ব্যবহার করে একটি 2 ডি গেম ইঞ্জিন তৈরি করার চেষ্টা করছি। আমি উদ্দেশ্য সি তে অ্যাপ্লিকেশন স্তর লিখেছি এবং সি ++ এ আলাদা আলাদা রেন্ডারার জিএলএস 20 রয়েছে। রেন্ডারারের বাইরে কোনও জিএল নির্দিষ্ট কল করা হয় না। এটি নিখুঁতভাবে কাজ করছে।
শেডার ব্যবহার করার সময় আমার কাছে কিছু নকশার সমস্যা রয়েছে। প্রতিটি শ্যাডারের নিজস্ব অনন্য বৈশিষ্ট্য এবং ইউনিফর্ম রয়েছে যা মূল ড্র কল (এই ক্ষেত্রে glDrawArrays) এর ঠিক আগে সেট করা দরকার। উদাহরণস্বরূপ, কিছু জ্যামিতি আঁকতে আমি এটি করব:
void RendererGLES20::render(Model * model)
{
// Set a bunch of uniforms
glUniformMatrix4fv(.......);
// Enable specific attributes, can be many
glEnableVertexAttribArray(......);
// Set a bunch of vertex attribute pointers:
glVertexAttribPointer(positionSlot, 2, GL_FLOAT, GL_FALSE, stride, m->pCoords);
// Now actually Draw the geometry
glDrawArrays(GL_TRIANGLES, 0, m->vertexCount);
// After drawing, disable any vertex attributes:
glDisableVertexAttribArray(.......);
}
আপনি দেখতে পাচ্ছেন এই কোডটি অত্যন্ত কঠোর। আমি যদি অন্য শেডার ব্যবহার করতে চাই, রিপল ইফেক্টটি বলি, আমাকে অতিরিক্ত ইউনিফর্ম, ভার্টেক্স অ্যাট্রিবিবগুলি পাস করার প্রয়োজন হবে অন্য কথায় আমাকে কেবল নতুন শেডার অন্তর্ভুক্ত করার জন্য রেন্ডারগারজিএলএস 20 রেন্ডার উত্স কোডটি পরিবর্তন করতে হবে।
শেডার অবজেক্টটি সম্পূর্ণ জেনেরিক করার কোনও উপায় আছে কি? লাইক যদি আমি কেবল ছায়াময় বস্তুটি পরিবর্তন করতে এবং গেম উত্সটি পুনরায় সংকলন সম্পর্কে চিন্তা না করি তবে কী হবে? ইউনিফর্ম এবং বৈশিষ্ট্য ইত্যাদির রেন্ডারারকে অজ্ঞেয় বানানোর কোনও উপায়? যদিও আমাদের ইউনিফর্মগুলিতে ডেটা পাস করতে হবে, এটি করার সবচেয়ে ভাল জায়গাটি কী? মডেল ক্লাস? মডেল শ্রেণি শেডার নির্দিষ্ট ইউনিফর্ম এবং বৈশিষ্ট্য সম্পর্কে সচেতন?
অভিনেতা শ্রেণীর নিম্নলিখিত শো:
class Actor : public ISceneNode
{
ModelController * model;
AIController * AI;
};
মডেল কন্ট্রোলার ক্লাস: ক্লাস মডেলকন্ট্রোলার {শ্রেণি ইশাদার * শেডার; int টেক্সচারআইড; vec4 আভা; ভাসা আলফা; স্ট্রাক্ট ভার্টেক্স * ভার্টেক্সআরে; };
শেডার শ্রেণিতে শ্যাডার অবজেক্ট, সংকলন এবং উপ-রুটিনগুলি সংযুক্তকরণ ইত্যাদি রয়েছে just
গেম লজিক ক্লাসে আমি আসলে অবজেক্টটি রেন্ডার করছি:
void GameLogic::update(float dt)
{
IRenderer * renderer = g_application->GetRenderer();
Actor * a = GetActor(id);
renderer->render(a->model);
}
দয়া করে মনে রাখবেন যে অভিনেতা আইসিননোড বাড়িয়ে দিলেও আমি এখনও সিনগ্রাফ প্রয়োগ করতে শুরু করি নি। আমি এই সমস্যাটি সমাধান করার সাথে সাথে এটি করব।
এই উন্নতি করতে কোন ধারণা? সম্পর্কিত নকশা নিদর্শন ইত্যাদি?
প্রশ্নটি পড়ার জন্য আপনাকে ধন্যবাদ।