之前介紹過Huwb在Siggraph 2015年上分享的一篇通過調(diào)整采樣點排布來保證使用較少的采樣點也能得到穩(wěn)定表現(xiàn)的技術(shù)文章弯予,今天要介紹的這個技術(shù)則是huwb在2017年提出的新方案厉碟,這個方案相對于之前介紹的方案具有更好的穩(wěn)定性,且不必像之前的技術(shù)一樣需要針對motion/rotation分開處理讥珍,這里是原文的PPT鏈接。
體積云的實時渲染主要面臨著如下的幾個問題:
- raymarching采樣消耗非常高
- 想要做到實時渲染,只能不斷的降低單條射線上的采樣點數(shù)目
- 采樣點數(shù)目降低會導(dǎo)致相機移動或者旋轉(zhuǎn)時的鋸齒
針對這些問題,現(xiàn)在業(yè)界主要有如下的幾種解決路徑:
- 將光照以及密度數(shù)據(jù)緩存到與相機frustum平齊的volume texture中与纽,運行時通過一定的算法進行取用
- 通過TAA來減少sampling數(shù)目
- 使用較少的采樣點來進行光照計算,通過與相機平齊的3D細節(jié)貼圖來fake粒子濃度效果
這些方法都有著各自的局限性塘装。
之前我們分享的huwb的技術(shù)通過對每條射線的起始采樣位置進行偏移來解決相機移動時的鋸齒問題急迂,對于相機旋轉(zhuǎn)時的鋸齒則是通過在平面slice到曲面slice之間進行過渡來解決,但是這種做法比較復(fù)雜蹦肴,而且在相機繞著某個固定點旋轉(zhuǎn)時僚碎,會存在瑕疵。
今天這里要介紹的這個技術(shù)跟上一個技術(shù)方案不同阴幌,是通過在世界空間中設(shè)定一些采樣slice來消除motion/rotation的鋸齒的勺阐,其基本思路給出如下:
- 假設(shè)在世界空間中擺放了一系列與xy平面平行的透明slice,每個slice上存放了對應(yīng)深度的切片信息
- 正對著這些貼片望過去矛双,看到的結(jié)果是沒有問題的
- 當(dāng)相機角度偏離z方向過遠時渊抽,就會導(dǎo)致效果發(fā)生變化
- 但是如果偏離的不是很大,那么看到的結(jié)果其實并不會有太大問題议忽。
針對這些表現(xiàn)腰吟,這里提出了一套解決方案,那就是在世界空間中擺放多套slice徙瓶,當(dāng)相機發(fā)生旋轉(zhuǎn)時毛雇,根據(jù)角度的不同,對不同的slice采樣結(jié)果進行混合侦镇,這種做法的結(jié)果對比參考上下兩圖灵疮。
為了便于理解,這里給出了一套頂視示意圖:
垂直豎線表示的是采樣slice的位置壳繁,可以看到震捣,在單套slice的作用下荔棉,相機旋轉(zhuǎn)角度過大就會導(dǎo)致采樣點分布出現(xiàn)問題,下面給出增加一套垂直相交的slice時的采樣點表現(xiàn):
下面介紹一下實現(xiàn)細節(jié)蒿赢,首先润樱,需要選定對應(yīng)的slice,這個是通過對射線以及slice的法線的夾角與給定的夾角進行比較來得出羡棵。
選定slice之后壹若,就需要計算當(dāng)前射線在這個slice上的起始采樣點以及采樣步長
:
對于某個slice占據(jù)主導(dǎo)地位的情況(如下圖綠色區(qū)域)來說,只需要進行單套slice的采樣就可以了皂冰,但是對于處于兩套slice中間區(qū)域的射線(如下圖黃色區(qū)域)而言店展,可能就需要同時對兩套slice進行采樣,之后對結(jié)果進行blend:
如上圖所示秃流,這里給出了相機水平掃射時的各射線raymarching次數(shù)的示意圖赂蕴,跟前面一樣,黃色表示的是兩次raymarching的情況舶胀,這些raymarching區(qū)域構(gòu)成了一個帶斜邊的八邊形概说,不考慮黃色斜邊的話,每條射線需要在四套slice(不考慮正負方向)之間進行判斷哪套slice占據(jù)主導(dǎo)地位嚣伐,而如果是3D情況的話席怪,就會更加復(fù)雜,需要在九套slice之間進行判斷纤控。
考慮多套slice之間的混合關(guān)系挂捻,如果走動態(tài)分支的話會導(dǎo)致較高的浪費,因此最高效的做法是將單套slice船万,兩套slice刻撒,三套slice之間混合的部分拆成多個section,分別走不同的shader靜態(tài)分支耿导。
這里給出實際場景中各個位置的slice套數(shù)示意圖:
以及最終的渲染效果:
原文還給了一個視頻声怔,從效果上來看,基本上很難看出slice過渡導(dǎo)致的瑕疵舱呻。