EDN China > 技术文章 > 微处理器与DSP > CPU/GPU > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

级联阴影贴图不够了:在游戏引擎中应用快速的光线跟踪软阴影

2015年08月06日 ?? 收藏0
大约1年前,笔者在Gamasutra上发表了《游戏领域的光线跟踪实用技巧》一文,阐释了开发人员如何在PowerVR GR6500(即我们的光线可跟踪GPU)上应用一系列的混合渲染技术来实现一些令人印象深刻的效果。尽管光线跟踪的目标应用程序极为不同,但本文主要关注点在于阴影。光线跟踪不仅仅可以创造更多精确的且可摆脱阴影贴图伪影的阴影,其跟踪阴影的效率还成倍地提高了。它们只需GPU一半的周期或更多的是只需一半的内存传输便可生成更具可比性或质量更好的图像。

接下来,本文将带你走进一个高效实现软阴影技术的全过程。

传统栅格图像中的级联阴影贴图

首先,让我们回顾一下级联阴影贴图——即当下使用的为栅格图形生成阴影的最先进的技术。级联阴影贴图旨在基于视点的距离将视景体分为许多区域,并在每个区域呈现一个阴影。这为阴影贴图提供了可变的分辨率:距离相机较近的物体则可得到高分辨率,而距离较远的物体每单位面积分辨率则更低。

下述图中,我们可以看到场景中一些物体的示例。阴影贴图将逐一呈现,且每个贴图覆盖的场景将逐渐变大。由于所有的阴影贴图都具有相同的分辨率,因此阴影贴图像素的密度将随着我们逐渐远离视点而变得越来越低。

最后,在最终场景中使用相机的视角再度呈现物体时,我们将基于每个物体与视点的距离来筛选恰当的阴影贴图,并在阴影贴图之间进行插补,以确定最终的像素是亮或暗。

图1

这样的复杂性只为一个目的:减少由于阴影贴图过粗导致分辨率低这类情况的发生。这是由于物体离视点太远,在场景中占有的空间小,因此所需的阴影细节少。尽管GPU周期和内存传输的成本很高,但这样处理却非常好。

光线跟踪阴影介绍

从根本上说,光线跟踪阴影是在屏幕空间上运作。因此,没必要将阴影贴图的分辨率与屏幕分辨率进行匹配,分辨率问题由此也不存在。

基本的光线跟踪阴影算法如下:对于可见表面的每一个点,我们将直接朝光源的方向发出射线。如果光线到达了光源,其表面便是明亮的,我们使用的便是传统的常规照明程序。如果光线在到达光源之前遇到了其它障碍物,那么,由于表面处在阴影中,光线将被忽略。这项技术生成的是硬阴影,正如我们在万里无云的晴天所见的影子一样。

然而,现实世界中的很多阴影都在更亮和更暗的区域之间渐进过渡——这种软边缘被称为半影。半影是由多个光物理相关的因素引起。尽管很多游戏将光源模拟为无量纲点源,而实际上,每个光源都有一个表面。表面区域可使阴影柔化。在半影区域内,部分光被遮挡物阻塞,但剩下的光则有一条清晰的线路。这就是为何看到的区域并不是完全明亮也不是完全处在阴影中。

图2

下图展示了如何基于以下三个变量来计算半影的大小:光源的大小(R)、光源的距离(L)、遮挡物和阴影投射表面之间的距离(O)。将遮挡物逐渐靠近表面时,半影也在缩小。

图3

基于这三种变量,我们可以得出一个简单的等式来计算半影的尺寸。

图12

使用这个简单的关系,我们可以制定一个算法。在这个算法中,每像素仅使用一条光线来呈现精确的软阴影。可以从上述的硬阴影算法入手,当射线与物体相交时,在屏幕缓冲区记录下表面到物体的距离。

图4

该算法可以扩展到半透明的表面。例如:穿过一个表面时,可以记录是否该表明是透明的。如果表面是透明的,可以选择继续让光线穿过表面(注意它在独立密度缓冲区的alpha值)。

图5

下一页:光线跟踪阴影优势

【分页导航】

本文来自《电子技术设计》版权所有,谢绝转载。


上一页12下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈