最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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的評論 (共 條)

分享到微博請遵守國家法律
肥西县| 三门峡市| 滨海县| 彭泽县| 安丘市| 焦作市| 渭南市| 绥棱县| 涞源县| 昔阳县| 玛曲县| 德格县| 龙川县| 册亨县| 丰顺县| 大关县| 浦北县| 保山市| 阳朔县| 弥渡县| 方城县| 确山县| 秭归县| 贵定县| 庆云县| 尉氏县| 弋阳县| 嘉义县| 禹城市| 安吉县| 白河县| 上虞市| 江川县| 龙里县| 芒康县| 东港市| 隆回县| 太仆寺旗| 社旗县| 扎赉特旗| 华容县|