2021年10月28日 星期四

蒙地卡羅積分和俄羅斯輪盤 🌩️

➡️ 前篇 

讀了CG 鼠書 

書上把direct light和indirect light分開考慮

代碼來自 CG 鼠書

direct light
  • 點光源單位是I
  • 面光源單位是L

indirect light
  • 用了蒙地卡羅和俄羅斯輪盤,光源單位是L
  • Render Equation的半球積分就是indirect light

直接光照 ➡️ 點光源

E擊中dAs = cos(θi) I / R2

12.3 Point Lights

代碼來自 CG 鼠書

代碼來自 CG 鼠書

直接光照 ➡️ 面光源

代碼來自 CG 鼠書
就是CG 樹書的Integrals over Area

dA用了蒙地卡羅積分後就消失了
這裡對面光源上的點只取樣了1次
p(dA)= 1/A

蒙地卡羅積分


間接光照

代碼來自 CG 鼠書
dω用了蒙地卡羅積分後就消失了(只取樣1個光源)

u是介於0~1的亂數值
ρ 是俄羅斯倫盤,,如果u是0.75
當ρ>0.75 會return 0 也就是有25%的機會採樣失敗
當ρ<0.75,return的值就要會做*1/ρ的修正
(把採樣失敗的能量補回來)


看完程式碼後,可以發現
半球積分時並沒有距離衰減項

蒙地卡羅積分

先不看ρ 
最後會return  integrand *4π
integrand *4π = integrand / (1/4π)
就是只取樣1次函數值的蒙地卡羅積分
機率密度函數 p()=1/4π 

俄羅斯倫盤


如果每次蒙地卡羅積分,n都取10
那麼光線彈射m次後,就會指數暴炸 nm

所以代碼裡的n才取1
這樣彈射m次後的路徑,也只是1條光路

只是因為是俄羅斯倫盤,某個pixel的光路可能手氣不好
沒收集到L,那麼那個pixel就會很暗淡
(當很多pixel都很這樣,整個畫面就會到處是躁點)

提高手氣的方法,就是每個pixel都多試幾次
再把那些結果取平均,這樣就能降躁
(總不會那麼衰小,每次的光路都收集不到L吧)

沒有留言:

張貼留言