শেডার ইউনিফর্ম আপডেট করার সর্বোত্তম পদ্ধতি কোনটি?


10

শেডারের ম্যাট্রিক্স আপ টু ডেট রাখার জন্য সবচেয়ে গ্রহণযোগ্য উপায় কী এবং কেন?

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

এটি আমাকে মারাত্মকভাবে সীমাবদ্ধ করে দেয় কারণ আমি শেডার অবজেক্টটিতে অ্যাক্সেস না করে কিছুই করতে পারি না।

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


রেন্ডার করার সময় কেন শেডারগুলিতে ডেটা পাস করবেন না?
নিক ক্যাপলিংগার

এটাই আমি কী করতে চাইছি কিন্তু কীভাবে? যদি কোনও বস্তু একটি শেডার তৈরি করে তবে কীভাবে বিশ্ব বস্তুগুলি সেই শেডারের অস্তিত্ব সম্পর্কে জানতে এবং প্রয়োজনীয় ম্যাট্রিকগুলি পাস করার জন্য বোঝায়?
Lerp

উত্তর:


11

ইউনিফর্ম বাফার ব্যবহার করুন (যেমন ডি 3 ডি লিঙ্গোর ধ্রুব বাফার )।

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

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

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

একটি ফরোয়ার্ড শেডিং সেটআপে এটি সমস্ত বাতাকে অন্য একটি বাফারে এবং মুলতুবি-শেডিং করার জন্য কিছুটা অর্থপূর্ণ করে তোলে একইভাবে লাইট পাসের জন্য প্রতি-লাইট বাফারটি ব্যবহার করা বুদ্ধিমান হয় (একটি মডেল / ম্যাটেরিয়াল বাফারের স্থানে ব্যবহৃত) জ্যামিতি পাস)।

নোট করুন যে আপনাকে একসাথে বাফার ব্যবহারের জন্য জিএল-এর একটি হালকা আপ-টু-ডেট সংস্করণ প্রয়োজন (৩.১ বা একটি এক্সটেনশান; কিছু পুরানো তবে এখনও ইন-সার্ভিস ল্যাপটপগুলি ব্যতীত আজ প্রচলিত সাধারণ) এবং আপনার হতে মোটামুটি সাম্প্রতিক সংস্করণটি প্রয়োজন শেডার কোডের অভ্যন্তর থেকে নির্দিষ্ট আবদ্ধ স্থানে ইউনিফর্ম বাফারগুলিকে আবদ্ধ করতে সক্ষম (৪.২; এখনও অস্বাভাবিক তবে আরও ভাল হচ্ছে) অন্যথায় আপনাকে জিনিসগুলি সেট আপ করতে আপনার সিপিইউ-সাইড কোডে আরও কাজ করতে হবে (আপনার সিপিইউ কোডটি সঠিক বাঁধাই জানতে হবে) যাইহোক পয়েন্টস, সুতরাং এটি কোনও গুরুতর সমস্যার চেয়ে এটির একটি API গন্ধ বেশি)। ওপেনজিএল | ইএস 3.0 পর্যন্ত অভিন্ন বাফারগুলি যোগ করে নি যা দুর্ভাগ্যক্রমে এখনও বেশিরভাগ জনপ্রিয় মোবাইল প্ল্যাটফর্মগুলিতে অসমর্থিত।

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

দেখুন GLSL Inteface ব্লক এবং ইউনিফর্ম বাফার অবজেক্টস


আমি জানতাম সেগুলি একটি অন্তর্নির্মিত উপায় হবে। ধন্যবাদ!
Lerp

4

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

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

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