【游戏开发技术帖】光线追踪技术的误点和难点

2015年09月22日 11:38 0 点赞 0 评论 更新于 2017-05-08 16:53

实时光线追踪技术有可能出现在当前的次世代主机上吗?作为一名有着多年实时、离线渲染经验的从业者,我来谈谈我的看法。我认为当前的次世代主机不太可能实现这一技术。在未来3 - 5年,也许会出现一些基于光线追踪的非全局光照算法,例如镜面反射算法等,主要用于弥补或增强现有算法的缺陷。而光线追踪技术的真正普及将会是一个漫长的过程,需要整个行业共同努力。至于真正的无偏全局光照,要实现实时计算,所需的计算量在可预见的未来仍然过大。

一提到光线追踪,许多人的第一反应是将其视为图形渲染的圣杯,认为实现该技术后,游戏画面将如同好莱坞大片般震撼。这其实是一种不切实际的主观臆想。

误点1:将光线追踪等同于全局光照,甚至等同于一系列高级特效

许多人认为光线追踪等同于全局光照,甚至将其与焦散、云雾、次表面散射、基于物理着色等一系列高级特效划等号。实际上,光线追踪单纯指的是计算三维空间中给定射线与一群三角形交点的过程。这在逻辑上是一个非常简单的操作。基于这一操作,我们可以衍生出许多全局光照算法。

该操作之所以如此有用,本质原因在于渲染方程是一个表面法线周围半球上的积分。在这个半球方向上,无论是光源,还是各种形状、材质的其他物体,都会对该表面的颜色产生影响。在不清楚这个半球方向范围内具体情况时,发射光线对周围进行采样是最通用的方法,但也是效率很低的方法,如下图所示。此外,光线追踪除了用于场景采样,还可应用于碰撞检测、寻路等与渲染无关的领域。

误点2:认为有了光线追踪,游戏画面就能实现电影化,且基于光栅化的方法无法做好光照计算

有人认为有了光线追踪,游戏画面就能实现电影化,并且认为基于光栅化的方法无法做好光照计算,需要被彻底推翻。这种观点完全忽视了过去20年图形学界和游戏开发者所积累的各种技术、技巧和优化成果。下面举两个例子进行说明。

例子1:虚幻引擎4的建筑可视化

下面的图片展示的是使用虚幻引擎4制作的建筑可视化效果。对于这种静态场景,光照贴图(Light Map)通过预计算轻松解决了最难处理的漫反射部分,在运行时不会产生任何额外开销。UE4使用Photon Mapping算法计算光照贴图,这是一种一致的全局光照算法。也就是说,最终结果结合屏幕空间反射(SSR)和探针(Probes)处理镜面反射部分后,与离线渲染结果基本没有差别,在小场景中以60帧每秒的帧率运行毫无压力。

例子2:Unreal的风筝demo

Unreal的风筝demo使用的地形是Epic在新西兰实地扫描的,目标是创造类似皮克斯动画电影的体验。不过,这个demo在CPU上运行时难以达到60帧每秒,任务管理器的资源占用率极高。

由此可见,视觉上的无偏全局光照是游戏体验的重要组成部分,但基于光栅化的程序在某些特定情况下也能提供类似的体验。而且,光照并非游戏画面与电影画面的唯一差距。电影和游戏在可用资源上存在巨大差距,包括每帧画面的计算时间(游戏为1/60秒,电影则可能需要数小时)、计算资源(游戏通常使用普通CPU + GPU,电影则可能使用渲染农场)、美术素材资源(游戏可能使用几十万个三角形,电影则可能使用细分到比像素还多的三角形)以及物理模拟精度等。此外,电影和游戏在体验本质上也存在差异,电影是线性的,导演和特效师只需确保所有画面在特定角度和时间达到完美;而游戏是交互式的。因此,光线追踪并非解决游戏画面问题的最终方案。实时程序需要将极其珍贵的时间和软硬件资源合理分配到不同的因素中。

当然,我并非保守派。光线追踪作为一种最基本的场景采样操作,具有通用性和直观性。如果性能能够跟上,必然会推动许多渲染技术的发展。然而,要高效实现光线追踪,难度非常大。下面我将总结并补充一些实现的难点。

难点1:计算量大

以一个4K分辨率的游戏为例,若要实现全局光照算法(如路径追踪),假设每个像素需要1000个样本噪点才收敛(这已经是非常保守的估计),每个样本的路径长度为5次反射(也是非常短的路径),那么每秒需要射出约2500G条光线。目前最快的渲染器在速度上也至少慢了一万倍。讽刺的是,对于电影级画质而言,求交过程在整个渲染过程中所占的比例与着色过程相比非常小。

虽然我对离线渲染的前沿研究有一定了解并实现过不少相关算法,也有许多提高采样效率的方法,但在实时应用中,减少样本数量的方法很难发挥作用,毕竟1/60秒的时间要求实在过于苛刻。不过,我也不想过于悲观。上述一万倍的差距只是实现无偏路径追踪的需求,实际上,即使是离线渲染也有许多技巧可以减少噪点、采用有偏方法来加快收敛速度。因此,如果将光线追踪应用于游戏,肯定可以采用一些有偏方法来减少计算量。

难点2:现代GPU对基于光栅的管线性能优化已接近极致

现代GPU已经将基于光栅的管线性能优化到了近乎极致。一方面,光栅化算法相比光线追踪更容易集成到硬件中,三角形可以在不同管线阶段进行流式处理;另一方面,光栅化技术已经大规模流行了20年,硬件厂商在这方面积累了大量的时间和经验,对其进行了充分的优化。每次深入了解GPU架构时,我都会惊叹于底层硬件所采用的各种优化手段。与此同时,基于光栅的渲染算法已经非常成熟。因此,若要发展光线追踪技术,相当于要从头开始,虽然肯定会有新的发展空间,但也需要投入大量的人力和时间。

难点3:现代基于光栅的图形管线已深度嵌入硬件和软件体系

现代基于光栅的图形管线已经深深烙印在GPU中,其接口也在API中暴露,大量现成的算法已经在游戏引擎和开发者的实践中得到应用。因此,引入光线追踪技术意味着要对图形管线进行改变。这会带来一系列问题,例如:是在现有的管线中发射光线,还是像计算着色器那样一次运行多条光线并批量返回结果?场景的加速结构是在API层面提供支持,还是交给开发者自行实现?在性能还无法满足一致全局算法的情况下,有哪些其他效果或算法可以尝试?当性能问题解决后,市面上的游戏要多久才能逐渐普及光线追踪技术?因此,我认为即使性能能够跟上,光线追踪技术的普及也将是一个缓慢的过程,需要整个行业共同努力。

最后,我不同意“光线追踪没有需求”这一观点。需求是可以被创造的。在技术发展的浪潮中,要么主动进行变革,要么就会被时代淘汰。

作者信息

洞悉

洞悉

共发布了 3994 篇文章