王波 許申益
(長春理工大學 計算機科學技術學院,吉林長春 130022)
光線跟蹤算法執行過程中,一旦發現光線與物體相交就會進行陰影測試,如果交點與光源之間存在遮擋就會判定交點處于陰影中,這樣就使得透明物體背后無法繪制焦散光斑。光子映射可以繪制出較高質量的焦散[1,2]以及漫反射輝映效果。然而,由于光子映射[3]要發射大量的光子,所以其開銷相比于光線跟蹤仍然不具備優勢。相比之下,光線跟蹤具有極高的運行效率,而且具有天然的并行化優勢,實驗證明,CUDA構架下本文繪制焦散效果的方法具有更高的運行效率。
本實驗基于OptiX光線跟蹤引擎[4]。算法包括兩次光線跟蹤。如圖1,第一次光線跟蹤用于計算焦散光斑信息,首先將相機放置到光源位置,記錄經過折射的光線在漫反射表面的世界坐標以及亮度信息。第二次光線跟蹤用于生成最終的結果,相機放在視點位置。兩次光線跟蹤所得的結果進行疊加得到最終包含焦散效果的場景圖。
具體步驟如下:
(1)新建OptiX項目,場景主要包含一個點光源,一個具有玻璃材質的由三角網格構成的三維幾何對象以及具有漫反射材質的地板和墻壁。(2)設置相機參數初始化光線跟蹤引擎。分別設置三個程序切入點,分別完成焦散圖的繪制,坐標變換以及第二次光線跟蹤。將第一次光線跟蹤的分辨率設置為400*400,并調整相機的視場角使整個玻璃材質的對象完全處于相機視野范圍內,將最大遞歸深度設置為3。同時只記錄漫反射表面且遞歸深度為2的交點信息。(3)創建緩沖區,分別記錄第一次光線跟蹤返回的漫反射表面交點的亮度信息,漫反射表面交點的世界坐標,以及經濾波后產生的焦散圖。(4)從光源位置進行第一次光線跟蹤,只記錄經玻璃體兩次折射后與漫反射表面相交的交點信息。將所得結果存儲在事先開辟的緩沖區中。(5)將第一次光線跟蹤所得焦散圖進行坐標變換,將其變換到視點所對應的坐標系中。并對所得的焦散圖進行高斯濾波。(6)從視點位置進行第二次光線跟蹤。將所得渲染結果存儲到之前開辟的緩沖區,并將第一次渲染所得的結果與本次結果進行疊加即可得到具有焦散效果的圖像。
圖1 兩次光線跟蹤
實驗結果如圖2所示,相比傳統的光子映射算法,實驗中提出的算法在時間復雜度上具有一定的優勢。當場景中包含的頂點數較少時,該算法的優勢更加明顯。當然,由于本算法存在兩次光線跟蹤,且焦散圖的使用需要進行坐標變換,所以當場景復雜度進一步增加,算法的效率優勢將有所下降。同時,相關實驗數據表明:由于濾波算法需要消耗一定資源,所以實驗提出的算法在濾波前后繪制速度有一定的下降,但總體效率仍然控制在可接受的范圍。
圖2 本文算法(上)與光子映射(下)
[1]Wyman C,Davis S. Interactive image-space techniques for approximating caustics[C]. In: Proc.of the 2006 Symposium on Interactive 3D Graphics and Games,New York:ACM Press, 2006,13(2):153-160.
[2]Musawir Shah,Jaakko Konttinen, Sumanta Pattanaik.Caustics Mapping:An Image-space Technique for Real-time Caustics[J],2012,7(29):63-74.
[3]Henrik W J.High Quality Rendering using Ray Tracing and Photon Mapping[J].In: Proc. of ACM SIGGRAPH 2007,2007,12(2):112-121.
[4]NVIDIA,2015.NVIDIA OptiX Ray Tracing Engine Programming Guide Version 3.8.