基于体素的全局光照技术

基于预计算的实时渲染方法,这些方法的核心是使用低阶的球谐(或小波)函数来表述某个低频的方向分布函数,例如环境贴图和大面积光源,由于这些方向分布函数可以使用少量的球谐函数系数来近似,这使得实时的间接光照计算被大大加速。然而这些方法的限制也非常明显,他们只能处理场景的静态部分,并且它们只能处理方向分布函数的低频部分。

下面我们介绍两种能够处理动态场景的实时渲染方法,即本章基于体素的全局光照算法和下一章基于距离场的全局光照算法。

全局光照的计算量非常大,这主要有两个原因:首先,它需要计算3D场景当中任意两个点之间的可见性,这种可见性判断对于基于光栅化的实时渲染流程更加复杂,光栅化擅长于每次处理一个视图,它通常并不能直接计算出任意两点之间的可见性,因此这就是为什么光栅化通常只计算直接光照,而更复杂的间接光照(即全局光照)留给其他一些近似方法(比如预计算的方法);其次,表面上每个点的光照计算涉及对表面法线方向上半空间范围内所有方向的积分计算,这个积分计算已经被证明是非常复杂,以至于目前还不能用于实时计算。

在本书前面介绍的大部分光照技术中,我们都使用三角形等曲面作为基元(primitives)来表述物体的表面,这种表述的细节层次(level of details)被存储在纹理当中,在进行着色的时候,我们需要首先找到光线与之相交的物体,然后选择该物体表面对应细节层次的多级纹理进行着色计算。[Crassian et al. 2009]说明,使用体积数据作为几何基元来表述物体表面,这种数据结构能够更高效地计算着色需要的细节层次。随后[Crassian et al. 2011]提出了体积圆锥体追踪(voxel cone tracing)的概念,在这种方法中,场景中的网格数据被近似为一个阶层式的体素八叉树结构,这个八叉树结构可以同时用于加速可见性和光照的计算,通过对该体积结构执行类似多级纹理的预过滤,围绕多个方向的光照积分计算被大大加速。

基于体素的全局光照技术是一种非常优雅的光照技术,自从被提出之后,它已经被大量的游戏引擎采用,例如它最先被集成进了虚幻引擎,此外,该技术也已经被集成进了CryEngine3中。

11.1 圆锥体内的光线追踪
在开始正式介绍基于体素的全局光照技术之前,我们需要了解一个该技术基于的一个核心概念,即圆锥体追踪(cone tracing)。
实际上,圆锥体追踪早至1984年已经被提出,如今它被广泛用于一些基于体积基元结构的场景表述中,例如本章介绍的基于体素的全局光照技术和下一章介绍的基于距离场的全局光照技术。由于圆锥体追踪是这两种全局光照技术的核心,本节就先来了解圆锥体追踪的该概念。

11.1.1 光线追踪的问题
圆锥体追踪是由光线追踪演变而来的,在光线追踪中,一条光线从摄像机发出,穿过虚拟屏幕上某个像素的中心进入到场景当中,如图所示,一旦该光线离开这个像素,它与该像素的任何联系都因此而消失,因此光线仅仅被定义为由一个起点和一个方向组成的一条直线。这种简单的定义使得光线与任意物体的相交计算变得非常直观,然而它也有缺点。

上述关于光线的定义的主要问题在于,每个像素对应相关的所有光线没有保留足够的信息去执行反走样(anti-aliasing),每条光线仅仅允许我们在一个像素的面积范围内采样得到一个位置,但是它不知道关于这个采样点周围相邻的任意位置的信息,例如这些位置是否可见,在多大面积内采样是足够等。

在标准的光线追踪中,其唯一能够实现反走样的方法是使用更高的分辨率进行采样,例如[Whitted, 1979a]提出了适应性采样。但是这种超采样技术存在一些问题,首先是那些方差较大的像素对应的光线数量会急剧地增长;其次,一些较小的细节可能被这些样本所忽略。

一种能够应对上述采样问题的方法是修改上述关于“光线”的定义为一个“圆锥体”。如图11.1(b)所示,此时一个“像素”表述的是屏幕上的一个“面积”而不是一个“点”,这种扩展的“光线”(即圆锥)与物体的相交计算不仅能够决定该光线与某物体的相交测试是否发生,并且还能决定该“光线”的多少部分与该物体相交。这种部分覆盖信息足够针对面积执行简单的反走样,同时,一个像素内的任意细节都不会被忽略。

发布了610 篇原创文章 · 获赞 96 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/wodownload2/article/details/104185851