Real-time Ray Tracing
RTX是一種硬件架構(gòu),能夠更方便的追蹤光線。每秒能處理10G的光線(指一個像素的樣本,sample per pixel),但并不是全程算力都在處理光線,還會做降噪等工作。所以在RTRT中,我們只能做到1SPP的光追精度。
RTRT在做什么:陰影、反射和鏡面反射、環(huán)境光遮蔽、全局光照(光線追蹤適合做的事)
RTX處理的反射情況非常多,因為glossy的表面更容易做RTRT,diffuse倒更復(fù)雜
RTRT

基本是路徑追蹤算法(path tracing)的簡化,本身的突破是因為硬件能力增加,關(guān)鍵技術(shù)是降噪。
最簡單的情況:是一條光路的樣本(1SPP):
包括1次著色點光柵化(從相機像素出發(fā)的光線擊中的交點)+
1條著色點光源的可見性光線(著色點到光源連接,采樣光源并判斷遮擋)+
1條二次彈射的間接光照(根據(jù)著色點的材質(zhì)采樣出一個方向,發(fā)射光線,擊中的表面是次級光源,計算次級光源對著色點的影響)+
二級光源到光源的可見性測試光線(二次光源與光源連接判斷遮擋)
路徑追蹤是基于蒙特卡洛積分的方法,本身會產(chǎn)生噪聲,采樣的樣本越多噪聲越小,RTRT使用了1SPP的方法,會產(chǎn)生非常大的噪聲。所以RTRT的核心技術(shù)是降噪,如何從噪聲圖生成清晰的圖。
降噪目的是:在1SPP的前提下,進(jìn)行降噪,達(dá)到畫面質(zhì)量要求(沒有過模糊,沒有artifacts,保留了所有細(xì)節(jié)),并高效處理。
使用切邊濾波系列(SF,AAF,F(xiàn)SF,MAAF)、離線濾波方法(IPP,BM3D,APR)、深度學(xué)習(xí),等降噪方法對RTRT降噪不可能。
G-buffer
G-buffer:幾何緩沖區(qū):在渲染的過程中獲得的免費的屏幕空間信息,比如逐像素深度、法線、世界坐標(biāo)、直接光照結(jié)果、反照率kd等等。是屏幕空間的信息。也可以都各自保存進(jìn)gbuffer中,方便后續(xù)使用。
RTRT時域濾波方法
是工業(yè)界常用的解決方法。關(guān)鍵思路:假設(shè)前一幀被降噪完畢,并假設(shè)幀與幀間的連續(xù)性。使用motion vector尋找前一幀的位置,將前一幀的結(jié)果復(fù)用。相當(dāng)于增加了SPP。
motion vector:描述了屏幕空間中的物體在幀與幀之間運動的相對位置(上一幀像素對應(yīng)的片元,與下一幀該片元對應(yīng)的像素位置的相對移動)

RTRT時域濾波的方法:
- 先對當(dāng)前幀做簡單的濾波處理(后面講)
-
獲得兩幀之間內(nèi)容的motion vector,也就是找到兩幀之間的內(nèi)容的位置的對應(yīng)關(guān)系。
- 獲得像素
所對應(yīng)的片元
- 每一幀生成G-buffer,保存這一幀的世界坐標(biāo),然后取
其對應(yīng)的世界坐標(biāo)
- 想要得知
上一幀的位置,可以看作上一幀的位置經(jīng)過了變換
得到了這一幀的位置,那么對這一幀的位置應(yīng)用逆變換
,就能得到上一幀的位置。(BackProjection下文講)
- 獲得像素
- 將當(dāng)前幀和上一幀的結(jié)果線性混合
時域濾波.png
Back Projection
要找到當(dāng)前幀某一像素的內(nèi)容,對應(yīng)上一幀哪個像素,Back Projection就是求解motion vector的方法。
- 首先要求出這個點的世界坐標(biāo)(如果保存了G-buffer可以直接取值用;如果沒有保存,通過逆視口變換、逆VP變換得到)。
- 如果兩個幀間物體發(fā)生了移動,則當(dāng)然應(yīng)該擁有移動變換矩陣,將這一幀的世界坐標(biāo)乘逆變換矩陣,從而得到上一幀這個點的世界坐標(biāo)(如果物體沒有移動,那么就失效)。
- 將上一幀的世界坐標(biāo)經(jīng)VP和視口變換得到上一幀的像素位置。從而得到motion vector。
時域濾波的問題:
- 鏡頭的第一幀,或光源突變的情況無法處理。
- 屏幕空間信息不足:比如屏幕外的點進(jìn)入了屏幕內(nèi)(由于時域濾波基于屏幕空間)
- 被遮擋的物體突然出現(xiàn)(本質(zhì)還是屏幕空間問題)
- 由于世界空間幾何位置沒有變化(從而motion vector沒有變化),導(dǎo)致陰影、反射等滯后的現(xiàn)象。
解決方法:主要是clamping和detection。
- clamping:將前一幀的結(jié)果“拉近”當(dāng)前幀,再做混合,可以削弱兩幀差異過大的情況下,前一幀對當(dāng)前幀的影響。
- detection:我們可以檢測是否使用上一幀的結(jié)果。比如可以判斷前后兩幀motion vector對應(yīng)的像素對應(yīng)的物體是否為一個物體,從而決定是否使用上一幀的結(jié)果。這時使不使用前一幀就變成了非0即1的問題。當(dāng)是同一物體時,我們才使用插值系數(shù)
。
空間域濾波的方法
上文介紹了如何實現(xiàn)時域濾波,在時域濾波前我們會對1SPP的圖像進(jìn)行一次空間域的濾波,這次空間與的濾波可以有效地把原圖降噪。
空間域濾波最常用的方法是使用基于距離的高斯濾波核進(jìn)行濾波。這種濾波考慮的部分大概是范圍內(nèi)對中心像素有貢獻(xiàn)。

而一般情況下,我們使用基于距離的高斯濾波核對充滿蒙特卡洛積分得來的噪聲的原圖進(jìn)行濾波時,會使圖像均勻變糊,也就是損失了有用的高頻信息。
我們在對原圖進(jìn)行濾波時,要首先明確:不是所有的高頻信息就全是噪聲,當(dāng)然也不是低頻信息中就沒有噪聲。于是我們需要保留有用的高頻信息。
雙邊濾波(Bilateral Filtering)
雙邊濾波基于一個觀察:當(dāng)此處顏色變化非常劇烈,我們認(rèn)為是邊界。
所以雙邊濾波的思路是:找到一個保留邊界的方法——如果像素與像素
的顏色差異非常大,就讓像素
貢獻(xiàn)少一些;僅僅向濾波核添加一些控制的方法就可得到。

雙邊濾波在對兩個像素
這是一個很直觀的判斷,僅僅向濾波核添加了關(guān)于顏色差異控制的方法就可得到結(jié)果。因為雙邊濾波將顏色變化劇烈的位置認(rèn)為成邊界,然而事實上,顏色差異的劇烈不能區(qū)分兩點是在邊界還是噪聲,這是雙邊濾波的固有問題。
聯(lián)合雙邊濾波(Joint Bilateral filtering)
我們可以看到:高斯濾波提出了一個濾波標(biāo)準(zhǔn),即兩像素之間的距離;雙邊濾波提出了兩個濾波標(biāo)準(zhǔn),即像素位置距離和顏色距離;那么我們也可以使用更多的特征來幫助濾波。由此而提出的聯(lián)合雙邊濾波是非常適用于RTRT下的濾波。
使用G-buffer,作為新的標(biāo)準(zhǔn)幫助濾波。因為G-buffer是完全沒有噪聲的,G-buffer在光柵化過程中生成,和光線多次彈射無關(guān)。聯(lián)合雙邊濾波還可以考慮其他的標(biāo)準(zhǔn),每一個標(biāo)準(zhǔn)的σ和μ都可以單獨考慮,濾波的閾值(多大距離算大)也可以主觀設(shè)置
例如下圖中:AB之間深度差距過大,BC間法線差距過大,DE間顏色差距過大

還有一個問題:我們?yōu)V波過程中所用的濾波核是NxN大小的,對于每個著色點的濾波都要遍歷它NxN范圍內(nèi)的鄰居,開銷很大。對于小濾波核來說可以接受,但是對于大濾波核,開銷巨大。
對于大濾波核有兩種加速濾波的辦法:
-
將2維高斯核拆分成一次1維的水平濾波和一次1維的垂直濾波。因為二維高斯濾波在數(shù)學(xué)定義上是水平垂直兩次1維高斯濾波疊加而成的,本身就是可拆分的。這樣我們只需要訪問2xN次紋理,即可計算出NxN區(qū)域內(nèi)的濾波結(jié)果。
注意:只適用于高斯濾波的情況下,其他種類的聯(lián)合雙邊濾波濾波核過于復(fù)雜,不容易分離成水平和豎直兩次濾波。
2維高斯濾波.png -
逐步增長濾波步長。舉例方法:a-trous wavelet:是多pass的方式,每個pass對每個像素都濾波,但是樣本間隔增加。
增長濾波步長.png
在上圖例子中,我們需要計算用大小為64x64的濾波核濾波后的結(jié)果,最初使用5x5的濾波核,在5個Pass中,每個Pass逐次增加采樣間隔,在第Pass時,采樣間隔為
(每個Pass增加
,也就是說第1Pass比第0Pass間隔增加了
,第2Pass比第1Pass間隔增加了
,第3Pass比第2Pass間隔增加了
)。這樣到第5個Pass時,采樣間隔為15,采樣跨度為
,正好和64x64大小的濾波核大小相同。而我們一共查詢了555次紋理,相比于64*64要節(jié)省很多。
Outlier Removal(移除噪點,Outlier指亮度極其高的噪點)
由于outlier的亮度會非常大,導(dǎo)致濾波后它的亮度會貢獻(xiàn)到周圍點,形成塊狀亮斑,所以要在濾波前將outlier檢測并剔除。但是由于outlier的結(jié)果也是合理的,剔除outlier導(dǎo)致能量不守恒,但是RTRT領(lǐng)域為了效率只能這樣做。

檢測Outlier:對于任何像素,取它周圍7x7的范圍,計算范圍內(nèi)的均值/方差/中位等(自己設(shè)計),在有效范圍以外則可以記為outlier。
Outlier檢測出來后,我們可以把Outlier clamp到接近的范圍,如
Spatiotemporal Variance-Guided Filter(SVGF,時空差異引導(dǎo)濾波)
在講述高斯濾波和雙邊濾波時提到,我們需要判斷高頻信息屬于噪聲還是圖像信息,保留有用的高頻信息。
SVGF與在時空上降噪的方法差不多,SVGF增加了偏差分析和其他的技巧。
主要思想:SVGF是一種聯(lián)合雙邊濾波
它通過三個因素指導(dǎo)濾波:
-
深度:考慮兩點的深度差異對濾波的影響,當(dāng)然是深度差異越小,濾波貢獻(xiàn)越大。但是不能單純只考慮深度,要聯(lián)合考慮二者法線差異和深度差異,如果是同一平面但深度不同的點,考慮沿平面的深度差距。
SVGFDepth.png
在圖中展示的A與B點,在同一個平面上,顏色也相近,所以理論上A和B會相互貢獻(xiàn)不少權(quán)值。但由于A與B有很大深度差異,如果用深度判斷的話,會判定A和B不會有很大的貢獻(xiàn)。這產(chǎn)生了矛盾,所以我們不能簡單地用深度來判斷貢獻(xiàn)值,我們需要考慮A和B沿平面方向上的深度變化。
在深度權(quán)重公式中,我們聯(lián)合考慮了兩點深度和平面梯度的關(guān)系,由于公式中是的形式,所以差異越大,貢獻(xiàn)越小。
-
法線:
我們考慮兩點法線的差異,我們用兩個點法線向量求一個點積,由于求出來的值有可能是負(fù)值,因此使用把負(fù)的值給clamp到0。而
是為了更突出法線變化,放大法線變化效果。
注意:如果使用法線貼圖,使用法線貼圖變換前的法線。
SVGFNormal.png -
亮度(兩點顏色間的灰度差距)
任意兩點間我們考慮它們的顏色差異,如果顏色差異過大,則認(rèn)為兩點位置靠近邊界,此時A和B的貢獻(xiàn)不應(yīng)該過大。
但是由于噪聲的存在會出現(xiàn)一些干擾,也就是B點雖然在陰影里,但是可能剛好選擇的點是一個噪聲,導(dǎo)致B點比較亮,同時A不在陰影里也很亮,那么A和B亮度差異小,就會互相貢獻(xiàn),但是這樣是錯誤的現(xiàn)象。這時就需要SVGF中Variance發(fā)揮作用。
SVGFLuminance.png
方差的計算:1. 計算需要濾波的點7x7范圍內(nèi)的方差 2. 按時域的方法,通過motion vector計算上一幀對應(yīng)像素的方差,并計算平均(相當(dāng)于按時域濾波了,將方差變得時域上平滑) 3. 再在周圍3x3的區(qū)域內(nèi)做空間的平均濾波
Recurrent denoising AutoEncoder(RAE,循環(huán)降噪自動編碼器)
通過循環(huán)神經(jīng)網(wǎng)絡(luò)在時域上,基于Gbuffer和1SPP的渲染圖,從而計算降噪的渲染圖。





