实时光线的混合渲染:光线追踪VS光栅化

上一篇文章中,我们阐述了PowerVR光线追踪API的基本知识,包括场景生成和光线处理。在本文中,我们将展示如何有效地使用这些光线来呈现不同的效果,并将其结果与光栅化进行对比。

以下视频即光线工厂——我们最新的混合渲染演示:

混合光线追踪可以更好地进行渲染

像素阴影最基本的要素便是识别环境:它所处的位置、光线来自哪里,光线是否会受到其他曲面的阻碍或折返回来等等。光栅化则不会确定以上信息,因为每个三角形都是独立存在的。在某种程度上,有一些很显然的方法来应对这个问题,但这些方法过于复杂或效率低下,往往导致图像质量不佳。而另一方面,光线跟踪非常擅长获悉周边的环境,但由于计算更复杂,所以速度会很慢。混合渲染器则结合了光栅化的速度和光线跟踪的环境感知能力。在使用光线追踪计算曲面的光线和反射时,它已将G缓冲区光栅化,呈现出所有可视的曲面。

阴影

在光栅化中处理阴影非常不直观,需要相当多的运算:需要从每条光线的视角渲染场景,再存储在纹理中,随后在光照阶段再次投射。更糟糕的是,这样做未必会产生优质的图像质量:那些阴影很容易混叠(因为光线所视的像素与摄像头所视的像素并不对应),或堵塞(因为暗影贴图的纹素存储的是单一的深度值,但却可以覆盖大部分区域。此外,大多数光栅化需要支持专门的阴影贴图“类型“,如立方体贴图阴影(用于无方向性的光线),或级联阴影贴图(用于大型户外场景),而这大大增加了渲染器的复杂性。

在光线追踪器中,单一的代码路径可以处理所有的阴影场景。更重要的是,投影过程简单直观,与光线从曲面投向光源及检查光线是否受阻一样。PowerVR光线跟踪架构呈现了快速的“试探”光线,其用于检测光线投射方向的几何图形,这也使得它们特别适合进行有效的阴影渲染。


栅格化阴影(左)呈现的是块状效应,而光线追踪阴影(右)则像素精准

像素良好的阴影十分清晰,但却没有吸引力,所以下一步便是绘制一个漂亮的软半影。同样,这个过程非常直观且具有逻辑性:半影是由曲面的光源产生,而非无限小的点。我们并非将单一的光线投射至某个点,而是将一些光线投射至光曲面上的某个随机点,再取平均结果。曲面越大,半影则越大。那么,为了获得更优质的图像,我们便需要更多的光线。


进行了恰当的半影处理的光线跟踪阴影(右)

显然,这个方法非常简洁,也非常容易实现。使用更先进的方法当然可以获得更好的效果,这一点我们在之前的文章(在游戏引擎中应用快速的光线追踪软阴影)中有所阐述。

正如半影一样,要将半透明阴影添加至光栅化中并非易事,特别是当它涉及到多层半透明材料。在光线追踪中,再次展示了一个简单的过程:当阴影光线接触曲面时,检查这个曲面的不透明程度,并相应地降低光线密度。


标准的光线追踪阴影(上)VS高级的光线追踪阴影将雨伞当作一个半透明材料(下)

环境光遮蔽

环境光遮蔽(AO)可以被看作是一个无限的穹顶光的阴影,因此可以以非常相似的方式实现软阴影。将光线穿过半球曲面,若没有几何图形,一些光线便会积聚。由于整个半球的光线将被集成,因此在选择抽样方法时则务必注意。在这个特定的例子中,我们在余弦叶取样器中获取一个2D霍尔顿序列,它将生成赏心悦目的可视效果。


光栅化屏幕空间环境光遮蔽(上)和光线追踪环境光遮蔽(下)

环境光遮蔽并非仅通过光栅化便可以轻易完成。当前的方法通常需要其近似于屏幕空间,并忽视第三个维度,或者用体积呈现一个场景,并在着色器中模拟光线追踪。


光栅化屏幕空间环境光遮蔽(左),和光线追踪环境光遮蔽(右)

全局光照

全局光照(GI)本质上与环境光遮蔽相对,但它通过一个简单AO渲染器扩展便可以实现。当光线没有接触任何事物时,GI并非积累光线,而是积累其接触到的曲面上的光线。这意味着,快速“试探”光线不能再使用,必须用全局光线替换,以此找出最近的曲面交线,然后再评估这个点上的光线。

在这个特定的例子中,我们将同时使用单反射GI和AO。尽管在物理上而言,使用GI和AO有些不确定性,但就审美角度而言,其生成图像的质量令人赏心悦目,几乎接近预渲染时的质量。


简单的光线追踪全局光照(下)增加了橙色的曲面反射光

使系统支持发光曲面并非难事,且任何几何图形都可以转化为区域光,并被完美地集成至场景中。而光栅化仍然没有解决区域光的问题:它们通常局限于简单的形状,且不能投射阴影,故而在现实场景中难以使用。


曲面当作区域光投射软阴影

优化

相比完全使用光线追踪渲染器,使用混合方法可以节省大量的计算工作。大型的场景若要生成复杂的效果仍是造价昂贵,但我们必须尽一切努力来实现最佳的性能。

我们的光线工厂演示以每秒30帧,1080p在PowerVR GR6500 GPU上运行,每秒可以投射1亿条光线。不同的光线追踪效果所需的成本如下所示:

意想不到的是,环境光遮蔽比单一的阴影成本更高,因为它需要大量的光线。同样,当AO取样器扩展到支持全局光照,同样需要额外的计算来识别最近的曲面及评估光线。

时间超级采样

在大多数情况下,两个连续的帧极其相似:有些曲面可能有稍许移动,但仍然是按先前渲染的相同的曲面。从一帧转入下一帧时,成本较高的阴影操作则可以被再次使用,只要像素及其先前的位置之间可以进行映射。这种方法在实时图像中非常通用,已经被用于改善抗锯齿、SSAO、屏幕反光等。通过将光线分布至几帧中,它可以减少每帧所需光线的数量。

时间超级采样只需要访问前一帧和每像素运动向量。由于基于拼贴的PowerVR GPU架构,通过使用像素本地存储扩展,渲染这些额外的运动向量便非常有效,且无需消耗额外的带宽。


环境光遮蔽使用每像素单一光线渲染(左),每像素单一光线使用时间超级采样(右)

尽管大幅提高了光线质量(或减少了光线数量,取决于你的视角),它不会造成时间假象。例如,在移动对象后可以看到阴影痕迹。

更好的场景管理

场景层次架构生成(SHG)是大量的光线追踪发生的地方:顶点着色器在场景几何图形上运行,生成的三角形存储在加速结构中,从而使得实时光线追踪成为可能。随着场景的发展,这个任务可能需要大量的帧渲染时间:


简单的SHG生成使主要的渲染停止

所幸,SHG可以与主渲染平行运行。这意味着,当前的一帧完成渲染时,下一帧的几何图形已经准备就绪,这就大大降低了帧处理时间。然而,这需要场景具有多个缓冲,这样,修改某个缓冲时,另一个缓冲可以进行渲染。想要开发Vulkan或优化OpenGL渲染器则必须采用以上类似的方法。


双缓冲场景处理和平行场景层次架构生成,帧速率提升

在光线工厂演示中,平行运行的场景层次架构生成大约减少8ms帧时间,而我们的性能调优应用程序显示,其所生成的三角形数量可以轻松翻倍,且不影响性能。

我们还可以进一步改善场景层次结构生成的性能:静态几何图形可以被预先计算,并被预先缓存,随后在运行时间与动态元素合并。这一点通常非常有用,因为环境大多是静态的。

总结

通过使用PowerVR光线追踪器可以大幅改善实时3D图像的质量:光线效果可以更精准(如阴影、环境光遮蔽)。但更重要的是,光线追踪可以突破当前渲染器的限制,允许生成如实时全局光照这类的新效果。最后,光线追踪不仅仅允许更好的光照效果,也可以处理传统引擎中的复杂的问题,从而使渲染器的工作更加简易。

原文链接: https://imgtec.com/blog/hybrid-rendering-for-real-time-lighting/

声明:
本文为原创文章,转载需注明作者、出处及原文链接,否则,本网站将保留追究其法律责任的权利

--电子创新网--
粤ICP备12070055号