ওপেনজিএলে মাল্টিপাস শেডারগুলি কীভাবে কাজ করবে?


13

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

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

আমি চাই না আপনি বলছেন যে জ্যামিতি শেডার এর জন্য ব্যবহার করা যেতে পারে কারণ আমি কেবল মাল্টিপাস জিএলএসএল শেডারগুলির পিছনে তত্ত্বটি জানতে চাই;)


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

উত্তর:


11

মাল্টিপাসের পিছনে কোনও "তত্ত্ব" নেই। কোনও "মাল্টিপাস শেডার" নেই। মাল্টিপাস খুব সহজ: আপনি একটি প্রোগ্রামের সাহায্যে বস্তুটি আঁকুন। তারপরে আপনি ভিন্ন প্রোগ্রামের সাহায্যে অবজেক্টটি আঁকুন ।

এই অতিরিক্ত পাসগুলি লুকানোর জন্য আপনি এফএক্স ফাইলের মতো ডি 3 ডিএক্স স্টাফ ব্যবহার করতে পারেন। তবে তারা এখনও সেভাবে কাজ করে। ওপেনজিএল এর পক্ষে কেবল কোনও লুকানোর জায়গা নেই।


1

সেল শেডার দিয়ে অবজেক্টটি রেন্ডার করুন এবং তারপরে আউটলাইন শেডার দিয়ে পুনরায় রেন্ডার করুন।


1
সুতরাং আমার দুটি আলাদা শেডার প্রোগ্রাম করা উচিত? তবে কেন আমি চাইলে আমি অনেকগুলি শিরোনাম / জ্যামিতি / খণ্ড খণ্ড ছায়াযুক্ত শেডার প্রোগ্রাম দিতে পারি? একটি প্রোগ্রামের সাথে এটি করার একটি উপায় থাকতে হবে।
jmegaffin

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

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

1

ওপেনজিএল ৪.০ এ অভিন্ন সাবরুটাইন রয়েছে । এগুলি আপনাকে এমন ফাংশনগুলি সংজ্ঞায়িত করতে দেয় যা রানটাইমের সময় খুব অল্প ওভারহেডের সাথে অদলবদল হতে পারে। সুতরাং আপনি প্রতিটি পাসের জন্য 1 টি ফাংশন করতে পারেন। এছাড়াও প্রতিটি শেডার ধরণের জন্য 1 টি ফাংশন।

এখানে একটি টিউটোরিয়াল আছে

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


0

কিছু লোক আছে যারা জিএলএসএল সম্পর্কে অনেক কিছু জানেন, তাই আমি আশা করি তারা রেকর্ডটি সোজা করে আসবে, তবে যা আমি দেখেছি তার উপর ভিত্তি করে, আপনার খণ্ড শেডারটিতে, আপনাকে এই জাতীয় কিছু করতে সক্ষম হওয়া উচিত (সিউডোকোড, আমি 'প্রকৃত জিএলএসএলটি যারা ভাল জানেন তাদের উপর ছেড়ে দেবেন):

out vec4 fragment_color
vec4 final_color
final_color = flat_color
If this fragment is in shadow
    final_color = shadow_color
If this fragment is an edge
    final_color = edge_color
If this fragment is a highlight
    final_color = highlight_color
fragment_color = final_color

এভাবে ব্যবহার করে ifআপনি একাধিক পাসের মতো কিছু পান। যে জানার জন্য?

সম্পাদনা: এছাড়াও, আশা করি এসও সম্পর্কিত এই প্রশ্নটি কিছু ভুল বুঝাবুঝি দূর করতে সহায়তা করে।


2
এটি লক্ষণীয় গুরুত্বপূর্ণ যে জিএলএসএল যদি সক্ষম হয় না এমনকি প্রতিটি শাখায় পাস হয় তবে সমস্ত বিবৃতি কার্যকর করবে। স্পষ্টতই কেবল সমস্ত কিছু গণনা করা এবং সমস্ত রঙ একসাথে যুক্ত করা কিন্তু মানগুলি সক্ষম বা অক্ষম করতে 1.0 বা 0.0 দ্বারা গুণিত করা দ্রুত হয় is
ডেভিড সি বিশপ

1
@ ডেভিডসি.বিশপ: এটি সত্য নয়। কমপক্ষে, সত্য হওয়ার নিশ্চয়তা নেই । সংকলকটি সিদ্ধান্ত নেবে যে প্রকৃত শাখাটি দ্রুত বা একটি "সমস্ত কিছু গণনা করুন এবং পরে এটি সাজান" পদ্ধতির পদ্ধতিটি দ্রুত।
নিকল বোলাস

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