গ্রাফ-ভিত্তিক উপাদান ব্যবস্থায়, আমি কীভাবে বিভিন্ন ইনপুট এবং আউটপুট ধরণের সহায়তা করতে পারি?


11

এখানে চিত্র বর্ণনা লিখুন

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


পটভূমি:

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

যদি এটি সত্য হয় তবে এই সিস্টেমটি কি আসল শেডার স্ক্রিপ্ট তৈরি করে? কিভাবে এই কাজ করে?


1
আপনার প্রশ্নের সাথে সম্পর্কিত: gameangst.com/?p=441
গ্ল্যাম্পার্ট

উত্তর:


10

আমি ইউই 4 এর সুনির্দিষ্ট কেস সম্পর্কে কম জ্ঞানের সাথে আমার জ্ঞানের সেরাটি দিয়ে উত্তর দেওয়ার চেষ্টা করব, তবে সাধারণ কৌশলটিতে।

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

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

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

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

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

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

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

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

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

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

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

আমার উত্তরটিতে আপনার অতিরিক্ত বিশদ বা কোনও ফিক্সিংয়ের প্রয়োজন হলে আমাকে জানান, আমি সমস্ত পাঠ্যের উপরে ওভারভিউটি হারিয়েছি।


এরকম বিস্তৃত এবং দুর্দান্ত উত্তর লেখার জন্য আমি আপনাকে যথেষ্ট ধন্যবাদ জানাতে পারি না। আমার মনে হচ্ছে আমার এখান থেকে কোথায় যাওয়া উচিত সে সম্পর্কে আমার দুর্দান্ত ধারণা আছে! ধন্যবাদ!
মিঃ ক্যাটসওয়ার্ডফিশ

1
সাথী কোনও সমস্যা নেই, আপনার যদি আরও কোনও সহায়তার প্রয়োজন হয় তবে নির্দ্বিধায় আমাকে বার্তা দিন। আমি আসলে আমার নিজের সরঞ্জামগুলির জন্য সমতুল্য কিছুতে কাজ করছি, সুতরাং আপনি যদি চিন্তাভাবনা বাণিজ্য করতে চান তবে আমার অতিথি হন! শুভ বিকাল বেলা: ডি
গ্রিমশো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.