پریستهای سایه زن (Shader) ابزار فوقالعاده مفید و کاربردی برای پروژههای مدلسازی به شمار میروند، اما بسیاری از کاربران اغلب در تشخیص تفاوتهای پریستهای شیدر و متریال دچار اشتباه میشوند. اگر بخواهیم یک توضیح ساده در این خصوص ارائه دهیم میتوان گفت متریال میتواند از شیدر و یا تکسچر تشکیل شود.
در این مقاله قصد داریم تعاریفی در خصوص شیدر، متریال، کاربرد و تفاوت آنها از یکدیگر ارائه دهیم.
شیدر چیست؟
شیدرها اسکریپتهایی حاوی الگوریتمها و محاسبات ریاضی هستند که امکان تعیین رندر را براساس نور و ویژگیهای تجهیزات فراهم میکند. به عبارتی این شیدرها هستند که ویژگیهای متریالها را تعیین نموده و رنگ اعمال شده بر روی سطح مدل پس از برخورد نور با آن را مشخص میکنند. این برنامههای کوچک پیش از رندر شدن اطلاعات با هدف ایجاد تغییراتی در پروژه اجرا میشوند. این تغییرات میتواند شامل تغییراتی در geometry (مانند اضافهکردن یا جابهجا کردن ورتکسها) یا تغییراتی در رنگ باشد.
کاربرد شیدر
شیدرها با انجام محاسباتی بر روی رفتار نور باعث میشوند تا مدل شما واقعیتر به نظر برسند. برای مثال اگر بنا باشد مدل شما مانند شیشه شفاف باشد، بدرخشد یا نور را منعکس کند به کمک ویژگیهای شیدر میتوانید این کار را انجام دهید. همچنین میتوان برای ایجاد طیف گستردهای از متریالها مانند رنگ متالیک ماشین، کریستالهای جادویی و… تعدادی از شیدرها را باهم ترکیب کرد. ترکیب و استفاده از شیدرها برای ساخت ظاهر دلخواه برای مدل بسیار کاربردی است؛ برای مثال اگر به جای یک آبجکت سه بعدی با یک کارتون یا کمیک سر و کار داشته باشید میتوانید برای فلت نمودن صحنه از Cel shading استفاده کنید.
ساخت شیدرها کار دشواری نیست. کافی است یک متریال را انتخاب کرده و به تب شیدر بروید. در پایین آیکون ویرایش یک فیلد با بلوکهایی به نام نود مشاهده میشود که هرکدام از آنها میتوانند چگونگی به نظر رسیدن متریال را انتخاب کنند. نودها دارای لیبل ورودی و خروجی هستند. این لیبلها شما را برای اتصال نودها یاری میکنند؛ میتوانید بر روی یک لیبل ورودی کلیک کنید و آن را به سوی خروجی بکشید و برعکس. انواع مختلف نودها عبارتند از: رنگ، نرمال، تصاویر، تکسچر، سایهزن.
انواع شیدر
شیدرها بر اساس قدرت پردازش دسته بندی میشوند؛ مهمترین آنها عبارتند از: Vertex Shader، Geometry Shader، Fragment Shader و Pixel Shader. در ادامه توضیحاتی مختصر در مورد هر یک آورده شدهاست.
- Pixel Shader: پیکسل شیدر یک تابع گرافیکی است که به ازای هر پیکسل اجرا میشود. چون در این شیدر اثرات به ازای هر پیکسل محاسبه میشوند ممکن است سرعت پردازش پایین باشد اما در عوض جزئیات بیشتری نمایش داده میشود. بار محاسباتی این شیدر فوقالعاده بالا است. بسته به میزان وضوح درخواستی و با سرعت 60 فریم بر ثانیه ممکن است حدود 2 میلیون پیکسل نیاز به رندر، سایه زنی و رنگ شدن داشته باشد.
- Fragment Shader: Fragment Shader مرحلهای از سایهزنی است که عمل پردازش Fragment تولید شده توسط Rasterization به مجموعهای از رنگها را انجام میدهد. Fragment Shader یک مرحله اختیاری از سایهزنی است. اگر از این شیدر استفاده نشود مقادیر رنگی خروجی نامشخص خواهند بود. با این حال مقادیر عمق و استنسیل خروجی با همان مقادیر ورودی یکسان خوهند بود. استفاده از این شیدر برای انجام رندر در مواقعی که تنها خروجی مفید عمق fragment بوده و میخواهید از عمق محاسبه شده توسط سیستم استفاده کنید کاربردی است.
- Geometry Shader: شیدر هندسی (GS) نوعی از سایهزنی است که به زبان GLSL نوشته شدهاست و برای کنترل پردازش Primitives مورد استفاده قرار میگیرد. شیدرهای هندسی میان شیدرهای ورتکس و مرحله fixed-function Vertex Post Processing قرار میگیرند. استفاده از شیدرهای هندسی اختیاری است و اجباری برای استفاده از آنها وجود ندارد.
- Vertex Shader: ورتکس شیدر مرحلهای قابل برنامهریزی از سایهزنی است که پردازش تک تک رئوس را انجام میدهد. برای مثال اگر قرار است شیدری برای جابجایی ورتکسهای مدل و تغییر موقعیت آنها بنویسیم بهتر است از ورتکس شیدر استفاده کنیم.
متریال (Material) چیست؟
متریالها چگونگی رندر شدن سطوح یک آبجکت را تعیین میکنند. از ویژگیهای مختلف متریال میتوان به تناژ رنگ، نوع واکنش به نور (مات یا براق بودن)، شفافیت، تکسچر، نحوه قرارگیری آن بر روی آبجکت و… اشاره نمود. ویژگیهای متریال بر اساس نوع شیدری که به کار میرود مشخص میشود. به عبارتی دیگر هر متریال یک شیدر خاص را برای استفاده مشخص میکند و شیدر انتخاب شده گزینههای فعال و موجود در متریال را تعیین خواهد کرد.
سایهزن یک یا چند متغیر تکسچر را که انتظار میرود مورد استفاده قرار گیرد را مشخص میکند و Material Inspector موجود در Unity به شما اجازه میدهد تا مجموعه تکسچر خود را به این متغیرهای تکسچر اختصاص دهید.
Standard Shader بهترین انتخاب برای اکثر رندرهای معمولی (کاراکترها، آبجکتهای جامد و شفاف، محیطها، سطوح سخت، نرم و…) است. این سایهزن میتواند انواع مختلفی از سطوح را به روشی بسیار واقعی رندر کند.
رابطه میان شیدر و متریال در یونیتی
وظیفه شیدرها در یونیتی توصیف محاسبات ریاضی است که برای تعیین رنگهای نمایش دادهشده بر روی صفحه به کار میروند. به کمک این اسکریپتها میتوان رنگ هر پیکسل را تعیین نمود.
بنابراین وقتی گیم را مشاهده میکنید در حقیقت شیدر را میبینید. شیدرها تعیین میکنند که با توجه به نور و سایر تنظیمات چه چیزی نمایش داده شود.
از سوی دیگر نحوه رندر یا ترسیم سطوح مختلف روی صفحه نمایش توسط متریال مشخص میشود. هر متریال دارای شیدر مخصوص به خود است که به کمک آن میتوان گزینههای خاصی را فعال نموده یا پارامترهای دلخواهی را وارد کنید. برخی از این پارامترها شامل مقادیر رنگهای مختلف میشود. البته این پارامترها میتوانند شامل اعداد دیگر و تکسچرهای متفاوت شوند.
تکسچرها تصویر بیتمپ هستند و بسته به نوع سایهزن ممکن است به چندین تصویر نیاز داشته باشید.
در نهایت اگر بخواهیم به صورت خلاصه بیان کنیم شیدرها اسکریپتهایی هستند که به زبان (HLSL) نوشته شدهاند و ممکن است به پارامترهای معین و تکسچر هاصی نیاز داشته باشند. در متریال تمامی این مسائل مشخص خواهند شد.
پس از ایجاد یک متریال یک شیدر به آن اختصاص میدهیم. برای مثال شما میتوانید یک مکعب و یک متریال ایجاد کنید و در نهایت متریال را به مکعب اختصاص دهید. به بیانی دیگر در نرمافزارهای سهبعدی برای استفاده از شیدر جهت رندر کردن و اعمال آن بر روی مدل به متریال نیاز خواهیم داشت. متریالها مجموعهای از شیدرها هستند که به روی مدل اعمال میشوند.
یونیتی دارای یک شیدر به نام شیدر استاندارد است که چند منظوره بوده و بسیار کارآمد است.
این مطلب و آموزش توسط گروه cg3ds جمع آوری شده است.