APP下载

基于层次遮挡图的软阴影渲染

2016-09-23许哲

现代计算机 2016年4期
关键词:插值内核光源

许哲

(四川大学计算机学院,成都 610065)

基于层次遮挡图的软阴影渲染

许哲

(四川大学计算机学院,成都610065)

离散化;多层次;阴影因子

0 引言

随着现代计算机图形图像技术的发展,在虚拟现实和工业仿真领域,阴影已经被不同程度的集成到各种各样的渲染系统中,并在各种应用中扮演着十分重要的角色。阴影图[1]和阴影体[2]算法是目前应用中最为广泛的两种实时软阴影的渲染技术。阴影体算法太依赖于场景的复杂度,很难保证算法的高效性;大多数基于阴影贴图的软阴影算法都只存储了场景表面的一层深度信息,很容易产生漏光现象。对此,本文在阴影贴图算法的基础上,通过存储多层场景信息,并且结合后投影[3]和三线性插值算法,生成一种高效且逼真的软阴影。

1 算法实现

与传统阴影映射的方法类似,本文提出的算法由两个绘制遍组成:第一个绘制遍将视点放在光源的位置渲染场景,用于生成深度图和遮挡图;第二个绘制遍是在常规视点下,通过处理之前生成的深度图和遮挡图中的信息进行场景渲染。与传统方法不同的是,本文中的深度图和遮挡图都是多层次结构,即二维纹理数组。这种结构的渲染将场景离散化,深度图中存储深度信息,遮挡图中存储离散化点的阴影因子。

1.1计算遮挡区域

将视点置于光源处渲染场景时,需要对场景进行离散化处理。多层次深度图和遮挡图就是离散化后的存储结构,两者的结构相同,但是存储的内容不同:深度图中存储每个点的深度信息,遮挡图中存储遮挡比例,也就是在此点处光源被遮挡的比例。

在图1(a)中,O为距离光源最近的遮挡点,假设它与光源平行,且它所能遮挡的范围称为阴影区域。当把阴影区域反投回深度图时,会在深度图(近平面)上产生一段区域,这个区域称为内核。在一个内核中存在很多采样点,由于深度图是多层次结构,所以在每个采样点的位置对应多个被遮挡点。在图1(b)中,s2是一个采样点,通过s2获得的内核中包含三个采样点,分别为s1,s2,s3。在s1中存储了中存储了中存储了这些点都在s2的内核遮挡区域内,所以这些点的遮挡因子都要通过s2计算。

内核的大小可以通过计算得到,在图1(a)中,O是距离光源最近的遮挡点,且平行于光源。它们之间的产生的中间变量z'可以由公式(1)求得。

其中,z是O到光源的距离,w和n分别是近平面的宽度和其到光源的距离;r是深度图的分辨率大小,l是光源的宽度。内核的大小wk可以由公式(2)计算得到。

图1 遮挡示意图

其中,d是接收面到光源的距离。对应于深度图中每个纹理坐标(u,v)上的采样点,都需要计算各自的内核大小。

1.2算机遮挡与因需

在图1(b)中可以看到,每个采样点都对应一个内核,在内核中有很多潜在的被遮挡点,这些被遮挡点都可能被采样点中的点所遮挡。所以,针对内核中的每个被遮挡点,都需要计算其被遮挡的比例,也就是其遮挡因子。本文采用后投影的方法将被遮挡点通过遮挡点将其投影到光源,如图2(a)所示,将投影到光源,光源与投影区域会有一部分重叠,重叠部分的光源相对于来说是不可见的,所以的遮挡因子可以通过重叠区域计算得到。

运用此方法计算之后可以发现,同一个点可能位于多个采样点的遮挡内核中,所以它会被多个遮挡点遮挡,如果将每个遮挡点产生的重叠面积相加,会导致一些面积被重复加了多次,从而产生较暗的阴影,所以,本文算法只将距离被遮挡点最近的遮挡点投影回光源计算重叠面积即可。

1.3三线信号的插值

本文算法中提出的三线性插值过滤算法依赖于场景中点的深度。当在正常视点下渲染场景时,场景中的每个点需要被转换到光源坐标系下得到其在深度图中的纹理坐标,以及该纹理坐标上下左右四个方向的坐标。图2(c)展示的是在2维空间下的示意图,s1和s2是通过点p得到的邻近采样点,p的深度用于确定采样点的包围层。比如,在s1中存储的第一层和第二层包围了点p,因为当包围p点的各个点确定了以后就可以将这些点的遮挡因子进行插值,在图2(c)中,注释了每个点的深度值z和其遮挡因子ρ。对于采样点长度和

图2 算法示意图

但是,求到的包围层并不总正确。考虑图2(d)中的p2点,在采样点s2中存储的第一层的点的深度由于比p2远,故只能作为p2下边缘的包围层,但是这样的话就得不到上包围层,无法进行插值。针对这种情况,本文设置一层虚拟包围层,这个包围层被置于光源位置,并且假设此层被完全照亮,即其遮挡因子为0。

另外,考虑图2(d)中的p3点,在采样点 s3中存储的第二层的点的深度由于比p3近,故只能作为p3上边缘的包围层,但是这样的话就得不到下包围层,无法进行插值。针对这种情况,本文也设置一层虚拟包围层,这个包围层被置于渲染的远平面,并且假设此层被完全遮蔽,即其遮挡因子为1。

再考虑图2(d)中的p4点,从图中可以看出,p4处于全影中,即被完全遮蔽,但是若使用插值的方法,p4则被计算为部分遮蔽,因为s2和s3中存储的第一层都被完全照亮,当它们参与插值计算时,p4点的遮挡因子一定处于0到1之间。针对这种情况,本文算法首先检查4个上边界是不是在同一层上,如果在同一层,就将上边界的阴影因子设置为1。这种方法适用于p4点,因为它的上边界都位于第一层,所以进行插值后,p4点的阴影因子为1。

插值的方式适用于大多数情况,但是仍然有些情况是插值解决不了的。比如图2(d)中的p5点,显然p5是被完全照亮的,但是由于它周围的点都位于第一层,它们的阴影因子被设置为了1,再通过三线性插值,会导致p5的阴影因子不为0。这种错误的产生是因为p5的深度大于上边界的深度,例如p5位于上边界的凹面。当深度图的分辨率较小时,会产生这种凹面,但是只要把深度图的分辨率设置的足够大,使其采样足够精确,这个错误就可以避免。因此,在实验中,深度图的分辨率被设置为1024×1024。

2 实验结果

实验环境为处理器:Intel Core i5-2320 CPU@3.00 GHz 3.30 GHz;内存:4.0GB;显卡:AMD Radeon HD 6700 Series;操作系统:Windows 7。

本文提出的基于多层次遮挡图的软阴影算法可以生成高质量高速率的软阴影。在以下实验结果中,光源大小都设置为2×2,屏幕分辨率和阴影图的大小都为1024×1024,层次设置为8层。

图3 ,图4 分别显示了PCSS(a)、后投影(b)、本文算法(c)三种方法渲染树模型和桌椅模型的软阴影效果,由对比可知PCSS生成阴影虽然有模糊的效果,但是由于受采样点数目的影响,其阴影效果并不真实;后投影运用面积比例计算遮挡因子,其重叠现象较为明显,可以清楚的看到后投影生成的软阴影相比较与PCSS[4]和本文算法,效果相对较暗;然而本文算法不仅解决了重叠现象,且软阴影效果更加逼真。

图3 软阴影绘制效果对比

3 结语

本文采用多层结构存储深度图和遮挡图,并结合后投影渲染软阴影方法,渲染出了效果较好的软阴影效果。但本文也存在一些不足之处,由于使用插值的方式计算每个点的阴影因子,使得渲染效果不是特别精确,在阴影的精度上还需要继续研究和改善。

[1]Lance Williams.Casting Curved Shadows on Curved Surfaces.In ACM Sig-graph Computer Graphics.ACM,1978,12:270-274.

[2]Vincent Forest,Loic Barthe,and Mathias Paulin.Accurate Shadows by Depth Complexity Sampling.In Computer Graphics Forum, Proc.Eurographics,2008:663-674.

[3]Gael Guennebaud,Loc Barthe,and Mathias Paulin.Real-Time Soft Shadow Mapping by Backprojection.In Proceedings of the 17th Eurographics Conference on Rendering Techniques.Eurographics Association,2006:227-234.

[4]Randima Fernando.Percentage-Closer Soft Shadows.In Acm Siggraph 2005 Sketches.ACM,2005:35.

Discretize;Multi-Layered;Shadow Factor

Layered Occlusion Map for Soft Shadow Generation

XU Zhe
(College of Computer Science,Sichuan University,Chengdu 610065)

许哲(1990-),女,四川成都人,本科,研究方向为计算机图形学、虚拟现实

2015-12-01

2016-01-10

对于场景中的三维模型,首先在光源中心位置对场景进行离散化处理,生成多层次深度图;然后计算深度图中各点的阴影因子,将其存在具有相同结构的遮挡图中;最后在正常视点下渲染场景,对遮挡图中的阴影因子进行三线性插值,得到平滑且逼真的软阴影。

For three-dimensional model,first discretizes the scene from the center of the light and generates a multi-layered depth map.Then computes the shadow factor of these points in the depth map and stores them into an occlusion map which has the same structure with depth map.Finally,renders the scene from camera.Processes the shadow factor from occlusion map by three linear interpolation and smooth soft shadows can be determined.

猜你喜欢

插值内核光源
多内核操作系统综述①
滑动式Lagrange与Chebyshev插值方法对BDS精密星历内插及其精度分析
强化『高新』内核 打造农业『硅谷』
光源改变光环境
享受LED光源的卓越色彩 Acer(宏碁)PD1530i
活化非遗文化 承启设计内核
微软发布新Edge浏览器预览版下载换装Chrome内核
鲜艳迷人的HLD光源4K HDR新贵 BenQ(明基)X12000H
基于pade逼近的重心有理混合插值新方法
LED照明光源的温升与散热分析