فرگمنت شیدر در بالا نشان داده شده در واقع واقعا کار نمی کند و فقط نشان می دهد که چگونه می توانیم از حجم نور برای کاهش محاسبات نور استفاده کنیم. واقعیت این است که GPU ها و GLSL شما در حلقه ها و شاخه های بهینه سازی بدی هستند. دلیل این امر این است که اجرای شیدر در GPU بسیار موازی است و اکثر معماریها نیاز دارند مجموعه ای بزرگ از thread ها کد شیدر یکسانی برای اجرا داشته باشند تا کارآمد باشند. این اغلب به این معنی است که یک شیدر همیشه تمام شاخه های یک دستور را اجرا می کند تا اطمینان حاصل شود که اجرای شیدر یکسان است، و بهینه سازی چک شعاع قبلی کاملا بی فایده است؛ ما هنوز روشنایی را برای همه منابع نور محاسبه میکنیم!
این کار برای هر منبع نور در صحنه انجام می شود و قطعات حاصل با هم ادغام می شوند. در نتیجه صحنه دقیقا مشابه همانند قبل است، اما این بار تنها بخش های مربوط به هر منبع نور را رندر می کنیم. این به طور موثر محاسبات از nr_objects * nr_lights را به nr_objects + nr_lights کاهش می دهد که باعث می شود آن را در صحنه های با تعداد زیادی از چراغ. به شدت کارآمد کند.این رویکرد باعث می شود deferred rendering برای رندر تعداد زیادی از چراغ ها مناسب باشد.
هنوز با این رویکرد مشکلی وجود دارد: face culling باید فعال باشد (در غیر این صورت ما می توانیم اثر نور را دو بار نشان دهیم) و هنگامی که فعال شود، کاربر ممکن است وارد حجم منبع نور شود در نتیجه بعد از آن حجم دیگر رندر نمی شود (به دلیل back-face culling) که این را با استفاده از ترفند Stencil Buffer برای حذف کردن تأثیر منبع نور می توان حل کرد.
رندر حجمی نور باعث افزایش کارایی می شود و در عین حال عموما سریع تر از deferred shading است، بهترین بهینه سازی نیست. دو افزونه محبوب (و کارآمدتر) که در بالای deferred shading قرار دارند، به نام deferred lighting و tile-based deferred shading است. این موارد فوق العاده در رندر مقدار زیادی نور و همچنین اجازه می دهد MSAA نسبتا کارآمد باشد. با این حال، به خاطر طول این آموزش، من این بهینه سازی ها را برای آموزش بعدی ترجیح می دهم.
خود deferred shading (بدون حجم نور) در حال حاضر یک بهینه سازی بزرگ است چون هر پیکسل فقط یک فرگمنت شیدر دارد، در مقایسه با forward rendering ، جایی که ما اغلب فرگمنت شیدر را چند بار در هر پیکسل اجرا می کنیم Deferred rendering با چند معایب همراه است: با سرعت مصرف زیاد حافظه(overhead )، بدون MSAA که با ترکیب کردن با forward renderingباید انجام شود.
هنگامی که شما یک صحنه کوچک و بدون چراغ های زیاد دارید ، , deferred rendering لزوما سریع تر نمی باشد و گاهی اوقات حتی به دلیل سربار هزینه کندتر است و که در این مورد استفاده ی آن معقول نیست. در صحنه های پیچیده تر، Deferred rendering سریع به یک بهینه قابل توجه می رسد؛ به خصوص با بهینه سازی پیشرفته بازی.
به عنوان یک نکته نهایی، من نیز می خواهم ذکر کنم که اساسا تمام اثراتی که می توان با forward rendering انجام داد نیز می تواند در یک زمینه deferred rendering اجرا شود؛ این اغلب فقط یک گام تبدیل کوچک نیاز دارد. به عنوان مثال، اگر ما می خواهیم از نرمال مپینگ در یک deferred rendering استفاده کنیم به جای نرمال سطح از یک ماتریس TBN استفاده می کنیم. نیازی به تغییر محاسبات پاس نور نداریم.
و اگر می خواهید parallax mapping کار کند شما قبل از نمونه برداری بافت های Diffuse و Specular یا Normal اول باید مختصات پاس geometry را تغییر دهید.
و اگر می خواهید parallax mapping کار کند شما قبل از نمونه برداری بافت های Diffuse و Specular یا Normal اول باید مختصات پاس geometry را تغییر دهید.
خب به پایان این آموزش رسیدیم امیدوارم براتون مفید باشه.وقتی این تکنیک رو یاد گرفته باشید می تونید از خلاقیتتون استفاده کنید و اونو به شکل دیگه ای پیاده کنید.
Forwarded from Kamali
Forward Rendering vs Deferred Rendering.docx
2.1 MB
Kamali
Forward Rendering vs Deferred Rendering.docx
مطالب بالا رو به صورت فایل word هم گذاشتم
می تونید دانلود کنید
می تونید دانلود کنید
دوستان مطالب شاید کمی خسته کنند بوده
لذا در ادامه برای تنوع قصد داریم بریم سراغ مبحثی به نام
Reaction Diffusion
منتظر مطالب باشید😉
لذا در ادامه برای تنوع قصد داریم بریم سراغ مبحثی به نام
Reaction Diffusion
منتظر مطالب باشید😉
Shader Laboratory
GIF
سلام دوستان امروز قصد داریم به روند کلی Reaction Diffusion اشاره ای بکنیم
Shader Laboratory
https://www.youtube.com/watch?v=BV9ny785UNc
این ویدیو توضیح کامل و جامع رو داده ولی خب من خلاصشو براتون آماده کردم:
ایده ی اصلی اینه که فرض کنید می خوایم دوتا ماده ی شیمیایی رو با هم ترکیب کنیم
ما دوتا ماتریس برای نگهداری تولید قبلی و بعدی داریم که مثل یک چرخه عمل می کنه
با استفاده از فرمول reaction diffusion می تونیم تولید بعدی رو نسبت به تولید قبلی انجام بدیم در نتیجه بعد از مدتی تولید انجام میشه
نکته:در این فرمول ما مجموع همسایه ها در ماتریس رو با عملگر لاپلاس نشان دادیم
ایده ی اصلی اینه که فرض کنید می خوایم دوتا ماده ی شیمیایی رو با هم ترکیب کنیم
ما دوتا ماتریس برای نگهداری تولید قبلی و بعدی داریم که مثل یک چرخه عمل می کنه
با استفاده از فرمول reaction diffusion می تونیم تولید بعدی رو نسبت به تولید قبلی انجام بدیم در نتیجه بعد از مدتی تولید انجام میشه
نکته:در این فرمول ما مجموع همسایه ها در ماتریس رو با عملگر لاپلاس نشان دادیم