基于光线跟踪的焦散绘制算法研究
2018-06-14王波许申益
王波 许申益
(长春理工大学 计算机科学技术学院,吉林长春 130022)
1 引言
光线跟踪算法执行过程中,一旦发现光线与物体相交就会进行阴影测试,如果交点与光源之间存在遮挡就会判定交点处于阴影中,这样就使得透明物体背后无法绘制焦散光斑。光子映射可以绘制出较高质量的焦散[1,2]以及漫反射辉映效果。然而,由于光子映射[3]要发射大量的光子,所以其开销相比于光线跟踪仍然不具备优势。相比之下,光线跟踪具有极高的运行效率,而且具有天然的并行化优势,实验证明,CUDA构架下本文绘制焦散效果的方法具有更高的运行效率。
2 算法描述
本实验基于OptiX光线跟踪引擎[4]。算法包括两次光线跟踪。如图1,第一次光线跟踪用于计算焦散光斑信息,首先将相机放置到光源位置,记录经过折射的光线在漫反射表面的世界坐标以及亮度信息。第二次光线跟踪用于生成最终的结果,相机放在视点位置。两次光线跟踪所得的结果进行叠加得到最终包含焦散效果的场景图。
具体步骤如下:
(1)新建OptiX项目,场景主要包含一个点光源,一个具有玻璃材质的由三角网格构成的三维几何对象以及具有漫反射材质的地板和墙壁。(2)设置相机参数初始化光线跟踪引擎。分别设置三个程序切入点,分别完成焦散图的绘制,坐标变换以及第二次光线跟踪。将第一次光线跟踪的分辨率设置为400*400,并调整相机的视场角使整个玻璃材质的对象完全处于相机视野范围内,将最大递归深度设置为3。同时只记录漫反射表面且递归深度为2的交点信息。(3)创建缓冲区,分别记录第一次光线跟踪返回的漫反射表面交点的亮度信息,漫反射表面交点的世界坐标,以及经滤波后产生的焦散图。(4)从光源位置进行第一次光线跟踪,只记录经玻璃体两次折射后与漫反射表面相交的交点信息。将所得结果存储在事先开辟的缓冲区中。(5)将第一次光线跟踪所得焦散图进行坐标变换,将其变换到视点所对应的坐标系中。并对所得的焦散图进行高斯滤波。(6)从视点位置进行第二次光线跟踪。将所得渲染结果存储到之前开辟的缓冲区,并将第一次渲染所得的结果与本次结果进行叠加即可得到具有焦散效果的图像。
图1 两次光线跟踪
3 实验结果与分析
实验结果如图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.