五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

論睡覺解決多光源實時陰影,“時空濾波”MSDFShadow

2022-11-13 20:12 作者:DeadCyber  | 我要投稿

先上效果,沒有ShadowMap,是實時Trace的SDFShadow:

移動3070上100來幀。


如果沒有這個MSDFShadow的優(yōu)化,也就是每一幀硬去遍歷所有光源Trace陰影,在桌面2060上10幀不到:

一 論睡覺

????整個算法是我剛躺下去半夢半醒的時候想到的。因為腦子有執(zhí)念回路,而睡覺恰好是一個碎片整理,清楚雜物的過程,所以可能自動工作了。這在我身上發(fā)生了不止一次了,其他例子我就不多舉了。就怕心貪嗔癡,堵在那硬求,解決不了的問題就和解,先睡一覺再說。不再多說,睡覺大家都會。


二 論多光源實時陰影

? SDFShadow應(yīng)該都見過,shadertoy上很多。如果只有1個光源,那每個像素只需要在hit點向光源方向再Trace一遍Scene,看是否相交就可以了。?


? 問題就出在我的場景有多個光源,如果要正確的陰影,那要對每個光源都要Trace一遍,幀率很快就下降了。


? 由于我一直都用的SDFShadow,沒有存成RT,所以開Indirect的時候更糟,因為要把Indirect的光源混合陰影(純陰影里的像素不能成為間接光的光源),也要走一遍Shadow。


三?論時間濾波

? ??很快我就想到了,shadow遍歷光源的過程和收集indirect的過程類似,所以每幀只去trace一個光源,然后歷史混合就行了。


? ? 我很naive地用frameID%lightNum去決定每幀trace哪個光源。


? ? 很快實現(xiàn)了,效果也很顯著,在2060上從原來的10FPS升到60FPS。


? ? 不過有一個顯著的缺點。假設(shè)我場景有6個燈,那么等到6燈都收集完Shadow,就要等到6幀渲染以后才能完成。那比如在第一幀時,和第一個燈Trace,不是0就是1,和最終收集的結(jié)果比如2/6有很大的誤差。這樣導(dǎo)致前6幀場景的明暗一直在跳變,到6幀結(jié)束這個“積分過程”才算結(jié)束,才能穩(wěn)定。


? ? 一開始我以為只有6幀,視覺上應(yīng)該還好。但是第一,人眼有延時效果;第二,為了避免ghost(拖影),和indirect一樣,在相機大幅度(實際是稍微有變)改變位姿時,就得舍棄歷史數(shù)據(jù),重新計算。假設(shè)玩家一直在前進(jìn),那么永遠(yuǎn)就是第1幀的計算結(jié)果,可想而知不是全亮就是全暗。

(也許你會想利用起來歷史數(shù)據(jù),而不是直接丟棄重算,就像TAA,Motion Vector那樣。我是自己實現(xiàn)過TAA的,實際效果一言難盡,我直接丟棄了,如果你想試試,那我只能祝你好運)


? ? 睡覺之后,我想到我真是傻,和indirect一樣用低差異序列(以下簡稱LD)不就行了嗎?于是改寫。改完瞬間接近完美,沒有跳變。(frameID*rand01_LD(seed = float3(id.xy,frameID)))

如果相機停留超過6幀,也會收斂到正確結(jié)果,并且跳變不十分明顯。(由于LD的特性,隨機能均勻遍布Vector Space,使得即使在第一幀的時候,由于每個像素都分布是不同id的燈,導(dǎo)致全局平均眼球看起來陰影度和最終相差不大)


四 論空間濾波

? ? 雖然使用LD已經(jīng)很不錯了,但還是會有明顯的LD分布形狀(也就是“噪聲”的形狀)。還有一點,在相機持續(xù)移動時,實際上每一幀都只有第一幀,沒有歷史數(shù)據(jù)(因為避免Ghost,移動了要重新積分),所以光用LD還不夠。

? ?

? ? 之前在B站上看到有人在unity里實現(xiàn)了好像是寒霜引擎的實時GI,提到了“時空濾波”,我就把名字和思路借鑒了過來。由于咱不想搞Surfel啥的,也別3d空間濾波了,就屏幕空間處理一下得了。額外工作是把Shadow分離成RT,不過這樣也好,indirect的時候也省的重新計算了,可以直接從RT上讀。


? ? 對于Indirect,如果簡單地用Blur或者Dialation,也許與收斂結(jié)果相比還有些跳變;但是咱Shadow,Blur一下沒有太大的問題。我沒有太仔細(xì)地去處理這事,如果設(shè)定好mask,然后按lightNum去采樣自然數(shù)順序前后像素(由于LD),取平均,應(yīng)該就能完美解決。不過燈多了肯定就不行了。我就圖簡單,直接使用帶間隔的BoxBlur對Shadow處理一下。(由于我的Shadow,0為黑,1為亮,所以實際應(yīng)該對1-Shadow的Texture進(jìn)行Blur,再反回來;但是我圖簡單,直接對Shadow進(jìn)行Blur,再*085來和收斂結(jié)果一致,也看不出來;如果不乘0.85,顯然會把為1的像素Blur到陰影里,變成過曝的效果了:




結(jié)尾

?天天睡不好,但還要天天睡。睡覺很重要。



論睡覺解決多光源實時陰影,“時空濾波”MSDFShadow的評論 (共 條)

分享到微博請遵守國家法律
尤溪县| 元朗区| 汶川县| 拜泉县| 邵武市| 铅山县| 苏州市| 阿尔山市| 陈巴尔虎旗| 昌江| 海原县| 巴青县| 淮阳县| 石景山区| 个旧市| 邛崃市| 鸡东县| 临夏县| 始兴县| 台州市| 河北省| 新田县| 九台市| 富民县| 农安县| 清镇市| 龙南县| 合作市| 常熟市| 普陀区| 昭觉县| 左云县| 洛宁县| 尼玛县| 洮南市| 郁南县| 布尔津县| 泰顺县| 湖北省| 蒙自县| 江陵县|