Ambient Occlusion(AO)

来源:互联网 发布:逃离北上广的数据 编辑:程序博客网 时间:2024/06/14 01:24

AO(Ambient Occlusion)是图形学领域近来较为流行的用来获取较为真实的全局光照效果的一种方法。这种方法针对要渲染的全局场景,利用每个渲染像素点周围的几何体分布的遮挡信息来确定当前点的AO效果。基于AO的渲染方法可以有效地增强人类视觉系统对场景全局的认知能力[Luft06]。它提供了很好的一种质量和速度间的均衡。

1. AO的理论基础

    传统的实现方法,通常使用光线跟踪的方法从每个可视点发出若干条光线,并与全局场景进行相交测试来得到相应点处的AO值。这些发出的光线通常呈现出半球体的分布。这里的半球体主要是所在点的法向量外部的半球体(由于对于当前点来说,法向量反方向的半球体中的物体对当前点的全局光照效果没有什么影响,因而不予考虑,这点类似于传统的辐射度方法),如图1所示。

SSAO-1 

图 1

关于在点P处的AO值可以用下述积分方程式来进行描述:

E1

其中的n表示几何体元在P点处所具有的法向量,V为相应的可见函数,Ω表示相应的半球体空间,ω表示半球体Ω中从P点出发的方向向量。AO值的计算通过对围绕P点的半球体上的局部AO值进行积分而得到,由此可知可见函数V为二值函数,即其值为0或1,分别表示在p点处不可以或可以看到环境中的其它几何体元部分。上式中的积分表达意味着在理想状态下需要发射出无限条光线来计算得到当前点的AO着色值,而这在实践中通常需要离散化以便其具有实现性(蒙特卡罗积分),

E2

使用上述的方法来进行场景中的AO值计算往往可以得到很不错的渲染效果,但同时其也具有以下几条主要的缺点:

a. 代价太大,需要发出真实的光线并进行与场景的相交测试计算。

b. 原始的积分运算太慢,即便是使用离散化后的方式,若是采样过多的点同样具有较低的效率。

c. 对原始场景的依赖性较大,同时可能需要较多的预处理操作。

    针对上述这些缺点,于是有学者提出了基于屏幕空间的AO计算(Screen Space Ambient Occlusion),其中最为典型的应用就是CryTek引擎中展示的惊人效果。基于屏幕空间的AO计算是利用渲染硬件的特性,将原始的三维空间问题转化为2D空间问题,进而实现简化的目的。同时,这种方法也是当前图形学领域的研究中常用的一种方法,因为它可以有效地降低原始问题的复杂度,同时又可以很好地利用当前渲染硬件的架构特性,进而提高效率。这种处理思路的最典型方法即是Shadow Map,以及最近出现的及于SS的体素化、流体仿真、Photon Mapping等。在这些基于屏幕空间的处理中最常使用的一种辅助资源即是由显示光栅化过程中得到的深度信息图(Depth Buffer),在基于SS的AO中同样使用了深度图来进行相应着色点的AO计算。它将原始三维场景中的空间信息部分地转化到二维中,进而从二维的纹理中近似地还原出初始三维场景的信息。

SSAO方法的优点主要有以下几点:

a. 速度较快,由于不需要生成虚拟的光线,并进行与场景的求交测试等操作,因而效率较高。

b. 基于图像空间,因而算法的处理效率与原始场景的规模无关,只与渲染生成图像的分辨率有关。

但同时,其也有相应的缺点,最主要的即是由于深度图只是场景深度信息的一种近似表述,故而会有信息丢失,比如隐藏的物体即无法表述等,这样就会导致在某些地方无法进行正确的AO计算。此处的示例可见下图2所示。

SSAO-20SSAO-21SSAO-22

123

图 2

基于SSAO的渲染流程可以归结为如下几个主要步骤:

SSAO-pass

图 3

    其中的SSAO操作部分主要是用着色器来进行实现,这样不仅可以高效地利用硬件GPU的渲染性能,同时也简化了算法的实现难度。SSAO着色算法主要进行以下几点主要操作:

a. 在每个渲染流程中预处理得到当前视点下的深度图与法向图,并作为可以访问的纹理进行存储。

b. 像素着色器中:在当前的Pixel周围进行采样得到采样点,并还原这些采样点在3D空间中的坐标位置。

c. 读取采样点映射到2D光栅投影空间中的纹理坐标,并访问相应位置上的深度值与法向值。

d. 比较各个采样点所对应的深度值与场景投影的深度图相应点上的深度值间的关系,以便确定当前采样点所对应的可见函数V(ω.p)。

e. 对所有采样点所对应的V进行累计即可得到当前像素点所对应的AO值。

dragon_on_tablehebe

图 4. 利用Ray Tracing实现的AO效果,其中的采样率均为32. 

0 0