Shader Laboratory
848 subscribers
265 photos
15 videos
59 files
404 links
Shader Laboratory
a channel about shaders in telegram

ID : @smkgames

MyStack : goo.gl/smMuqe 😎👌
Download Telegram
این معادله تقریباً شعاع بین 1.0 و 5.0 را بر اساس بیشینه ی شدت نور بر می گرداند.
ما این شعاع را برای هر منبع نور صحنه محاسبه می کنیم و اگر یک فرگمنت در داخل منبع نور باشد فقط از آن برای محاسبه نور این منبع نور استفاده می کنیم. در زیر روشنایی به روز شده پاس نور در فرگمنت شیدراست که به حساب حجم نور محاسبه شده است. توجه داشته باشید که این رویکرد صرفا برای اهداف آموزشی انجام می شود و در یک محیط عملی قابل اجرا نیست، زیرا ما به زودی بحث خواهیم کرد:
نتایج دقیقا همانند قبل است، اما در این زمان هر نور فقط روشنایی برای منابع نور را محاسبه می کند که در آن حجم آن قرار دارد.

شما می توانید کد اصلی نسخه ی نمایشی را در اینجا پیدا کنید.
https://learnopengl.com/code_viewer_gh.php?code=src/5.advanced_lighting/8.2.deferred_shading_volumes/deferred_shading_volumes.cpp
چگونه ما باید از حجم نور استفاده می کنیم
فرگمنت شیدر در بالا نشان داده شده در واقع واقعا کار نمی کند و فقط نشان می دهد که چگونه می توانیم از حجم نور برای کاهش محاسبات نور استفاده کنیم. واقعیت این است که 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 rendering vs forward rendering
خود 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 را تغییر دهید.
خب به پایان این آموزش رسیدیم امیدوارم براتون مفید باشه.وقتی این تکنیک رو یاد گرفته باشید می تونید از خلاقیتتون استفاده کنید و اونو به شکل دیگه ای پیاده کنید.
Kamali
Forward Rendering vs Deferred Rendering.docx
مطالب بالا رو به صورت فایل word هم گذاشتم
می تونید دانلود کنید
دوستان مطالب شاید کمی خسته کنند بوده

لذا در ادامه برای تنوع قصد داریم بریم سراغ مبحثی به نام
Reaction Diffusion

منتظر مطالب باشید😉
Forwarded from Kamali
مثالی دیگر از Reaction Diffusion