郑军将,王毅刚
(杭州电子科技大学图形图像研究所,浙江杭州310018)
阴影就是光源的有部分光线被遮挡而无法到达的区域[1]。阴影对提升虚拟现实中的真实感和视觉线索至关重要。通过阴影可以判定物体空间关系、遮挡物形状以及光源的位置方向等。不正确的阴影将大大削减场景真实性,所以计算机绘制的阴影必须要足够可信。近些年来,人们对阴影做了很多研究工作,提出的算法包括百分比靠近滤波、方差阴影映射、卷积阴影映射和指数阴影映射等硬阴影技术,还有各种软阴影技术。它们主要基于阴影图(Shadow Mapping,SM)、阴影体(Shadow Volumes,SV)还有全局光照(Global Illumination,GI)的原理。相对阴影体和全局光照,阴影图的算法不需要分析场景的几何信息,依赖阴影图可以计算阴影区域,适合计算机实时绘制阴影。但是阴影图的算法是基于点采样,这将导致计算边缘阴影时出现边缘锯齿状走样,物体表面自阴影等现象。百分比滤波算法(Percentage Closer Filtering,PCF)是基于阴影映射算法,通过对阴影图滤波,使边缘变平滑,可以有效减轻边缘锯齿走样,使阴影更加逼真。
阴影图算法是百分比滤波算法的基础,算法运用z-buffer深度缓冲构建阴影图,通过采样点和阴影图的深度值做比较,判断采样片元是否在阴影中,如图1所示。算法主要分成两个步骤:(1)将照相机放在光源位置上,产生深度缓存纹理,此纹理的每个象素点记录光源通过该象素点与场景中物体相交的最近深度值,即最近交点到光源的距离;(2)将照相机放在实际视点位置上,并使用第一步得到的深度纹理来进行阴影测试,通过比较给定点与此深度值的关系,即可判定该点是否位于阴影内[2]。阴影图算法是基于采样点的深度值和深度图中的相应Z值作比较,比较的结果是二值化的,导致边缘不可能平滑,如果采用深度值和深度图的均值做比较,虽然能柔化边缘,但是绘制效果将严重偏离物体的几何形状。
百分比滤波算法[3]在SM的基础上调换滤波比较的顺序。首先将采样点的Z值和深度图区域内的点做比较,再将区域比较的二值化结果百分比化,根据百分比值可以判断采样点在阴影中的程度,即半影的值。从而生成边缘平滑的硬阴影或者半影大小固定的软阴影效果。PCF的计算如下:pcf(P)=P为渲染的点,PS为其映射到阴影图中对应的点,N(*)是阴影纹理图周边的元素,ω(*)代表滤波核的权值,S(*)是二进制的阴影测试函数,比较(P点在光照空间的深度)和Zq(阴影图q点的深度)。
图1 阴影图算法的原理图
PCF算法的步骤:(1)对每个场景中的光源都要创建一副深度纹理图,并从光源位置记录场景中所有物体的的深度值。在光源空间中,X和Y坐标指示了象素在深度图中的位置,而Z值纪录了象素到光源位置的深度距离;(2)从照相机视点出发渲染场景。每个渲染单元都先被映射到光源空间,得到相应的深度图位置。运用百分比滤波算法得到采样点在深度图相应区域的百分比值,根据百分比稀释光的强度。如果有多个光源存在,那么要循环多次。
PCF算法的不足:预滤波是传统的纹理映射的应用,如mipmap,SAT等,它事先将纹理信息保存,需要的时侯可以快速提取,提高效率。但是PCF算法将采样点和深度图先做比较再滤波,每个采样点比较的结果都是未知的,导致无法进行预滤波操作,限制了PCF算法效率。PCF算法是基于深度图,而深度图有限的分辨率会导致Z-Fighting现象,所以PCF算法存在自阴影的问题。
根据百分比滤波算法的不足,本文采用分层的阴影图和梯度阴影映射对算法的效率和效果做改进。
分层的阴影图技术[4]就是最大最小深度的mipmap技术。它以标准的深度图为基础,创建最大最小的mipmap。假设有一副1 024×1 024的深度图,那么首先将创建两个512×512的纹理通道,一个通道存储相邻的4个象素的最小值,第二个通道存储这4个象素的最大值。同样的办法一直创建到2×2 mip层。对于采样点的Z值输入,从最底层的mip层开始比较。如果Z<min,则潜在深度图中的象素都无法遮挡此采样点,判定此采样点不在阴影中。相反,如果Z>max,则潜在的深度图中的象素都可以遮挡此采样点,判定此采样点在阴影中。当min<Z<max时,无法判定采样点的情况,阴影查找向下层的mip层移动。通过不停的递归操作,总能找到可以判定的mip层。最坏的情况是移动到最高层的mip层,即原来的深度图中,此时max等于min值。通过HSM,可以提升PCF算法的效率,减少采样点的比较次数。
PCF算法中阴影图的分辨率是有限的,导致平面上的多个相邻面元可能对应深度图中的同一位置,但是离散化后的面元的深度值并不相同,直接做比较就导致Z fighting现象,也就是在物体表面生成带状的自阴影。一般可以通过增加深度偏移来纠正。但是实际上,深度偏移值的选择是一个更大的问题,它是动态变化的,每个面元都不一样。原先的PCF算法中深度偏移值是一个常量加一个随机量的形式,并不能很好反映出物体表面面元间的关系。梯度阴影映射技术[5、6]是利用采样点的梯度值作为深度偏移量,正确的反映了空间几何关系。这里的梯度指的是深度图中的梯度变化,而不是屏幕空间,转化的表达式[7]为,其中表示深度图中的梯度向量,是屏幕空间到深度纹理空间的雅各比矩阵,采样点在屏幕空间中的梯度向量
在PC平台(Inter Core i5-2 300,4 GB RAM,NVIDIA GeForce GTX 550 Ti)中使用DirectX10实现了改进的PCF算法。
PCF的深度图的分辨率设置为1 024×1 024,用PCF和带分层阴影图的PCF算法实现的场景,如图2所示,得到的帧率分别为55frame/s和60frame/s。
在分层阴影图的基础上,PCF和带深度阴影映射的PCF算法实现的场景,如图3所示。图3(a)左图是基于分层阴影图的PCF算法,发现有明显的自阴影,图3(b)是用分层阴影图和深度阴影映射实现的PCF,可以发现对自阴影有所抑制。
图2 渲染场景效果图
图3 不同深度偏移算法自阴影效果
本文通过对百分比滤波算法的介绍,对其渲染效率和渲染效果提出改进。通过实验说明改进后的PCF算法优于原先的算法。本文主要围绕点光源展开,今后的工作重点研究其它光源和多光源的情况。
[1] Hasenfratz Jean-Marc,Lapierre Marc,Holzschuch Nicolas.A survey of real- time soft shadows algorithms[J].Computer Graphics Forum,2003,22(4):753 -774.
[2] 王华,朱丽华,顾耀林.一种基于阴影图的实时软阴影算法[J].计算机应用,2007,27(10):2 538-2 540.
[3] William R,Salesin D,Cook R.Rendering antialiased shadows with depth maps[J].ACM SIGGRAPH Computer Graphics,1987,21(3):283 -291.
[4] Guennebaud Gael,Barthe Loic,Paulin Mathias.Real- Time Soft Shadow Mapping by BackProjection[C].Cyprus:Europgraphics Association,2006:227-234.
[5] Schüler Christian.Eliminate surface acne with gradient shadow mapping[C].Virginia:Charles River Media,2006:200-217.
[6] Christian S.Multisampling extension for gradient shadow maps[C].Virginia:Charles River Media,2006:207 -218.
[7] 晏福兴.改进的百分比靠近软阴影技术的研究与实现[J].计算机工程与应用,2011,47(1):185-187.