这是一个十分难于全面回答的问题。
我的背景:并行计算,图形学经验限于传统的光栅化渲染,参与编写过一个小型的图形引擎以及一个体绘制引擎,写过一个十分简单的基于CPU的ray tracer作为课程项目,在线上过Stanford的CS348B渲染课程,零零散散的使用pbrt实现了课上要求的若干作业。所以我对图形学和光线追踪有所了解,但相比知乎里的诸多图形学程序员,涉猎的还很有限,这里的答案多数来自自己的理论分析及和一些实验室同学及其他同行的讨论。这题已经有很多好的答案了,我想尽量不和已有的内容重复,请各位多指教。
(相当严格的)定义:首先来定义实时光线追踪。我认为一个严格的定义如下:使用基于光线追踪的算法(包括ray tracing, path tracing, photon mapping, beam tracing, cone tracing等等 )进行图形渲染。渲染对象是包含真实刚体及柔体物理模拟的动态场景。场景分辨率需达到720P(1280×720),并需要允许动态摄像机以及多光源(点/面光源)。渲染帧率需不低于30并以60为目标,渲染结果应该有较小的(肉眼难于分辨的)噪点。如果是path tracing等蒙特卡洛方法,则还需要无偏的结果(不然会出现局部模糊等artifacts)。
应用:目前的应用包括:各类照片级渲染应用中场景设计的快速原型生成,视频游戏中的部分场景渲染。未来的应用领域会更加广阔。
难点:@lgthetyro 的答案对光线追踪算法有很好的描述。因为光线的传播是方向可以互易的物理过程,于是从屏幕像素发射光线到场景,在相交测试结束后根据光源和物体本身的材质属性来计算像素颜色改变,同时生成供下一轮计算的新的光线(根据物体的属性可以产生额外的光线或改变当前光线的属性)。可以看到这是一个迭代收敛的过程。那么仅从光线角度看,计算量有多大呢?以30帧的帧率,720P的分辨率(约一百万像素)来计算,每秒需要计算三千万条光线和场景的相交检测及光照计算。而这样一个像素对应一条光线(之后用ray per pixel RPP来代替)的方法仅仅能渲染出硬阴影和一层反射折射,多层反射折射需要4-12RPP,软阴影需要10-20RPP,Path Tracing需要500以上的RPP,Ambient Occlusion需要100左右的RPP。如果从场景复杂度来计算,对每帧场景的渲染不仅要考虑每条光线的遍历,同时也要考虑每个三角面片的遍历,对场景遍历进行相交检测可以通过一些层级结构来进行(最普遍认为的高效数据结构是Bounding volume hierarchy)。实时的光线追踪的难点就在于场景复杂度和需要的真实感渲染效果决定了遍历和相交检测的巨大计算量(场景分割数据结构的重构和光线与场景的相交测试是两项主要计算)。这是渲染领域以及任何模拟计算领域里终极的矛盾:效率和质量的矛盾。
解决方案:和其他图形学算法一样,如果要应用在实时类应用中,效率是关键。目前的解决方案有两个方向的努力:1)软件角度。2)硬件角度。我个人没有实现过任何这类算法,所以不能谈细节,下面是high-level的描述。
软件角度又可以分为自低向上和自顶向下的优化:BVH和其他层级结构的场景分割(kd-tree, oc-tree, BSP-tree等)是自顶向下的方法,在对场景进行分割时还有一项十分常用的优化算法:Surface Area Heuristic (SAH)。其基本思想是在将场景分割为两部分时(这是BVH, kd-tree以及BSP-tree的基本场景分割操作),考虑分割后遍历及计算相交检测的总cost函数最小。而光线击中一个包围盒(Bounding Volume)的概率和其表面积相关(SAH将其进一步简化为线性相关),所以采用二分法寻找cost最优的分割平面会给其后的计算带来效率的提升。
自底向上的优化则包括packet tracing和ray reordering。Packet tracing的思路是将方向接近的一组光线打包,同时进行相交检测,这样在检测中可以利用空间相关性,同时对一组光线也只需要调用一次BVH。Ray reordering是说在每个packet相交检测结束后重新将方向接近的光线reorder到一个packet中,从而保持coherence的特性。
硬件角度的优化又可以分为采用GPU和SIMD的优化以及专门的ray tracing硬件。前者就是对上述软件优化的算法进行针对GPU或SIMD的优化,同时一些并行环境下的数学库函数和其他基本算法如排序等也间接起到了加速的作用。后者就是指将ray tracing中独有的相交检测,场景分割等部分采用专门的硬件来优化,比如刚刚推出的PowerVR GR6500(图片来自:AnandTech | Imagination Announces PowerVR Wizard GPU Family: Rogue Learns Ray Tracing):
对于其他知友提到的很多ray tracer,都或多或少采用了以上的优化方法。
次世代主机游戏中的光线追踪一般都有很多对场景、光源、以及效果的限制,还有很多其他的hack和加速方法,我无法一一了解并描述。 欢迎各位补充。
总结:种种迹象表明,光线追踪的效率会随着图形硬件的发展而进一步提高。严格的实时光线追踪实现起来十分困难,但对场景,光源和渲染算法有限制条件的情况下,实时光线追踪已经在视频游戏和一些其他应用中实现,并还会有更好的应用。一个更广义的问题是,如何解决计算效率和计算质量(精度)的矛盾?或许我们永远不会同时需要这两者?
— 完 —
本文作者:王洋子豪
【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)
此问题还有 13 个回答,查看全部。
延伸阅读:
任天堂的次世代主机算不算历史的倒退?
让你魂牵梦绕的第一部次世代游戏机是什么,当时为什么爱它?