最近在 Ryan Bruck's Blog 看到一系列有關 volumetric rendering 的文章, 相當精采,而且也有附上 source code 對學習上實在是很有幫助,總結幾個 volumetric rendering 的重點,文章裡主要是使用 ray marching,從 camera 發射光束,計算光束在穿過 volume 的過程中最後呈現在 pixel 的顏色。
第一步是根據穿透率 (transmittance) 來算累積起來的 luminance,吸收率會影響穿透率,在光前進的過程中也會需要考慮到發散 (scattering) 的問題,會有二個因素關係到發散,第一個是發散的機率 (由scattering cofficient 來決定),另一個則是怎麼發散 (由 phase function 來決定), 但最重要的還是要先知道有多少光進來,這部份會由光的強度 (intensity)乘上穿透率再算上衰減的公式(通常是距離平方反比)來得到,這些都是簡化過後的說明,在實作的過程中會看到很多的數學公式,會再根據想要的效果來修改。
在 UE4 裡測試的結果如下,
記得使用的 box 需要先將 normal 反過來,這是為了當 camera 穿到 volume 裡的時候,有東西可以畫要不然一穿進去就會被切掉什麼都看不到,另外 UE4 裡的 material 設定好後,會需要一張 3D volume texture,主要是為了在計算時用來 sample volume 的密度 (density),這張圖文章裡沒有提到怎麼製作,所以我做了一個 houdini digital asset,可以方便的在 houdini 裡製作各式個樣的 volume 或是 pyro 模擬後的結果,指定目標的 field 欄位就可以快速的算出一張 volume texture,目前還在測試中,不過使用起來個人覺得還蠻方便的,可以少了許多鎖碎的設定,
Volumetric Rendering 是一個很吸引人的題目,接下來又有好多東西可以研究了 :)。