[图形学] Adaptive Shadow Map

Posted ZJU_fish1996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[图形学] Adaptive Shadow Map相关的知识,希望对你有一定的参考价值。

reference: https://www.cs.cornell.edu/~kb/publications/ASM.pdf

概述

        阴影贴图提供了一种快速方便的方法来识别场景中的阴影,但是会引入锯齿。本文介绍了自适应阴影贴图(ASM)作为此问题的解决方案。ASM通过解决眼睛视图和光源视图之间的像素大小不匹配来消除锯齿。通过将光源贴图(即光源的阴影图)存储与常规平面结构相反的分层网格结构,可以实现这一目标。在像素从相机视图转换为灯光视图时,可以改进ASM以在需要时创建更高分辨率的阴影图。这是通过评估阴影图像素对整体图像质量的贡献来完成的。

       改进过程是视图驱动的、渐进式的,并且仅限于用户指定的内存占用来给你。我们可以证实ASM在保持交互式速率的同时能够明显提高阴影质量。

介绍

       阴影提供了有关对象之间空间关系的重要信息。一种常用的阴影生成技术是阴影贴图。阴影图的做法是从光源视图生成深度图像,然后渲染时将相机视图中的点转换到灯光视图,最后将变换后的点的深度与阴影图中的深度进行比较,以确定是否可以从光源处看到变换后的点。如果变形点比阴影贴图中的对应点更靠近灯光,则认为该点处在光照中。否则,认为该点在阴影中。之后,此信息将用于对相机视图的图像进行着色。

       阴影贴图的主要缺点之一是锯齿,如图1所示。

       

        在图中,我们在一个简单场景中可以看到两个不同位置的视图:视点A和视点B。每张图片中的网格都显示了阴影的投影像素区域和当前视点所见的场景。由于视点A中光源像素的投影面积大致等于阴影图中的像素面积,因此这种情况下锯齿最轻微。相反,视点B非常接近场景几何体,因此该视图中阴影贴图像素的投影区域较大。这意味着使用来自阴影贴图的相对少量信息覆盖了视点B的大部分区域。结果是出现了非常明显的失真,在这里显示为锯齿状的边缘。

       本文中,我们介绍了自适应阴影贴图(ASM),这是对常规阴影贴图的扩展,它解决了阴影贴图锯齿的主要原因:阴影贴图分辨率不足。我们使用分层网格结构,通过在需要时生成更高分辨率的阴影贴图,在视图驱动和渐进式的基础上提高图像质量。通过与最近最少使用(LRU)和基于优先级的内存管理方案相结合,限制该算法的内存使用率。

       灯光的位置通常是人为指定的,以确保足够的阴影质量。因为传统的阴影贴图在灯光较远或者视野较广的时候效果比较差。ASM通过设置实际的位置和视野是用户避免此类约束。ASM的视图驱动特性还可以在交互期间生成高质量的阴影,而无需仔细调整常规的阴影图参数,或者使用更大的阴影图。

之前的工作

       阴影生成算法的完整概述不在本文的讨论范围之内,引用[6]和[11]一起提供了较为流行的方法的全面概述。在[9]中介绍的常规阴影映射是用于生成阴影的常用技术。由于它是一种图像空间技术,因此在通用性,速度和易于实现方面均具有优势。

      但是,消除阴影贴图中的锯齿一致都是难以解决的问题,百分比更近过滤(PCF)是解决混淆问题的方法,但是在锯齿严重的情况下,它只能通过模糊在掩盖锯齿。灯光缓冲区[3]通过使用带有阴影分析测试的平面阴影贴图,解决了非交互式光线跟踪器上下文中的锯齿问题。最近,陡峭深度图[5]通过使用抖动样本并对它们进行预过滤来解决锯齿问题。但是,它们不处理由于阴影贴图分辨率不足引起的锯齿。

自适应阴影贴图

      ASM基于以下事实:高质量的阴影贴图不必具有统一的高分辨率。仅需对包含阴影边界的区域进行密集采样。在那些区域中,阴影图的分辨率应至少与相机视图中相应区域一样大,以避免产生锯齿。

      ASM通过分层地细分普通阴影贴图,从而在视觉上重要的区域提供更高的分辨率。像传统的阴影贴图一样,ASM将一组变换的视点作为输入,并允许在该视点上进行阴影查询,如果特定点在光照中,则返回true,否则返回false。在软件系统中,ASM可以无缝替换传统的阴影贴图。

      ASM具有三个主要特性:

      ● 它是视图驱动的,这意味着层次的网格结构会根据用户的视点进行更新。

      ● 它仅限于用户指定的内存限制。内存得到有效管理,ASM避免了具有相同视觉质量的常规阴影贴图所需内存使用的爆炸性增长。

      ● 它是渐进式的,这意味着一旦建立特定的视点,图像质量就会持续提高,直到达到用户指定的存储限制。

      ASM被组织为树。ASM树中的每个节点都具有固定分辨率的阴影图,且阴影图被划分为固定数量的单元。这些单元中的每一个都可以包含另一个树节点。可以对树中每个单元执行两项操作。当确定与该单元相对应的阴影图区域的分辨率不够高而无法提供所需的图像质量时,可以为一个空单元分配一个新节点;包含节点的单元也可以删除该节点以及其后代。这是通过响应用户指定的内存限制来完成此操作。

创建节点

       在任何时候,都有许多需要分配新节点的单元。在交互式应用程序中,并非总是能够满族所有这些需求。因此,我们使用成本效益度量来确定要满足的单元。仅当创建新节点(并因此获得更高分辨率的阴影贴图)时,它才会带来阴影质量的明显改善,这才是有益的。

       我们通过计算跨深度不连续,且阴影贴图分辨率低于相机视图分辨率的单元内已转换的相机视图像素的数量,来量化此可感知的优势。我们使用图形硬件的mip映射功能来估算匹配相机视图分辨率的阴影贴图。第4.1节对此进行了详细说明。

       创建新节点的成本是生成新阴影图所需的时间。使用相机视图像素大小和阴影视图像素大小的比率,新阴影图和相机视图分辨率匹配所需的分辨率为:

      

       其中,N是阴影贴图单元中的像素数。

       生成新阴影贴图的成本可以近似估算为:

      

       该成本模型基于以下事实:硬件回读性能随着要回读的缓冲区的大小接近线性变化,随着回读大小变得非常小,效率变得越来越低。我们预处理执行较准测试,以评估给定硬件设置得a(每像素渲染成本)和b(恒定开销)。

       新的阴影贴图的好处是可以解决分辨率与相机像素不匹配。一旦为所有预期单元格计算了成本效益比,便会根据该比例对单元格进行排序。为了保持一致的帧频率,仅在此列表中为性价比最高的单元生成的阴影图系欸但,直到超过给定的时间限制为止。

移除节点

       由于ASM仅使用固定数量的内存,因此可能需要回收特定节点的内存。为此,我们在最后一帧中未使用的所有节点上使用LRU方案,删除最近最少使用的节点。如果没有这样的节点,意味着所有节点当前都是可见地。在这种情况下,仅当需要创建的新节点比现有节点有更大的收益时,我们才删除现有节点。

实现

       这一章节讨论更多的技术细节和优化。

Mip-mapping

       为了确定何时出现分辨率不匹配,算法必须计算像素的投影面积(即像素在世界空间中的覆盖面积)。对于交互速度的情况,在软件中执行此计算将过于昂贵,因此我们使用Mip-mapping来近似计算。

       传统上使用Mip-mapping[10]是为了避免锯齿以及和纹理映射相关的伪影。当前的图形硬件实现了透视矫正的mip映射,该映射基于要渲染的像素的投影区域,在不同分辨率的纹理之间进行插值。我们使用此功能来快速估算投影像素区域,如下所示:算法将每个mip-map级别的分辨率放置在该级别的所有纹素中,因此,最小级别在每个纹理像素中包含1,第二小的级别包含2,第三小的级别包含4,以此类推。设置纹理坐标,以使得世界空间纹理大小统一。然后,使用此mip映射的纹理绘制每个多边形。回读帧时,每个像素都包含其三线性内插值的mip级别,这是其投影区域的合理近似值。各向异性过滤用于提高近似精度。

       作为进一步的优化,mip-map级别仅在alpha通道中编码,而mip-map其余部分为白色。这使得回读可以与下面描述的几何体ID回读同时进行,从而避免了额外的渲染流程。

结合ID和深度对比

        常规阴影贴图通过使用具有偏差因子的深度比较来检查变换后的像素是否处于光照中。然而,这种方法在靠近光边缘上的表面显示出为营,并且在具有变化的几何缩放的场景中存在困难。在[4]中提出了使用逐多边形ID来确定可见性,而不是深度比较。在许多情况下,此方法更好,但会导致沿网格边界产生的伪影。因此,我们结合使用每个多边形ID和深度比较来对变换后的像素确定可见性。如果ID测试失败,则使用常规的深度比较可以让我们避免沿多边形边界的伪影。我们的结果表明,尽管偏差的问题仍然存在,但这种简单的修改比仅使用每个多边形的ID或深度更稳定。

优化

       可以使用类似于[2]中所描述的深度剔除技术来加速ASM的查询。存储最近查询的叶节点的高速缓存来进一步加速ASM的查找。如使用奔腾系列的SSE/SSE2之类的低级指令优化,可用于加速从相机视图到阴影图的像素重投影。

       我们的方案需要随着单元格的完善,频繁地进行渲染和回读。由于在细分过程中为每个网格单元重绘整个场景效率不高,因此我们对层次结构最顶层的每个单元使用视锥剔除。

       由于分析图像中所有像素的成本可能很高,因此我们的算法仅对一部分转换后的像素执行成本收益分析。此选择可能会导致收敛到准确解决方案的速度变慢。但是,在我们的实现中,我们发现只分析八分之一的像素即可提供良好的性能,并且不会显著地影响收敛速度。

结果 

       图2,3和4展示了我们对31000多边形场景进行交互式绘制地结果,其图像分辨率为512x512像素。我们的统计是在NVIDIA GeForce2 Ultrau图形卡的1 GHz Pentium |||上执行的。该场景具有三个不同的对象,可用于测试算法的不同层面。

        

      光源是具有122° FOV的点光源。它放置在房间的天花板上,远离物体。第一个对象是20000多边形的兔子模型,它描述了该算法处理小三角形和多边形ID频繁变化情况的能力。另外两个对象是机器人和带有精细网格的雕塑,它们演示了算法发现和细化不同尺度的复杂阴影细节的能力。

      测试中发现,传统的2048x2048像素阴影图(使用16MB存储空间,每个像素深度32位)平均每秒8.5帧,而我们的算法(也使用16MB内存)平均每秒4.9帧。图2和图3演示了ASM所实现的图像质量得到了明显改善。对物体进行特写,等效的常规阴影贴图大小非常大(图2中为65536x65536像素,图3中为524288x524288像素)。实际上,为交互式应用程序创建这样的阴影图是不可行的,因为这样不仅创建时间长,存储需求也很大。

      我们的结果还论证了ASM能够适应广泛的视野。由于ASM具有视图驱动的特性,因此此时阴影贴图的大小可能会相对较小而FOV则相对较大。在我们的实验中,ASM的起始分辨率为512x512像素。

      图4说明了该算法的内存管理。从左到右,我们显示了使用2048x2048像素的常规阴影贴图,使用8MB内存的ASM和使用16MB内存的ASM生成的图像。两个ASM图像之间的差异较小,但是与左侧的图像相比,两者均显示出图像质量的显著提升。为了突出显示从8MB到16MBASM的图像质量改进,我们放大了图像的每个部分。

       ASM每帧大概使用203毫秒,而传统的2048x2048像素阴影映射使用117毫秒实现相同总内存使用量(16MB)。额外的时间花费在成本效益分析(30ms),节点创建(5ms),遍历层次结构进行查询(35ms)以及场景的额外渲染和回读以收集多边形ID信息上(16ms)。

 

以上是关于[图形学] Adaptive Shadow Map的主要内容,如果未能解决你的问题,请参考以下文章

[图形学] Adaptive Shadow Map

[图形学] Adaptive Shadow Map

Dubbo源码学习之-Adaptive自适应扩展

详解box-shadow

maya中的shadow map overrides具体怎么使用?

Shadow Map 原理和改进