1.1 Optix 总览
光线跟踪很适合并行计算的方式实现,GPU在开发并行计算程序时有很大的优势。然而光线跟踪GPU并行算法极不规则,非专业人员不能为之,或为之不能极大发挥GPU的并行计算能力。英伟达Optix光线跟踪引擎很好地解决了这个问题,使得开发并行光线跟踪程序变得相对容易。开发人员不必是图形学专家或者是一个专注于光线跟踪的团队。
Optix 不仅仅是个渲染器。它是一个面向应用的可扩展光线跟踪框架,包括两个部分:
(1)主机端API,用于定义光线跟踪的数据结构
(2)设备端基于Cuda C++的编程系统,用于产生光线,碰撞检测,着色等。
这两部分都能够提供更低层级的原生光线跟踪功能,这样开发者就可以将Optix应用到图形图像,碰撞检测,声音传播等领域。
1.1.1动机
通过抽象出一个通用光线跟踪器的执行模型,Optix可以使开发者很容易地组装一个光线跟踪系统。开发者可以自定义模型遍历,着色方式,以及内存,显存管理等功能。更重要的是,Optix会随着硬件的发展而不断演进,这一点和光栅化图形库openGL和Direct 3D相似。
只要有可能,Optix引擎都会避免对光线跟踪特定行为的说明,而是提供一个执行Cuda程序的机制以实现着色,相机模型,甚至颜色表达。所以它能够实现递归式光线跟踪,path tracing,碰撞检测,光子贴图或者其它基于光线跟踪的程序。它还可以与openGL和Direct 3D进行互操作,实现混合光线跟踪应用。
1.1.2 编程模型
Optix的核心是一个简单且功能强大的抽象光线跟踪器。它利用用户自定义程序来达到控制光线生成,碰撞检测,材质着色和激发新光线的目的。每一条光线(ray)都携带有相应的负载(payload),例如颜色,递归深度或其他属性。开发者需要以CUDA代码的形式向Optix提供相应的功能函数。由于Optix内置递归算法, Optix允许自定义程序产生新光线,而内在的执行机置管理着递归堆栈的细节。Optix 提供了灵活稳定的函数分发和精确的变量继承机制,所以光线跟踪程序能够兼顾其通用性与复杂性。
1.2光线跟踪基础
光线跟踪有许许多多的含义。有时它代指直线与三维物体碰撞点的计算。有时它代指某一特定算法,例如Whetted 式的图像生成方法,在石油开采领域对地震波的仿真。有时它代指一组算法,比如Whetted 算法与其他算法结合,例如分布式光线跟踪。Optix作为一个光线跟踪引擎首先应当满足:用户可以使用它实现光线与物体碰撞;其次,用户可以通过自定义程序实现类似于Whetted 光线跟踪的算法;还有在发生碰撞后,它可以产生光线并能够定义新产生光线的行为。
1968年Arthur Apple在渲染固体场景时,光线跟踪在图形学中被首次提出。在1980年,Turner Whetted 将这个思想推进一步,将递归引入光线跟踪,进而可以模拟反射和折射的效果。此后,一连串的进步增加了光线跟踪的准确性,例如引入景深,全内反射,软阴影,运动模糊等。与此同时,许多的研究者通过索引场景中物体极大的提高了光线跟踪的效率。基于光线跟踪的真实渲染算法已经能够精确模拟光线传播。其中一些算法可以在虚拟环境中模拟正向光线跟踪,其余一些模拟反向光线跟踪,或者二者的结合。OPTIX对这三种光线跟踪类型都有很好的支持。
光线跟踪也可以应用于非图形学领域。在计算机辅助设计领域中,光线跟踪可以估算复杂零件的体积。从零件上发射一组平行光线至一横断面,光线从零件上一点到横断面的距离可以确定,将其与横断面面积相乘即可得到相应的体积。还有在游戏中,鼠标的拾取操作也可以看作是光线跟踪的一个应用。Optix能够很轻松地实现以上操作。
对于光线跟踪最普遍的一个特性是计算光线和三维物体碰撞点。在图形渲染程序中,光线与三维物体发生碰撞后会激发新的光线,用于折射或反射等。其他的应用可能不关心光线的行为,而关心碰撞发生时碰撞点所附带的属性。不同需求意味着Optix应能够灵活多变地支持各种场景属性查寻和自定义属性查寻。
光线跟踪还有一个不错的特性,它支持很多几何图形与光线的直接碰撞,例如球体而不用剖分。另外一个特性是光线跟踪的执行时间与三维场景中物体数目是次线性关系,即2N个物体的渲染时间小于二倍N个物体渲染时间。构建加速结构可以将没有参与碰撞的物体进行剔除,进而提高碰撞效率。对于静态物体来说,加速结构将存在于整个程序周期中。对于动态物体来说,Optix支持重建加速结构。加速结构只查询几何体的包围体,当物体被添加时,开发人员需要向Optix提供相应的包围盒,这样加速结构就能得到相应的更新。
对于图形应用来说,光线跟踪技术相对于光栅化技术拥有很多的优势。光线跟踪技术支持各种类型的虚拟相机且易于实现,例如正交相机,针孔相机,全景相机等。屏幕中的像素点可与任意光线结合,故光线的起点不一定是同一起点。光线跟踪易于实现无锯齿失真的硬阴影,软阴影也不难实现。光线跟踪程序还可以和传统的图形学程序进行交互,比如OPENGL或D3D 调用可Optix渲染出来的纹理。相反地,OPENGL或D3D中深度缓冲区可作为Optix的光线起点用于计算镜面光反射。
如果想对光线跟踪了解更多一些可参考以下文献:
1.The classic and still relevant book is “An Introduction to Ray Tracing” (Edited by A. Glassner, Academic Press, 1989).
2.A very detailed beginner book is "Ray Tracing from the Ground Up"(K. Suffern, AK Peters, 2007).
3.A concise description of ray tracing is in “Fundamentals of Computer Graphics” (P. Shirley and S. Marschner, AK Peters, 2009).
4. A general discussion of realistic batch rendering algorithms is in"Advanced Global Illumination" (P. Dutré, P. Bekaert, K. Bala, AK Peters, 2006).
5.A great deal of detailed information on ray tracing and algorithms that use ray tracing is in "Physically Based Rendering" (M. Pharr and G. Humphreys, Morgan Kaufmann, 2004).
6. A detailed description of photon mapping is in “Realistic Image Synthesis Using Photon Mapping” (H. Jensen, AK Peters, 2001).
A discussion of using ray tracing interactively for picking and collision detection, as well as a detailed discussion of shading and ray-primitive intersection is in "Real-Time Rendering" (T. Akenine-Möller, E. Haines,N. Hoffman, AK Peters, 2