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
ترکیب deferred rendering با forward rendering
می خواهیم هر یک از منابع نور را به عنوان یک مکعب سه بعدی که در موقعیت منبع نور قرار گرفته و در حال تاباندن رنگ نور در کنار deferred renderer است رندر کنیم.اولین ایده ای که به ذهن می آید این است که به سادگی منابع نور را در بالای چهار گوش deferred lighting در پایان پایپ لاین deferred shading ، forward render کنیم.بنابراین اساسا مکعب ها را همانطور که ما به طور معمول انجام می دهیم، انجام می دهیم، اما تنها پس از اینکه ما عملیات deferred rendering را تمام کردیم. .در کد اینجور به نظر می رسد:
با این حال، این مکعب های رندر شده هیچی از عمق geometry ذخیره شده ی deferred renderer به حساب نمی آید و در نتیجه همیشه در بالای اشیاء قبلی رندر می شود ؛ این نتیجه ای نیست که ما دنبال آن هستیم.
آنچه که ما باید انجام دهیم این است که ابتدا اطلاعات عمق ذخیره شده در پاس هندسه را در عمق فریم بافر پیشفرض کپی کنیم و فقط مکعب های نور رندر کنند. به این ترتیب قطعات مکعب نور تنها در زمانی که در بالای هندسه قبلی رندر شده اند رندر می شوند.
ما می توانیم محتوای فریمبافر را به محتوا یک فریمبافر دیگر با کمک glBlitFramebuffer کپی کنیم، از تابع anti-aliasing برای حل کردن نمونه برداری چندگانه استفاده کنیم. تابع glBlitFramebuffer به ما اجازه می دهد تا یک منطقه فریم بافر تعریف شده کاربر را به یک منطقه تعریف شده ی فریم بافر دیگر کپی کنیم.
ما عمق تمام اشیاء رندر شده در پاس deferred shading را در gBuffer FBO ذخیره کردیم. اگر ما به سادگی محتوی بافر عمق خود را در عمق بافر فریمبافر پیش فرض کپی کنیم، مکعب های نور سپس به اگر به عنوان شی صحنه رندر شود با forward rendering رندر می شود.
به نظر می رسد که تمام اشیاء صحنه با forward rendering رندر شده است. همان طور که در آموزش anti aliasing به طور خلاصه توضیح داده شد ، ما باید فریم بافر را به عنوان فریم بافرخواندنی مشخص کنیم و به طور مشابه یک فریمبافر به عنوان فریم بافر نوشتنی مشخص کنیم:
در اینجا ما تمام محتویات بافر عمق فریمبافر خوانده شده را به عمق بافر فریمبافر پیش فرض کپی می کنیم؛ این می تواند به طور مشابه برای بافر های رنگ و بافر های استنسیل انجام شود. در حال حاضر اگر بعد از آن مکعب های نوری را رندر کنیم، مکعب ها درواقع اگر به عنوان شئ صحنه عمل کنند واقعی است و به سادگی روی چهارگوش پِیست نمی شود.
با استفاده از این روش می توان به راحتی deferred shading با forward shading ترکیب کرد. این عالی است زیرا می توانیم اشیائی که نیاز به افکت های ویژه دارند را رندر و ترکیب کنیم ، چیزی که در یک زمینه deferred renderingامکان پذیر نیست.
تعداد زیادی منبع نور
دیفرد رندرینگ اغلب مورد ستایش قرار گرفته است،زیرا توانایی آن برای رندر مقدار زیادی منابع نور بدون هزینه سنگینی بر عملکرد است. Deferred rendering به خودی خود باعث می شود که تعداد بسیار زیادی از منابع نور وجود نداشته باشد، زیرا ما هنوز مجبور هستیم که هر مولفه نور را برای هر منبع نور از صحنه بخوانیم. چه چیزی باعث می شود مقدار زیادی از منابع نور ممکن است بهینه سازی بسیار شسته و رفته داشته باشد که ما می توانیم آن را به پایپ لاین Deferred renderin منتقل کنیم: حجم نور است.
به طور معمول هنگامی که ما یک فرگمنت را در یک صحنه بزرگ به تصویر می کشیم، سهم هر منبع نور در یک صحنه صرف نظر از فاصله آنها تا فرگمنت محاسبه می کنیم. بخش بزرگی از این منابع نور هرگز به فرگمنت نمی رسد، پس چرا تمام محاسبات نور از بین نمی رود؟
ایده در حجم نور، محاسبه شعاع یا حجم یک منبع نور است یعنی منطقه که نور آن قادر به فرگمنت ها برسد. همانطور که اکثر منابع نور از برخی از فرم های attenuation استفاده می کنند، می توانیم از آن برای محاسبه حداکثر فاصله یا شعاع نور آنها استفاده کنیم. سپس ما فقط محاسبات نورپردازی گران را انجام می دهیم اگر یک فرگمنت در داخل یک یا چند تای این حجم نور وجود داشته باشد. این می تواند مقدار قابل توجهی از محاسبات ما را ذخیره کند، زیرا اکنون فقط نور را محاسبه می کنیم که در آن ضروری است.
حلیه ی این عملکرد بیشتر بدان معنی است که اندازه یا شعاع حجم نور یک منبع نور است.
محاسبه حجم نور یا شعاع
برای به دست آوردن شعاع حجم نور، اساسا ما باید معادله attenuation را برای روشنایی که به نظر می رسد تیره باشد حل کنیم. ما فرض می کنیم که تاریک است ، این می تواند 0.0 یا چیزی کمی روشن تر باشد اما همچنان تاریک مانند 0.03 است. برای نشان دادن اینکه چگونه می توانیم شعاع حجم نور را محاسبه کنیم، می توانیم از یکی از توابع سخت افزاری تضعیف شده ای که ما در آموزش light casters معرفی کردیم استفاده کنیم: