快速百分比靠近软阴影绘制方法与流程

文档序号:17150292发布日期:2019-03-19 23:21阅读:293来源:国知局
快速百分比靠近软阴影绘制方法与流程

本发明涉及计算机图形学中阴影绘制技术领域,具体涉及一种快速百分比靠近软阴影绘制方法,对百分比靠近软阴影绘制算法进行改进,在保证软阴影质量的情况下,降低其运行时间。



背景技术:

近年来,虚拟现实的各种应用与大型游戏对虚拟场景的真实感要求越来越高,如何让用户在虚拟环境中体验到与现实世界相同的感受,是这一领域的研究热点之一。阴影可以表达物体间的空间关系,因此被视为提升虚拟场景真实感的重要手段。

阴影可分为硬阴影和软阴影,前者是在点光源下产生的,后者则是在面光源下产生的,更符合人们的认知。虚拟场景中软阴影生成算法可分为基于图像的方法和基于几何计算的方法,前者实现简单而且性能更高。鉴于人们对虚拟场景真实感的要求越来越高以及硬件资源的限制,研究者们将重点放在了基于图像的软阴影生成方法上。

百分比靠近软阴影(percentageclosersoftshadow,pcss)是一种基于图像的软阴影生成算法,具有实现简单、软阴影生成质量高的优点,因而成为研究的主流。但该方法的计算量很大,生成软阴影的速度较慢。一些研究通过使用预计算数据来重构阴影测试函数,在一定程度上提升了pcss算法的性能,但会导致生成的软阴影出现漏光现象,影响了软阴影的质量。高质量快速百分比靠近软阴影(highqualityandefficientpercentageclosersoftshadows,hqepcss)未进行阴影测试函数的重构,因而可以生成质量较高的软阴影,但是在某些场景中,该方法的效率不高。



技术实现要素:

本发明所要解决的技术问题是提供一种快速百分比靠近软阴影绘制方法(fastpcss,fpcss),能够在较少的运行时间下生成质量较好的软阴影。

为解决上述技术问题,本发明采用的技术方案是:

一种快速百分比靠近软阴影绘制方法,包括以下步骤:

步骤1:生成缩减式多尺度阴影图;

步骤2:对场景进行延迟渲染,生成g缓存;

步骤3:计算各像素的搜索区域,并保存为搜索区域图;

步骤4:使用σ1=0.0,σ2=σ3=0.1的差异性上界、4×4的局部区域,并且在父亲像素中保存孩子的位置信息,得到搜索区域图的层级结构图;其中,σ1、σ2、σ3分别代表两像素间可容忍的区域大小差异、区域中心点差异、深度值差异的最大值;

步骤5:利用3层的线性四叉树进行快速遍历,在遍历时使用缩减式多尺度阴影图查询当前遍历区域,接着使用查询到的信息,对代表像素进行处理,得到代表像素的遮挡物平均深度;

步骤6:利用搜索区域图的层级结构图,填充其余像素的平均遮挡物深度;

步骤7:计算各像素的半影大小;

步骤8:根据半影大小计算各像素的过滤区域范围并保存为过滤区域图;

步骤9:利用σ1=0.0,σ2=σ3=0.1的差异性上界、2×2的局部区域,并且在父亲像素中保存孩子的位置信息,得到过滤区域图的层级结构图;

步骤10:利用3层的线性四叉树进行快速遍历,在遍历时使用缩减式多尺度阴影图查询当前遍历区域,接着使用查询到的信息,对代表像素进行处理,得到代表像素的软阴影值;

步骤11:利用过滤区域图的层级结构图,填充其余像素的软阴影值并保存为软阴影图;

步骤12:对软阴影图进行模糊处理,即使用过滤内核为3×3的高斯滤波,以使生成的软阴影更加平滑。

进一步的,所述步骤1具体为:

步骤1.1:设置阴影图的大小为2k×2k,k为自然数;以面光源中心为视点对场景进行绘制,将场景深度信息保存到阴影图中,并将阴影图作为缩减式多尺度阴影图的第0层;用i表示当前处理的层数,并设置i=1;

步骤1.2:如果i>k,流程结束;否则需要计算第i层数据,该层的大小为(2k-2i-1)×(2k-2i-1),相对于阴影图来说,左、上边少了2i-1个像素,右、下边少了2i-1-1个像素;在对第i层坐标为(x,y)的像素进行计算时,需要第i-1层4个像素存储的信息,这些信息包括区域内最小深度值、区域内最大深度值、区域内深度值之和以及区域内像素个数;如果i=1,则4个像素的坐标分别为(x-1,y-1)、(x-1,y)、(x,y-1)以及(x,y);否则,4个像素的坐标分别为(x-2i-2,y-2i-2)、(x+2i-2,y-2i-2)、(x-2i-2,y+2i-2)以及(x+2i-2,y+2i-2);i的值加1,重复步骤1.2。

进一步的,在使用缩减式多尺度阴影图对阴影图进行查询时,若查询区域的大小不是2n×2n,n为自然数,需要寻找一个与其相似且大小为2n×2n的区域来替代它;设原区域的中心点坐标为(qx,qy),区域大小为qs×qs,近似区域的中心点坐标为(qx′,qy′),大小为qs′×qs′,则近似区域的计算方式为:

1)计算原区域的左边界l、右边界r、上边界t以及下边界b;

2)设阴影图的大小为e,需要将区域的边界限制在阴影图内;

l=max(l,0)

r=min(l,e-1)

t=max(l,0)

b=min(l,e-1)

3)设w=r-l+1、h=b-t+1,w和h分别表示了查询区域的宽度和高度;设lw=log2w,lh=log2h,其反映查询区域的宽和高是否形如2n;用w′表示w的形如2n的近似值,如果lw为整数,则令w′=w;否则,将w写成二进制形式,如果次高位为1,则否则

4)用h′表示h的形如2n的近似值,如果lh为整数,则令h′=h,否则,将h写成二进制形式,如果次高位为1,则否则

5)如果w′=h′,则令qs′=w′,否则令qs′=min(min(w′,h′)×2,e);

6)计算限制后的区域的中心(qx′,qy′);

qx′=l+qs′/2

qy′=t+qs′/2

7)如果(qx′+qs′/2-1)≥e,则令qx′=e-1-qs′/2+1;如果(qy′+qs′/2-1)≥e,则令qy′=e-1-qs′/2+1。

进一步的,所述步骤5和步骤10中,进行快速遍历为:给定待测值test以及测试区域a,计算区域a中深度值小于test的像素总数count以及这些像素的像素值之和sum,具体如下:

1)将sum和count初始化为0;

2)得到测试区域a内所有像素的最大值vmax和最小值vmin;

3)如果test<vmin,说明该区域内不存在小于test的值,因此不改变sum和count,并进行步骤4);如果test>vmax,说明该区域内所有的值都小于test,因此使用缩减式多尺度阴影图获取该区域内像素值之和以及像素总数,分别加到sum和count上,并进行步骤4);否则,说明当前信息不足以完成正确的计算,如果已经遍历到设置的最大层数,就会对该区域进行采样,并利用采样信息得到sum和count的估计值;否则,要将区域a分成多个更小的区域;

4):确定将要遍历的下一区域,如果下一区域存在,则进行步骤2)至3),否则说明已经完成遍历,流程结束。

进一步的,在进行快速遍历时利用采样信息提高计算结果的精确度,即:

使用数量为1、4以及16的采样点组,而且对于每种数量,生成8个不同的采样点组,将采样点的位置标准化到0~1之间,并将所有的采样点组保存为一幅大小为21×8的图像;对于中心为(px,py),大小为ps×ps区域,采样具体如下:

1)用g表示所需的采样点组序号,采样点数量为1的采样点组编号为0,采样点数量为4的采样点组编号为1,采样点数量为16的采样点组编号为2;设置g=ps/2,将g限定在1~4之间,并令g=log2g;

2)设m=(px+py)mod(8),则使用的采样点组为第m套,而且在第m套采样组中,所需的采样点的起始位置为(4g-1)/3,终止位置为4×(4g-1)/3;

3)对所有标准化的采样点位置按区域大小进行放缩,并进行采样。

进一步的,所述步骤3具体为:将各像素对应的三维空间中的点作为视点,则面光源在阴影图所在平面的投影即为其对应的搜索区域。

进一步的,所述步骤7计算各像素的半影大小具体为:设面光源大小为slight,当前像素相对于光源的深度值为dpixel,遮挡物平均深度为daverage,则半影大小spenumbra=((dpixel-daverage)/daverage)×slight。

与现有技术相比,本发明的有益技术效果是:能够在较少的运行时间下生成质量较好的软阴影,具有更高的运行效率。

附图说明

图1是缩减式多尺度阴阴影图示意图。

图2是采样点信息组织方式示意图。

图3是局部区域划分方式示意图。

图4是为了说明本发明所提fpcss方法的有效性,使用到的三个测试场景。

图5展示了hqepcss方法在三个场景下的运行时间。

图6展示了fpcss方法在三个场景下的运行时间。

图7展示了hqepcss方法在三个场景下生成的软阴影效果。

图8展示了fpcss方法在三个场景下生成的软阴影效果。

具体实施方式

下面结合附图和具体实施方式对本发明作进一步详细的说明。

缩减式多尺度阴影图是一个层级结构,其中每一层都是一幅图像,其构造流程为:

步骤1:设置阴影图的大小为2k×2k(k为自然数,通常取9~11)。以面光源中心为视点对场景进行绘制,将场景深度信息保存到阴影图中,并将阴影图作为缩减式多尺度阴影图的第0层。用i表示当前处理的层数,并设置i=1。

步骤2:如果i>k,流程结束;否则需要计算第i层数据,该层的大小为(2k-2i-1)×(2k-2i-1),相对于阴影图来说,左、上边少了2i-1个像素,右、下边少了2i-1-1个像素。在对第i层坐标为(x,y)的像素进行计算时,需要第i-1层4个像素存储的信息,这些信息包括区域内最小深度值、区域内最大深度值、区域内深度值之和以及区域内像素个数。如果i=1,则4个像素的坐标分别为(x-1,y-1)、(x-1,y)、(x,y-1)以及(x,y);否则,4个像素的坐标分别为(x-2i-2,y-2i-2)、(x+2i-2,y-2i-2)、(x-2i-2,y+2i-2)以及(x+2i-2,y+2i-2)。i的值加1,转步骤2。

在使用缩减式多尺度阴影图对阴影图进行查询时,如果查询区域的大小不是2n×2n(n为自然数),需要寻找一个与其相似且大小为2n×2n的区域来替代它,因为缩减式多尺度阴影图只对这样的区域进行了预处理,如果查询区域大小不为2n×2n,需要读取多个像素才可得到所需信息,会增加查询开销。设原区域的中心点坐标为(qx,qy),区域大小为qs×qs,近似区域的中心点坐标为(qx′,qy′),大小为qs′×qs′,则近似区域的计算方式为:

步骤1:计算原区域的左边界l、右边界r、上边界t以及下边界b。

步骤2:设阴影图的大小为e,需要将区域的边界限制在阴影图内。

l=max(l,0)

r=min(l,e-1)

t=max(l,0)

b=min(l,e-1)

步骤3:设w=r-l+1、h=b-t+1,w和h分别表示了查询区域的宽度和高度。对于w和h的处理过程相似,以w为例进行说明:设lw=log2w,其可以反映查询区域的宽度是否形如2n。如果lw为整数,则令lw′=lw,并转步骤5,否则执行步骤4。

步骤4:用w′表示w的形如2n的近似值。将w写成二进制形式,如果次高位为1,则否则

步骤5:如果w′=h′,则令qs′=w′,否则令qs′=min(min(w′,h′)×2,e)。

步骤6:计算限制后的区域的中心(qx′,qy′)。

qx′=l+qs′/2

qy′=t+qs′/2

步骤7:如果(qx′+qs′/2-1)≥e,则令qx′=e-1-qs′/2+1;如果(qy′+qs′/2-1)≥e,则令qy′=e-1-qs′/2+1。

在快速遍历时可以利用采样信息提高计算结果的精确度。多重抖动采样可以生成较为均匀的采样点。但在实现时还需考虑一些问题。首先,如果在运行时动态计算各区域的采样点信息,会造成性能的下降。因此可以预先计算好采样点信息,一组采样点信息称为一个采样点组。在运行时,只需读取采样点组,省去了采样点位置信息的计算。其次,如果对于大小不同的区域采用相同数量的采样点,则对于较小区域,浪费了计算资源,对于较大区域,采样信息不充分,计算结果较为粗糙。为了对不同大小的区域使用不同数量的采样点,需要保存采样点数量不同的采样点组。最后,如果对所有大小相似区域采用同一采样点组,可能会造成相邻像素的计算结果基本相同,生成的软阴影不够平滑,因此,需要为每一种采样点数量生成多个采样点组,以便对大小相似的不同区域采用不同的采样点组。

本发明使用了数量为1、4以及16的采样点组,而且对于每种数量,生成8个不同的采样点组,将采样点的位置标准化到0~1之间,并将所有的采样点组保存为一幅大小为21×8的图像。对于中心为(px,py),大小为ps×ps区域,采样具体方式如下:

步骤1:用g表示所需的采样点组序号(采样点数量为1的采样点组编号为0,采样点数量为4的采样点组编号为1,采样点数量为16的采样点组编号为2)。设置g=ps/2,将g限定在1~4之间,并令g=log2g。

步骤2:设m=(px+py)mod8(),则使用的采样点组为第m套,而且在第m套采样组中,所需的采样点的起始位置为(4g-1)/3,终止位置为4×(4g-1)/3。

步骤3:对所有标准化的采样点位置按区域大小进行放缩,并进行采样。

软阴影绘制中涉及到快速遍历的问题是:给定待测值test以及测试区域a,计算区域a中深度值小于test的像素总数count以及这些像素的像素值之和sum,具体方法如下:

步骤1:将sum和count初始化为0。

步骤2:得到测试区域a内所有像素的最大值vmax和最小值vmin(利用缩减式多尺度阴影图)。

步骤3:如果test<vmin,说明该区域内不存在小于test的值,因此不改变sum和count,并进行步骤4;如果test>vmax,说明该区域内所有的值都小于test,因此获取该区域内像素值之和以及像素总数,分别加到sum和count上,并进行步骤4;否则,说明当前信息不足以完成正确的计算,如果已经遍历到设置的最大层数,就会对该区域进行采样,并利用采样信息得到sum和count的估计值;否则,要将区域a分成多个更小的区域。

步骤4:确定将要遍历的下一区域,如果下一区域存在,则进行步骤2-3,否则说明已经完成遍历,流程结束。

像素计算结果复用方案中的关键问题有两点:一是差异性的度量方式,用来判断两个像素是否相似;二是关联信息的存储方式,用来对相似像素进行关联。

对于差异性度量方式,像素包含的数据项分别是深度值、搜索区域中心坐标(2个分量)以及搜索区域的大小。设像素ti的深度值为di,区域中心的坐标为(xi,yi),区域大小为si,则对于两个像素t1和t2来说,如果满足:

|(s1-s2)/s2|≤σ1

|(x1-x2)/x2|≤σ2

|(y1-y2)/y2|≤σ2

|(d1-d2)/d2|≤σ3

就认为t1和t2相似,其中σ1、σ2、σ3分别代表两像素间可容忍的区域大小差异、区域中心点差异、深度值差异的最大值。但是使用上述判定条件,采用不同的计算顺序可能会产生不同的结果。因此,在具体实现时,判定条件中使用的除数是两测试数据中的较大值。

对于关联信息存储方式,如果某像素的左边像素和上边像素与其相似,则将其与当前像素关联起来(通过在一幅图像中设置标记)。当所有的像素都计算完成后,相似的像素就会关联到一起,形成多个相似像素组。

为了描述像素之间的关联性,可以将一个像素看作另一个像素的父亲或者孩子。关联信息可以存储在孩子中(在孩子中保存父亲的位置信息),也可以存储在父亲中(在父亲中保存孩子的位置信息)。对于前一种方式,代表像素的值计算完毕后,其它像素需要找到其祖先,然后将祖先像素的值赋值给自身,这种做法会增加总的计算量,因为不同像素查找祖先时经过的路径可能会重复,因而本发明使用后一种方式。在这种方式下,一个像素如果不是任何像素的孩子,它就是代表像素。代表像素需要负责其子孙像素的赋值工作。

上述方法可以达到复用计算结果的目的,但是会出现两方面的问题:一是误差累积现象。若像素t1和像素t2相似,像素t2和像素t3相似,则采用上述方法便会认为像素t1和像素t3相似,而实际上这两个像素不一定相似;二是当一个相似像素组中的像素过多时,代表像素需要为大量像素赋值,严重影响性能。

为了解决这两方面的问题,引入局部区域这一概念,只对位于同一局部区域中的像素执行复用方案。局部区域变相限制了相似像素组的大小,一方面,两像素间的最大误差有了上界,因此减轻了误差累积现象的影响;另一方面,形成的层次结构深度较低,减轻了代表像素的负担。

本发明使用了简单有效的局部区域实现方式,将图像均匀地划分为h×h大小的子区域。在计算关联信息时,设当前处理像素的坐标为(cx,cy),如果(cx)mod(h)≠0,并且(cy)mod(h)≠0,说明其位于局部区域内部,因此使用复用方案进行处理;否则说明其位于局部区域的边界上,于是不设置与其它区域中像素的关联关系,因而层级结构会停止增长,限制了相似像素组大小。

本发明中还涉及到一些原有算法中的重要部分,包括:延迟渲染、搜索区域的计算、线性四叉树以及半影大小的计算。

使用延迟渲染技术,将可见物体的信息保存到g缓存中,之后需要再次访问这些信息时,不需要重新计算,只需从g缓存中查找所需信息即可。

各像素对应的搜索区域的计算方式为:将各像素对应的三维空间中的点作为视点,则面光源在阴影图所在平面的投影即为其对应的搜索区域。

线性四叉树与普通四叉树一样,可以完成快速遍历中的剪枝操作。但是线性四叉树会使用较少的存储空间,降低了程序运行时的系统资源消耗。

半影大小的计算方式如下:

设面光源大小为slight,当前像素相对于光源的深度值为dpixel,遮挡物平均深度为daverage,则半影大小spenumbra=(dpixel-daverage/daverage)×slight。

总的来说,本发明快速百分比靠近软阴影绘制方法,包括以下步骤:步骤1:生成缩减式多尺度阴影图;步骤2:对场景进行延迟渲染,生成g缓存;步骤3:计算各像素的搜索区域,并保存为搜索区域图;步骤4:使用σ1=0.0,σ2=σ3=0.1的差异性上界、4×4的局部区域,并且在父亲像素中保存孩子的位置信息,得到搜索区域图的层级结构图;其中,σ1、σ2、σ3分别代表两像素间可容忍的区域大小差异、区域中心点差异、深度值差异的最大值;步骤5:利用3层的线性四叉树进行快速遍历,在遍历时使用缩减式多尺度阴影图查询当前遍历区域,接着使用查询到的信息,对代表像素进行处理,得到代表像素的遮挡物平均深度;步骤6:利用搜索区域图的层级结构图,填充其余像素的平均遮挡物深度;步骤7:计算各像素的半影大小;步骤8:根据半影大小计算各像素的过滤区域范围并保存为过滤区域图;步骤9:利用σ1=0.0,σ2=σ3=0.1的差异性上界、2×2的局部区域,并且在父亲像素中保存孩子的位置信息,得到过滤区域图的层级结构图;步骤10:利用3层的线性四叉树进行快速遍历,在遍历时使用缩减式多尺度阴影图查询当前遍历区域,接着使用查询到的信息,对代表像素进行处理,得到代表像素的软阴影值;步骤11:利用过滤区域图的层级结构图,填充其余像素的软阴影值并保存为软阴影图;步骤12:对软阴影图进行模糊处理,即使用过滤内核为3×3的高斯滤波,以使生成的软阴影更加平滑。

为了说明本专利所提fpcss方法的有效性,使用到的三个测试场景,如图4所示。图5展示了hqepcss方法在三个场景下的运行时间,图6展示了fpcss方法在三个场景下的运行时间,图7展示了hqepcss方法在三个场景下生成的软阴影效果,图8展示了fpcss方法在三个场景下生成的软阴影效果。

由图7和图8的对比可知,fpcss方法与原有hqepcss方法生成的软阴影效果基本相同,但由图5和图6的对比可知,fpcss方法拥有更快的生成速度。实验结果表明,fpcss方法可以在保持软阴影真实感的条件下,大幅度提高软阴影的生成速度。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1