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
اگر شما چراغ های زیادی ندارید و یا می خواهید قادر به اجرای سخت افزار قدیمی باشید، باید با forward rendering باقی بمانید و بسیاری از چراغ ها را لایت مپ های سبک استاتیک جایگزین کنید. نتایج هنوز هم می تواند شگفت انگیز باشد.
نتیجه گیری

امیدوارم که این مقاله موضوع را برای شما روشن کرده باشد. برای حل مشکلات رندرینگ خود می توانید از یکی از این گزینه ها را انتخاب کنید، اما بسیار مهم است که در ابتدای توسعه بازی خود یکی را انتخاب کنید تا از تغییرات دشوار در آینده جلوگیری شود.
Forward Rendering vs Deferred Rendering.pdf
694.4 KB
نسخه ی چاپی _ ترجمه شده
دوستان امروز یک مقاله ی دیگه درباره ی Deferred Rendering براتون ترجمه کردم
که در ادامه بهش می پردازیم

https://learnopengl.com/Advanced-Lighting/Deferred-Shading
روش forward rendering or forward shading رویکردی ساده برای رندر کردن یک جسم است. آن را با توجه به تمام منابع نور در یک صحنه نورپردازی می کنیم و سپس شی بعدی را رندر می کنیم. و به همین ترتیب برای هر شی در صحنه.

در حالی که این روش برای درک و پیاده سازی کاملا آسان و قابل فهم است این عملکرد نیز بسیار سنگین است، چون هر شی رندر شده باید تکرار بیش از هر منبع نور برای هر قطعه رندر شده است که بسیار است!
چون برای نور پردازی یک شئ باید تمام منابع نور را در نظر بگیریم یعنی هر دفعه محاسبه تمام آنها را برای هر فرگمنت رندر شده باید تکرار کنیم که خیلی زیاد است.

فوروارد رندرینگ همچنین تمایل دارد که تعداد زیادی از فرگمنت شیدر هایی که در حال اجرا در صحنه هستند را با تمام پیچیدگی های عمق هدر بدهد(اشیاء متعدد همان تعداد پیکسل صفحه نمایش را پوشش می دهد) همانطور که بیشتر خروجی های شیدر قطعه دوباره نوشته می شود

بر اساس ایده Deferred shading ما بیشترین محاسبه سنگین رندرینگ مثل نور پردازی را به یک مرحله بعد منتقل کنیم. Deferred shading شامل دو پاس است:در اولین پاس ، پاسgeometry را فراخوانی می کنیم.ما صحنه را یکبار رندر می کنیم و انواع اطلاعات هندسی از اشیاء را که در مجموعه ای از تکسچر ها به نام G-buffer ذخیره کردیم را بازیابی می کنیم . موقعیت بردار ها ، رنگ بردار ها ، بردارهای نرمال یا مقادیر اسپکولار G-buffer نامیده می شود.اطلاعات هندسی صحنه در یک G-buffer ذخیره می شود سپس برای محاسبات نور پردازی پیچیده مورد استفاده قرار می گیرد.تصویر زیر محتوای G-buffer را در یک فریم نشان می دهد.
ما این تکسچر ها را از G-buffer در پاس دوم که پاس نور پردازی است ، جایی که صفحه نمایش با quad پر شده است استفاده می کنیم و نور پردازی صحنه برای هر فرگمنت با استفاده از اطلاعات ذخیره شده ی هندسی در G-buffer محاسبه می کنیم. به جای استفاده از هر شی از طرق مختلف در ورتکس شید به فرگمنت شیدر ، فرآیندهای پیشرفته فرگمنت شیدر را به مرحلۀ بعد منتقل می کنیم.محاسبات نور پردازی دقیقاً شبیه به چیزی که استفاده کردیم باقی می ماند، اما این دفعه به جای ورتکس شیدر(به علاوه ی بعضی متغییر های uniform ) ما تمام متغییر های مورد نیاز را از تکسچر های G-buffer می گیریم.
تصویر زیر به خوبی نشان دهنده روند کل deferred shading است.
یک مزیت عمده این رویکرد این است که هر قطعه ای که در G-buff قرار دارد، اطلاعات واقعی فرگمنت است که به عنوان یک پیکسل صفحه نمایش به پایان می رسد، depth test ، این اطلاعات قطعه را به عنوان بیشترین فرگمنت نتیجه می دهد .
همچنین آن با چند معایب همراه است G-buffer نیاز دارد که ما مقدار نسبتا زیاد اطلاعات صحنه را در بافرهای رنگ تکسچر ذخیره کنیم که تمام حافظه را می خورد، به ویژه زمانی که اطلاعات صحنه مثل موقعیت بردار ها به دقت بالایی نیاز دارد.عیب دیگر آن این است که blending را پشتیبانی نمی کند(چون ما فقط اطلاعات بیشترین فرگمنت را داریم) و MSAA دیگر کار نمی کند.چندین راه حل برای این عیب ها وجود دارد که ما در آخر آموزش آن را بررسی می کنیم.
پر کردن G-buffer در پاس geometry بسیار کارآمد است زیرا ما مستقیما اطلاعات شیء مانند موقعیت، رنگ یا عادی را به یک فریم بافر با یک مقدار کوچک یا صفر پردازش اطلاعات ذخیره می کنیم. با استفاده از چندین اهداف رندر (MRT) ما حتی می توانیم همه اینها را در یک پاسورد رندر انجام دهیم.
The G-buffer
جی بافر مجموعه ای از تمام بافت هایی است که برای ذخیره اطلاعات مربوط به نورپردازی مورد استفاده قرار می گیرد. بگذارید در این لحظه به طور خلاصه تمام اطلاعاتی که نیاز داریم تا در یک فرگمنت با رندر پیش فرض به نمایش بگذاریم مرور کنیم:
یک مختصات سه بعدی برای محاسبه ی مقدار موقعیت فرگمنت درون یابی شده (interpolated fragment) که برای lightDir و viewDir استفاده می شود.

یک بردار رنگ RGB diffuse همچنین عنوان albedo شناخته شده است.

یک بردار نرمال سه بعدی برای تعیین شیب سطح.

یک float برای شدت اسپکولار

تمام موقعیت های منبع نور و بردارهای رنگ.

بازیکن یا بردار موقعیت دید(viewer's position)
با استفاده از این متغیرها (در هر فرگمنت) که در اختیار داریم می توانیم نور پردازی (Blinn-) Phong را محاسبه کنیم. موقعیت و رنگ های منبع نور و موقعیت دید بازیکن را می توان با استفاده از متغیرهای یکپارچه(uniform ) پیکربندی کرد، اما متغیرهای دیگر هر کدام از اجزای یک شیء خاص هستند. اگر ما به نحوی بتوانیم داده های دقیق مشابه را به تصویب نور پایانی منتقل کنیم، ما می توانیم همان نورپردازی را محاسبه کنیم، حتی اگر بخش هایی از یک quad دوبعدی را رندر کنیم.
در OpenGL هیچ محدودیتی برای چیزی که ما می توانیم در یک تکسچر ذخیره کنیم وجود ندارد، به طوری که منطقی است که تمام داده های هر فرگمنت را در یک یا چند تکسچر هایی که روی صفحه پر شده با نام G-buffer ذخیره کرده و بعدا در پاس نور پردازی استفاده شود. چون تکسچر های G-buffer اندازه ی یکسانی با quad دوبعدی در پاس نور پردازی خواهد داشت،ما دقیقاً همان اطلاعات قطعه ای که در تنظیمات forward rendering 0داشته ایم، دریافت می کنیم، اما این بار در پاس نور پردازی ؛ یک نقشه بر روی یک نقشه وجود دارد.