Real-Time Ray Tracing 1

實時光線追蹤和實時全局光照都是光線彈射兩次,實時光線追蹤在一個像素上只採樣一次,即只有一根光線穿過一個像素打到場景內(1SPP),在打到第一個地方叫primary hitpoint,然後從這點向光源連線,判斷它是否在陰影內。然後就是從primary hitpoint彈射到另一個物體表面,這一點叫secondary hitpoint,再從這點連向光源判斷是否在陰影內。

 

這裏的光線從像素到場景內第一個交點時,用了光柵化來代替,因爲光柵化就是一次光線的彈射。

 但是由於是1SPP,所以會有非常高的噪聲,所以實時光線追蹤的主要技術就是降噪。

工業做法是濾波,其核心思想是:假設前一幀是做好濾波處理的,這裏使用了motion vectors的概念,motion vectors能夠找到當前幀某個點在上一幀的位置,然後使用上一幀所濾波好的結果。

 

 

 The G-Buffers:Geometry buffer,可以很容易的獲得像素對應深度、法向量、世界座標,這是在屏幕空間下。

 

 

 Back Projection:在當前這一幀某個像素所對應場景內的點,獲得前一幀這個點所對應的像素。

 

 有兩種方法:第一種方法是用G-buffer,可以很容易的得到在某個點的空間座標,如果物體是在運動,也需要算出前一幀物體上那個點的座標,然後MVPE計算出在屏幕上的座標,還有一個就是MVPE的逆變化算出空間座標,然後再用MVPE計算出在屏幕上的座標。當然G-buffer會更加容易。

 

 

字母頭上的 ~代表沒有濾波,-代表還沒有濾波,在得到motion vector後,用前一幀和當前幀的濾波做線性求和,就是當前幀最後的濾波結果。當前幀自己也會濾波,但再怎麼濾波,由於是1SPP,效果都會非常差,所以上一幀的濾波結果佔了大部分比例。但如果是運動中的物體,也會有問題。

 

 

 但是會有一些問題,比如場景切換問題,這樣上一幀就不能用到當前幀了。

 

 

當攝像機在往後運動,會有更多的場景進入視線範圍內。這樣的話前一幀就是空白的。

 

 

在下圖中,左邊是上一幀,右邊是當前幀,箱子被推向左邊,是在運動的。圖中藍色點在後面的一個白色物體上面,通過motion vector可計算出在上一幀的位置,但上一幀中這個位置卻在箱子上,後面的白色物體被遮擋了。這是如果使用上一幀的濾波來處理就會發生問題。

 

 如果忽略這問題,依然使用上一幀來放到下一幀中,上一幀佔到90%左右,這時箱子的表面就會留到後面的白色物體上,也就是留下殘影。

 

 有兩種調整方案:Clamping,以上面的例子,它是把上一幀的箱子向藍色點拉近,然後再進行線性計算。

Detection,通過motion vector計算出當前幀位置和前一幀所在位置不是同一個物體時,就可以不用前一幀了,但這樣會有高噪聲的問題,因爲只有當前幀的濾波了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章