আমি আমার মাথা চারপাশে মোড়ানো কিভাবে মত উপাদান সিস্টেম চেষ্টা করছি এই , এই প্রয়োগ করা হয়। এই শক্তিশালী এবং ব্যবহারকারী-বান্ধব, গ্রাফের মতো সিস্টেমগুলি প্রোগ্রামার এবং নন-প্রোগ্রামারকে একইভাবে শেডার তৈরি করার অনুমতি দেওয়ার একটি পদ্ধতি হিসাবে তুলনামূলকভাবে সাধারণ বলে মনে হয় । তবে গ্রাফিক্স প্রোগ্রামিংয়ের সাথে আমার তুলনামূলক সীমিত অভিজ্ঞতা থেকে তারা কীভাবে কাজ করে তা আমি পুরোপুরি নিশ্চিত নই।
পটভূমি:
সুতরাং, যখন আমি আগে সাধারণ ওপেনএল রেন্ডারিং সিস্টেমগুলি প্রোগ্রাম করেছিলাম তখন আমি সাধারণত একটি উপাদান শ্রেণি তৈরি করি যা স্ট্যাটিক জিএলএসএল ফাইলগুলি থেকে ম্যানুয়ালি তৈরি করা শ্যাডারগুলি লোড, সংকলন এবং লিঙ্ক করে। আমি সাধারণত জিএলএসএল ইউনিফর্ম ভেরিয়েবলগুলি অ্যাক্সেসের জন্য একটি সাধারণ মোড়ক হিসাবে এই বর্গটি তৈরি করি। একটি সাধারণ উদাহরণ হিসাবে, কল্পনা করুন যে আমার কাছে একটি টেক্সচার পাস করার জন্য অতিরিক্ত ইউনিফর্ম টেক্সচার 2 ডি সহ একটি বেসিক ভার্টেক্স শেডার এবং টুকরা শেডার রয়েছে। আমার মেটেরিয়াল ক্লাসটি কেবলমাত্র এই দুটি শেডারগুলিকে কোনও উপাদানের মধ্যে লোড এবং সংকলন করতে পারে এবং সেই বিন্দু থেকে sha শেডারের টেক্সচার 2 ডি ইউনিফর্মটি পড়ার / লেখার জন্য একটি সাধারণ ইন্টারফেসটি প্রকাশ করে।
এই সিস্টেমটিকে কিছুটা আরও নমনীয় করে তোলার জন্য, আমি সাধারণত এটিকে এমনভাবে লিখি যা কোনও নাম / টাইপের ইউনিফর্ম পাস করার চেষ্টা করতে আমাকে অনুমতি দেয় [যেমন: সেট ইউনিফর্ম_ভেক 4 ("অ্যাম্বিয়েন্ট কালার", কালারভেক 4); যা অ্যাম্বিয়েন্ট কালার ইউনিফর্মটিকে নির্দিষ্ট 4 ডি ভেক্টরে "রঙভেক 4" বলে সেট করে যদি উপাদানটিতে এই ইউনিফর্মটি বিদ্যমান থাকে।] ।
class Material
{
private:
int shaderID;
string vertShaderPath;
string fragSahderPath;
void loadShaderFiles(); //load shaders from files at internal paths.
void buildMaterial(); //link, compile, buffer with OpenGL, etc.
public:
void SetGenericUniform( string uniformName, int param );
void SetGenericUniform( string uniformName, float param );
void SetGenericUniform( string uniformName, vec4 param );
//overrides for various types, etc...
int GetUniform( string uniformName );
float GetUniform( string uniformName );
vec4 GetUniform( string uniformName );
//etc...
//ctor, dtor, etc., omitted for clarity..
}
এটি কাজ করে তবে এটি একটি খারাপ সিস্টেমের মতো অনুভূত হয়েছে যে মেটেরিয়াল ক্লাসের ক্লায়েন্টকে বিশ্বাসের ভিত্তিতে ইউনিফর্মগুলি অ্যাক্সেস করতে হবে - ব্যবহারকারীকে প্রতিটি বস্তুতে যে ইউনিফর্ম রয়েছে তা সম্পর্কে কিছুটা সচেতন হতে হবে কারণ তারা বাধ্য হয়েছে তাদের জিএলএসএল নাম দিয়ে তাদের পাস করুন। যখন এটি সিস্টেমের সাথে কেবল 1-2 জন লোক কাজ করে, তখন এটি কোনও বিশাল চুক্তি নয়, তবে আমি ভাবতে পারি না যে এই সিস্টেমটি খুব ভালভাবে স্কেল হবে এবং একটি ওপেনএল রেন্ডারিং সিস্টেমের প্রোগ্রামিংয়ে আমার পরবর্তী প্রচেষ্টা করার আগে, আমি স্তর করতে চাই কিছুটা উপরে
প্রশ্ন:
আমি এখন পর্যন্ত সেখানেই রয়েছি, তাই আমি অন্যান্য রেন্ডারিং ইঞ্জিনগুলি কীভাবে তাদের উপাদানগুলি পরিচালনা করে তা অধ্যয়ন করার চেষ্টা করছি।
এই নোড-ভিত্তিক পদ্ধতির দুর্দান্ত এবং এটি আধুনিক ইঞ্জিন এবং সরঞ্জামগুলিতে ব্যবহারকারী বান্ধব উপাদান সিস্টেম তৈরির জন্য একটি অত্যন্ত সাধারণ সিস্টেম বলে মনে হচ্ছে। আমি যা বলতে পারি সেগুলি থেকে তারা গ্রাফের ডেটা কাঠামোর উপর ভিত্তি করে চলেছে যেখানে প্রতিটি নোড আপনার উপাদানের কিছু ছাঁকুনির দিকটি উপস্থাপন করে এবং প্রতিটি পথ তাদের মধ্যে কোনও না কোনও সম্পর্ককে উপস্থাপন করে।
আমি যেটুকু বলতে পারি, সেই ধরণের সিস্টেমটি প্রয়োগ করা যেমন বিভিন্ন সাবক্লাসের (টেক্সচারনড, ফ্লোটনোড, লার্পনোড ইত্যাদি) একটি ম্যাটেরিয়ালনোড শ্রেণি হিসাবে সহজ। যেখানে প্রতিটি ম্যাটারিয়ালনোড সাবক্লাসে মেটিরিয়াল সংযোগ থাকবে।
class MaterialConnection
{
MatNode_Out * fromNode;
MatNode_In * toNode;
}
class LerpNode : MaterialNode
{
MatNode_In x;
MatNode_In y;
MatNode_In alpha;
MatNode_Out result;
}
এটি খুব প্রাথমিক ধারণা, তবে এই ব্যবস্থার কয়েকটি দিক কীভাবে কাজ করবে সে সম্পর্কে আমি কিছুটা অনিশ্চিত:
১) আপনি যদি অবাস্তব ইঞ্জিন 4 ব্যবহার করে এমন বিভিন্ন 'মেটেরিয়াল এক্সপ্রেশন' (নোড) দেখেন তবে আপনি দেখতে পাবেন যে তাদের প্রত্যেকেরই বিভিন্ন ধরণের ইনপুট এবং আউটপুট সংযোগ রয়েছে। কিছু নোড আউটপুট ভাসমান, কিছু আউটপুট ভেক্টর 2, কিছু আউটপুট ভেক্টর 4 ইত্যাদি above আমি উপরে নোড এবং সংযোগগুলি কীভাবে উন্নত করতে পারি যাতে তারা বিভিন্ন ইনপুট এবং আউটপুট ধরণের সহায়তা করতে পারে? MatNode_Out_Float এবং MatNode_Out_Vec4 (এবং এই জাতীয়) দিয়ে ম্যাটনোড_উইউ সাবক্লাসিং বুদ্ধিমান পছন্দ হতে পারে?
২) অবশেষে, এই জাতীয় সিস্টেমটি কীভাবে জিএলএসএল শেডারগুলির সাথে সম্পর্কিত? ইউই 4-এ আবার দেখার (এবং একইভাবে উপরের লিঙ্কযুক্ত অন্যান্য সিস্টেমের জন্য) ব্যবহারকারীর অবশেষে শ্যাটার প্যারামিটারগুলি (বেস রঙ, ধাতবতা, গ্লস, এমিসিভনেস ইত্যাদি) প্রতিনিধিত্ব করে বিভিন্ন প্যারামিটার সহ একটি বৃহত নোডে কিছু উপাদান নোড প্লাগ করতে হবে) । আমার আসল ধারণাটি ছিল যে ইউই 4 এর বিভিন্ন ধরণের ইউনিফর্ম সহ একটি ধরণের হার্ড কোডড 'মাস্টার শেডার' ছিল এবং ব্যবহারকারীরা তাদের 'উপাদান' তে যা কিছু করেন তা কেবল 'মাস্টার শেডার' এ চলে যায় যখন তারা তাদের নোডগুলিকে প্লাগ করে দেয় মাস্টার নোড '
তবে, ইউই 4 ডকুমেন্টেশনে বলা হয়েছে:
"প্রতিটি নোডে একটি নির্দিষ্ট কাজ সম্পাদনের জন্য মনোনীত এইচএলএসএল কোডের একটি স্নিপেট থাকে This এর অর্থ হ'ল আপনি কোনও উপাদান তৈরি করার সাথে সাথে আপনি ভিজ্যুয়াল স্ক্রিপ্টিংয়ের মাধ্যমে এইচএলএসএল কোড তৈরি করছেন" "
যদি এটি সত্য হয় তবে এই সিস্টেমটি কি আসল শেডার স্ক্রিপ্ট তৈরি করে? কিভাবে এই কাজ করে?