本申请涉及阴影图技术领域,尤其涉及一种阴影图的生成方法及装置。
背景技术:
一个物体之所以会处在阴影中,是由于在它和光源之间存在着遮蔽物,或者说遮蔽物离光源的距离比该物体要近。
场景中生成物体的实时阴影,一般使用阴影图(shadowmap)技术。shadowmap是一张用来记录光源视角场景的深度信息的纹理图,shadowmap记录了以光源视角来看,各个可照射角度下离光源最近的物体与光源的距离。
在光照阴影渲染过程中,传统的大场景级联阴影算法需要多张shadowmap纹理,也就是说,为了渲染以眼睛(或相机)为视点的场景阴影,需要利用多张shadowmap纹理来表述场景中物体的遮挡关系,但是,使用多张shadowmap纹理,会耗用较大的纹理显存,且阴影渲染效率较低。
技术实现要素:
有鉴于此,本申请的主要目的在于提供一种阴影图的生成方法及装置,能够降低纹理显存的耗用量,并能够提高阴影渲染效率。
本申请提供了一种阴影图的生成方法,预先将至少一张shadowmap纹理划分为n个相同大小的纹理区域,其中,n≥2;所述方法包括:
生成以眼睛位置为视点的目标视锥体;
将所述目标视锥体由近至远分割成n个子视锥体,其中,每个子视锥体的区域由近至远依次增大;
生成所述子视锥体的渲染参数,所述渲染参数包括视图矩阵和投影矩阵;
根据所述子视锥体的渲染参数,在一个所述纹理区域内渲染所述子视锥体对应的场景物体,得到以光源位置为视点的场景深度图。
可选的,所述方法还包括:
判断所述子视锥体的位置相比于上一时刻是否发生变化;
若是,则执行所述根据所述子视锥体的渲染参数,在一个所述纹理区域内渲染所述子视锥体对应的场景物体的步骤;
若否,则继续使用所述子视锥体在上一时刻对应的场景深度图。
可选的,所述判断所述子视锥体的位置相比于上一时刻是否发生变化,包括:
确定历史位置与当前位置之间的相互距离,其中,所述历史位置为上一时刻所述子视锥体的包围球中心的坐标,所述当前位置为当前时刻所述子视锥体的包围球中心的坐标;
判断所述相互距离是否大于预设阈值;
若是,则确定所述子视锥体中的物体的当前位置相比于上一时刻发生变化;
若否,则确定所述子视锥体中的物体的当前位置相比于上一时刻未发生变化。
可选的,所述方法还包括:
确定目标物体的受光面和背光面,其中,所述目标物体为所述目标视锥体中的物体;
为所述受光面与所述背光面的过渡区域配置渐变的光照颜色;
根据所述受光面每一像素点接收的光照颜色,分别确定所述受光面每一像素点的颜色;
根据所述背光面每一像素点接收的光照颜色,分别确定所述背光面每一像素点的颜色。
可选的,所述确定目标物体的受光面和背光面,包括:
计算所述目标物体表面每一像素点对应的点积,其中,所述点积为所述像素点的法线朝向与光源方向的点积;
若所述像素点对应的点积大于0,则确定所述像素点位于受光面;
若所述像素点对应的点积等于0,则确定所述像素点位于受光面与背光面的交界处;
若所述像素点对应的点积小于0,则确定所述像素点位于背光面。
可选的,所述为所述受光面与所述背光面的过渡区域配置渐变的光照颜色,包括:
从点积取值范围[-1,1]内,选取一个取值区间[-x1,x2],其中,x1和x2均为正数且小于1;
从所述目标物体表面选择一个过渡区域,其中,所述过渡区域内每一像素点对应的点积在所述取值区间[-x1,x2]内;
使所述过渡区域一侧接收的第一光照颜色向另一侧接收的第二光照颜色渐变,其中,所述第一光照颜色为除所述过渡区域以外的受光面接收的固定光照颜色,所述第二光照颜色为除所述过渡区域以外的背光面接收的固定光照颜色。
可选的,所述根据所述受光面每一像素点接收的光照颜色,分别确定所述受光面每一像素点的颜色,包括:
确定所述受光面中每一受光像素点对应的阴影因子,其中,所述阴影因子的大小与所述受光像素点所受的阴影遮蔽程度相关;
根据所述受光像素点的本身纹理颜色、接收的光照颜色、环境本身颜色、所述阴影因子确定所述受光像素点的颜色。
可选的,所述确定所述受光面中每一受光像素点对应的阴影因子,包括:
选取所述受光像素点周边的m个参考像素点,其中,m≥2;
利用所述场景深度图,确定所述受光像素点和所述参考像素点是否处于阴影中;
若均不在阴影中,则所述受光像素点的阴影因子取值为0;若存在m个像素点在阴影中,则根据所述m个像素点中的每一像素点对应的预设阴影值,确定所述受光像素点的阴影因子取值,其中,0<m≤m+1。
可选的,所述根据所述背光面每一像素点接收的光照颜色,分别确定所述背光面每一像素点的颜色,包括:
根据所述背光面中每一背光像素点的本身纹理颜色、接收的光照颜色、环境本身颜色,确定所述背光像素点的颜色。
可选的,所述方法还包括:
降低第一距离与第二距离之间的比值,其中,所述第一距离为所述远裁剪面与所述眼睛位置之间的距离,所述第二距离为所述近裁剪面与所述眼睛位置之间的距离。
可选的,按照以下方式确定所述第一距离:
根据所述目标视锥体向上向量的z值、视野高度确定所述第一距离,其中,所述视野高度为所述眼睛位置与地面之间的垂直距离。
可选的,所述第一距离与所述第二距离之间的比值为5。
本申请还提供了一种阴影图的生成装置,包括:
区域预划分单元,用于预先将至少一张shadowmap纹理划分为n个相同大小的纹理区域,其中,n≥2;
视锥体生成单元,用于生成以眼睛位置为视点的目标视锥体;
视锥体分割单元,用于将所述目标视锥体由近至远分割成n个子视锥体,其中,每个子视锥体的区域由近至远依次增大;
渲染参数生成单元,用于生成所述子视锥体的渲染参数,所述渲染参数包括视图矩阵和投影矩阵;
深度图渲染单元,用于根据所述子视锥体的渲染参数,在一个所述纹理区域内渲染所述子视锥体对应的场景物体,得到以光源位置为视点的场景深度图。
可选的,所述装置还包括:
受背光面确定单元,用于确定目标物体的受光面和背光面,其中,所述目标物体为所述目标视锥体中的物体;
渐变颜色配置单元,用于为所述受光面与所述背光面的过渡区域配置渐变的光照颜色;
受光面颜色确定单元,用于根据所述受光面每一像素点接收的光照颜色,分别确定所述受光面每一像素点的颜色;
背光面颜色确定单元,用于根据所述背光面每一像素点接收的光照颜色,分别确定所述背光面每一像素点的颜色。
可选的,所述装置还包括:
比值降低单元,用于降低第一距离与第二距离之间的比值,其中,所述第一距离为所述远裁剪面与所述眼睛位置之间的距离,所述第二距离为所述近裁剪面与所述眼睛位置之间的距离。
本申请提供的一种阴影图的生成方法及装置,生成以眼睛位置为视点的目标视锥体,并将所述目标视锥体由近至远分割成n个子视锥体,然后生成所述子视锥体的渲染参数,所述渲染参数包括视图矩阵和投影矩阵;接下来,由于已经预先将至少一张shadowmap纹理划分为n个相同大小的纹理区域,并将每一纹理区域分配给一个子视锥体,这样就可以根据所述子视锥体的渲染参数,在一个纹理区域内渲染所述子视锥体对应的场景物体,得到以光源位置为视点的场景深度图。可见,本实施例利用一张shadowmap纹理中的部分区域而非现有技术中的一整张shadowmap纹理,来表达分割出的一个视锥体区域中的物体遮挡关系,这样可以有效降低shadowmap纹理的耗用量,并能够提高阴影渲染效率。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的以光源为视点的视锥体示意图;
图2为本申请实施例提供的场景视锥体划分示意图;
图3为本申请实施例提供的一种阴影图的生成方法的流程示意图;
图4为本申请实施例提供的目标视锥体划分示意图;
图5为本申请实施例提供的一种场景物体渲染方法的流程示意图;
图6为本申请实施例提供的颜色渐变示意图;
图7为本申请实施例提供的z-fighting现象示意图;
图8为本申请实施例提供的裁剪面示意图;
图9为本申请实施例提供的平视视角的场景示意图;
图10为本申请实施例提供的俯视视角的场景示意图;
图11为本申请实施例提供的一种阴影图的生成装置的组成示意图;
图12为本申请实施例提供的一种阴影图的生成装置的硬件构成示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在光照阴影渲染过程中,对于以眼睛视角来看的场景,需要判断场景中的物体是否在阴影中,以便对物体的阴影部分进行绘制。具体来讲,对于物体表面上的每一像素点,如果光源和该像素点之间的连线没有任何物体遮挡,则该像素点没有在阴影中,反之,如果光源和该像素点之间的连线有物体遮挡,则该像素点处在阴影中。
在实际应用中,生成场景中物体的实时阴影,一般使用shadowmap技术。shadowmap的基本原理是:
首先以光源位置作为视点对场景进行绘制,得到一张或多张shadowmap,shadowmap中的每个单元称为一个阴影纹素,其中,shadowmap纹理中记录下离光源最近的物体与光源之间的距离,此外,在动态场景中,一旦场景中的遮挡关系发生改变,就需要实时地更新shadowmap。对于以眼睛为视点的场景,在绘制该场景的过程中,要进行阴影判断,即判断每个像素点是否处于场景的阴影中;若像素点不在阴影中,则正常绘制,否则绘制成阴影,其中,判断场景中的像素点是否在阴影中需要用到前面绘制的shadowmap,具体地,对于屏幕所显示场景中的某个像素点p,首先将其转换到以光源为视点的3d空间,得到像素点p在该空间下的深度值,然后与shadowmap中像素点p对应的纹素所保存的深度值作比较,若像素点p的深度值大于shadowmap中保存的深度值,则说明像素点p被遮挡,处于阴影区域,否则说明像素点p不在阴影区域,通过这种判断,就可以得到场景中的阴影区域。
如图1所示的以光源为视点的视锥体示意图,图中e代表眼睛位置,l代表光源位置。从图1可以看出,从光源方向渲染场景时,不一定能全部覆盖以眼睛位置为视点的视野范围,因此需要多张shadowmap纹理来表述场景中物体的遮挡关系。
如图2所示的场景视锥体划分示意图,图中所示视锥体是以眼睛位置为视点的场景视锥体,图中e代表眼睛位置,l代表光源位置,箭头方向为光源照射方向。图2场景视锥体被划分成了三个区域,即近、中、远各一个区域,现有技术中,需要使用三张shadowmap纹理来分别表达近、中、远各个视锥体区域中物体的遮挡关系,但是,当视锥体区域较多时,将会耗费更多张的shadowmap纹理。
为解决上述现有技术问题,本申请实施例提供了一种阴影图的生成方法,利用一张shadowmap纹理中的部分区域来表达分割出的一个视锥体区域中的物体遮挡关系,这样可以有效降低shadowmap纹理的耗用量,并能够提阴影高渲染效率。
参见图3,为本申请实施例提供的一种阴影图的生成方法的流程示意图,该方法包括以下步骤:
s301:生成以眼睛位置为视点的目标视锥体。
在本步骤中,首先确定最远阴影距离,该距离可以是人眼能够分辨的物体的最远距离,比如距离眼睛位置1000米的距离;然后,根据最远阴影距离、以及以眼睛位置为视点的视图矩阵和投影矩阵等参数,确定以眼睛视角来看的场景中的阴影范围,根据该阴影范围以及光源方向,确定以眼睛视角来看的视锥体validfrustum,本实施例将该视锥体validfrustum称为所述目标视锥体。
s302:将所述目标视锥体由近至远分割成n个子视锥体,其中,每个子视锥体的区域由近至远依次增大。
在本步骤中,需要确定合理的分割值,对目标视锥体validfrustum进行分割,得到从近到远的n(n大于或等于2)个子视锥体,分别为validfrustum0、validfrustum1、validfrustum2、……、validfrustumn,其中,validfrustum0、validfrustum1、validfrustum2、……、validfrustumn的区域由近至远依次增大。
例如,参见图4所示的目标视锥体划分示意图,图中e代表眼睛位置,l代表光源位置,将目标视锥体validfrustum分割成了四个子视锥体,分别为validfrustum0、validfrustum1、validfrustum2、validfrustum4。
为了保证每个子视锥体的区域由近至远依次增大,在确定分割位置时,可以在如图4所示虚线方向上,使每一子视锥体的高度均相同或依次增大。当然,也可以采用其它分割方式,本实施例不对所述目标视锥体的分割方式进行具体限定。
s303:生成所述子视锥体的渲染参数,所述渲染参数包括视图矩阵和投影矩阵。
在本步骤中,首先计算分割后的各个子视锥体的包围球的中心和半径,根据子视锥体包围球的中心和半径确定对应的子视锥体参数,具体地,子视锥体validfrustum0的参数为shdowfrustum0、子视锥体validfrustum1的参数为shdowfrustum1、子视锥体validfrustum2的参数为shdowfrustum2、……、子视锥体validfrustumn的参数为shdowfrustumn,其中,各个子视锥体参数包括对应子视锥体的视图矩阵和投影矩阵。
s304:根据所述子视锥体的渲染参数,在一个纹理区域内渲染所述子视锥体对应的场景物体,得到以光源位置为视点的场景深度图。
在执行本步骤之前,需要预先执行以下步骤s300,以希望为每一子视锥体分配一个shadowmap纹理区域,其中,s300可以在s301-s303的执行过程中或s301-s303中每一步骤之前或之后执行,本实施例不对s300的执行顺序进行限定,只要在s304之前执行即可。
s300:预先将至少一张shadowmap纹理划分为n个相同大小的纹理区域。
可以将一张或多张shadowmap纹理进行区域分割,得到的纹理区域数量大于或等于子视锥体的数量n即可。在本申请的一种实施方式中,可以预先将一张shadowmap纹理划分为n个纹理区域,例如,当所述目标视锥体validfrustum被划分为4个子视锥体时,可以预先将一张2048*2048的纹理图片划分成四张1024*1024的纹理区域使用,这样,使用一张shadowmap纹理比使用多张shadowmap纹理耗用的资源减少许多,并能够提高阴影渲染效率。
在通过步骤s300得到n个纹理区域的基础上,这n个纹理区域分别用于绘制n个子视锥体validfrustum0、validfrustum1、validfrustum2、……、validfrustumn内的场景,从而得到以光源为视点的n个场景深度图,其中,每个场景深度图分别表述了子视锥体场景中物体的遮挡关系,记录了子视锥体场景内离光源最近的物体与光源之间的距离。
需要说明的是,由于目标视锥体的各个子视锥体区域由近至远依次增大(例如图4),当使用相同分辨率比如1024*1024的shadowmap纹理区域绘制不同子视锥体的场景时,各个子视锥体场景的显示精度将由近至远依次降低。但是,就视觉效果来看,目标视锥体在由近至远时的显示效果并不会有太大区别,因此,当利用不同精度的各个shadowmap纹理区域渲染目标视锥体中的物体阴影时,不会降低渲染图像的视觉效果。
此外,在动态场景中,不但需要将场景中的物体绘制在几张shadowmap纹理上,还需要实时绘制这几张shadowmap,导致渲染阴影的效率较低。为克服该缺陷,本实施例在生成上述场景深度图之前,先计算每一子视锥体的参数变化量,当参数变化超过一定范围后才重新生成对应的场景深度图,否则重用上次生成的场景深度图。
因此,本方法实施例还可以进一步包括以下步骤:
步骤a:判断所述子视锥体中的物体的当前位置相比于上一时刻是否发生变化;若是,则执行步骤b;若否,则执行步骤c。
在本申请的一种实施方式中,步骤a具体可以包括:
确定历史位置与当前位置之间的相互距离,其中,所述历史位置为上一时刻所述子视锥体的包围球中心的坐标,所述当前位置为当前时刻所述子视锥体的包围球中心的坐标;判断所述相互距离是否大于预设阈值;若是,则确定所述子视锥体中的物体的当前位置相比于上一时刻发生变化;若否,则确定所述子视锥体中的物体的当前位置相比于上一时刻未发生变化。
在本实施方式中,所述包围球中心的坐标可以是世界坐标,对于每一子视锥体的包围球中心,将前一时刻的包围球中心坐标与当前时刻的包围球中心坐标进行比较,如果发生变化,说明该子视锥体对应场景中的遮挡关系发生了改变,需要更新对应的shadowmap,否则,重用上次使用的shadowmap,这样可以降低生成shadowmap的时间,提高shadowmap的渲染效率。
步骤b:执行步骤s304。
步骤c:继续使用所述子视锥体在上一时刻对应的场景深度图。
综上,本实施例提供的一种阴影图的生成方法,生成以眼睛位置为视点的目标视锥体,并将所述目标视锥体由近至远分割成n个子视锥体,然后生成所述子视锥体的渲染参数,所述渲染参数包括视图矩阵和投影矩阵;接下来,由于已经预先将至少一张shadowmap纹理划分为n个相同大小的纹理区域,并将每一纹理区域分配给一个子视锥体,这样就可以根据所述子视锥体的渲染参数,在一个纹理区域内渲染所述子视锥体对应的场景物体,得到以光源位置为视点的场景深度图。可见,本实施例利用一张shadowmap纹理中的部分区域而非现有技术中的一整张shadowmap纹理,来表达分割出的一个视锥体区域中的物体遮挡关系,这样可以有效降低shadowmap纹理的耗用量。
在实际场景中,由于场景中各物体接收光照情况复杂,使得物体存在向光面、背光面、阴影中、阴影外等多种情况。因此,设计合理的受光面、背光面、阴影中、阴影外的物体表面亮度,可以使场景中各物体有丰富的颜色亮度,从而可以清楚区分物体的向光面、背光面、阴影中、阴影外等区域,进而提升了对物体的渲染效果。
参见图5,为本申请实施例提供的一种场景物体渲染方法的流程示意图,该方法包括以下步骤:
s501:确定目标物体的受光面和背光面,其中,所述目标物体为所述目标视锥体中的物体。
在上述以眼睛位置为视点的目标视锥体validfrustum对应的场景中,需要确定场景中每一物体的受光面和背光面,为便于描述,本实施例将场景内的每一物体称为目标物体。
在本申请的一种实施方式中,s501具体可以包括:计算所述目标物体表面每一像素点对应的点积,其中,所述点积为所述像素点的法线朝向与光源方向的点积;若所述像素点对应的点积大于0,则确定所述像素点位于受光面;若所述像素点对应的点积等于0,则确定所述像素点位于受光面与背光面的交界处;若所述像素点对应的点积小于0,则确定所述像素点位于背光面。
在本实施方式中,对于场景内的每一物体,首先计算物体表面每一像素点的法线朝向与光源方向的点积nl,其中,像素点的法线朝向是指该像素点的法线朝所述目标物体外侧的方向。实际上,nl的最大取值范围是[-1,1],对于物体上的每一像素点,当nl等于-1时,说明该像素点的法线朝向与光源方向相反,当nl等于0时,说明该像素点的法线朝向与光源方向准直,当nl等于1时,说明该像素点的法线朝向与光源方向相同,因此,点积在[-1,0)范围内的像素点区域构成了背光面,点积为0的各个像素点在受光面与背光面的交界处,点积在(0,1]范围内的像素点区域构成了受光面。
s502:为所述受光面与所述背光面的过渡区域配置渐变的光照颜色。
为了使场景中的目标物体有丰富的颜色亮度,可以为目标物体配置丰富的光照颜色。
为便于理解,本实施例以二维形式表示三维形式的物体表面,参见图6所示的颜色渐变示意图,假设圆形区域代表目标物体的表面、中间直线为背光面与受光面的分界线、直线左侧为背光面、直线右侧为受光面、虚线区域为二者的过渡区域。现举例说明s502,当受光面接收的光照颜色为红色、背光面接受的光照颜色为绿色,通过颜色渐变,可以使受光面向背光面方向的光照颜色渐变,其渐变趋势为从红色逐渐变为黄色、再逐渐变为绿色。
在本申请的一种实施方式中,s502具体可以包括步骤a-b:
步骤a:从点积取值范围[-1,1]内,选取一个取值区间[-x1,x2],其中,x1和x2均为正数且小于1,x1和x2可以相同也可以不同;从所述目标物体表面选择一个过渡区域,其中,所述过渡区域内每一像素点对应的点积在所述取值区间[-x1,x2]内。
例如,可以在nl的最大取值范围[-1,1]内,选择一个取值区间比如[-0.4,0.4]。那么,当nl在范围(0.4,1]时,认为nl对应的像素点属于图6所示受光面的右侧区域,其光照颜色为lightfrontcolor;当nl在范围[-1,0.4)时,认为nl对应的像素点属于图6所示背光面的左侧区域,其光照颜色为lightbackcolor;当nl在范围[-0.4,0.4]内时,认为nl对应的像素点属于图6所示的虚线区域。
步骤b:使所述过渡区域一侧接收的第一光照颜色向另一侧接收的第二光照颜色渐变,其中,所述第一光照颜色为除所述过渡区域以外的受光面接收的固定光照颜色,所述第二光照颜色为除所述过渡区域以外的背光面接收的固定光照颜色。
继续上个例子,将受光面的光照颜色lightfrontcolor和背光面的光照颜色lightbackcolor进行线性插值,以使二者的过渡区域所接收的光照颜色渐变。
s503:根据所述受光面每一像素点接收的光照颜色,分别确定所述受光面每一像素点的颜色。
经过步骤s502的光照颜色渐变,利用渐变的光照颜色确定受光面每一像素点的颜色,将使得物体颜色过渡更加平滑自然。
在本申请的一种实施方式中,s503具体可以包括以下步骤c-d:
步骤c:确定所述受光面中每一受光像素点对应的阴影因子,其中,所述阴影因子的大小与所述受光像素点所受的阴影遮蔽程度相关。
在物体接受正面光时,可以进一步考虑阴影对物体的遮蔽,因此,在确定受光面接收光照后的颜色时,需要预先计算受光面每一像素点对应的阴影因子。具体地,步骤c可以包括以下步骤c1-c3:
步骤c1:选取所述受光面上每一受光像素点周边的m个参考像素点,其中,m≥2。
对于每一受光像素点p1,可以获取受光像素点p1的上、下、左、右位置的四个像素点,将这4个像素点分别作为参考像素点;当然,还可以进一步获取受光像素点p1的左上、左下、右上、右下位置的四个像素点,将这8个像素点分别作为参考像素点。
步骤c2:利用所述场景深度图,确定所述受光像素点和所述参考像素点是否处于阴影中。
基于本申请图3的相关介绍可知,目标视锥体validfrustum被划分成了n个子视锥体,每个子视锥体对应一个场景深度图,每一场景深度图用来表述对应场景中物体的遮挡关系。这样,可以基于shadowmap的基本原理,根据n个场景深度图,确定受光像素点p1及其周边的各个参考像素点是否处于阴影中。
步骤c3:若均不在阴影中,则所述受光像素点的阴影因子取值为0;若存在m个像素点在阴影中,则根据所述m个像素点中的每一像素点对应的预设阴影值,确定所述受光像素点的阴影因子取值,其中,0<m≤m+1。
可以为阴影因子预设一个取值范围[0,z],关于受光像素点p1以及m个参考像素点即共m+1个像素点,对于每个像素点,当其在阴影中时,该像素点对应的预设阴影值可以是z/(m+1),当其不在阴影中时,该像素点对应的预设阴影值可以是0。例如,假设参考像素点的个数为4,那么,受光像素点p1及参考像素点共是5个像素点,又假设阴影因子的取值范围为[0,1],如果这5个像素点均不在阴影中,则受光像素点p1的阴影因子为0,如果有3个像素点在阴影中,则受光像素点p1的阴影因子为0.6。
步骤d:根据所述受光像素点的本身纹理颜色、接收的光照颜色、环境本身颜色、所述阴影因子确定所述受光像素点的颜色。
在上述目标视锥体validfrustum对应的场景中,每一物体在受光面时才会接收阴影,在背光面时只有基本的环境光亮度。因此,在本实施例中,可以利用下面公式计算每一受光像素点p1接收光照后的颜色值gy1:
gy1=nl*shadowfcator*(1-ambient)*ambient*lightcolor*texcolor
其中,nl为受光像素点p1的法线朝向和光源方向的点积;
shadowfcator为受光像素点p1对应的阴影因子;
ambient代表环境光分量,即没有光源时环境本身的颜色;
lightcolor为受光像素点p1接受的光照颜色;
texcolor为受光像素点p1本身的纹理色。
s504:根据所述背光面每一像素点接收的光照颜色,分别确定所述背光面每一像素点的颜色。
经过步骤s502的光照颜色渐变,利用渐变的光照颜色确定背光面每一像素点的颜色,将使得物体具有丰富的颜色亮度。
在本申请的一种实施方式中,s504具体可以包括:根据所述背光面中每一背光像素点的本身纹理颜色、接收的光照颜色、环境本身颜色,确定所述背光像素点的颜色。具体可以利用下面公式计算每一背光像素点p2接收光照后的颜色值gy2:
gy2=ambient*lightcolor*texcolor
其中,ambient代表环境光分量,即没有光源时环境本身的颜色;
lightcolor为背光像素点p2接受的光照颜色;
texcolor为受光像素点p2本身的纹理色。
综上,由于目标物体接收的光照颜色存在渐变,因此,当利用光照颜色确定目标物体在接收光照后的颜色时,可以使场景中各物体颜色过渡更加平滑自然,从而可以清楚区分物体正光面、背光面、阴影等区域,进而提升了物体渲染效果。
当对场景图像进行渲染时,可以开启深度测试,这样,开放图形库(opengraphicslibrary,简称opengl)就不会再去绘制模型(以眼睛位置为视点的场景物体)中被遮挡的部分,这样实现的显示画面更为真实。但是,由于深度缓冲区精度的限制,对于深度相差非常小的情况,比如在同一平面对两个物体进行绘制,当二者的深度值相差很小时,opengl就不能正确判定两者的深度值,从而导致深度测试的结果不可预测,可能出现画面中前后两个物体交错闪烁的情况,这种情况称为z-fighting。例如,如图7所示的z-fighting现象示意图,其中,深色区域为一个物体图像、浅色区域为另一个物体图像,二者出现交错显示的情况。
为了避免z-fighting现象,本申请实施例进一步可以包括:
降低第一距离与第二距离之间的比值,其中,所述第一距离为所述远裁剪面与所述眼睛位置之间的距离,所述第二距离为所述近裁剪面与所述眼睛位置之间的距离。
在本实施例中,参见图8所示的裁剪面示意图,其中,图中的视锥体是上述内容介绍的目标视锥体validfrustum,近平面即为近裁剪面,远平面即为远裁剪面。为了有效降低发生z-fighting现象的可能性,首先确定远裁剪面与眼睛位置之间的距离l1以及近裁剪面与眼睛位置之间的距离l2,然后在确定场景中存在两个或两个以上的物体都在远近裁剪面内的情况下时,尽量降低距离l1与距离l2的比值,这样可以有效提高场景渲染时的z轴精度。
在渲染地图这类大规模的三维场景时,经验发现远裁剪面距离眼睛位置的距离是场景高度的10倍时,就基本是人眼对物体的分辨极限了,再远处的物体人眼已经分辨不清楚了,因此设置场景的远裁剪面最多是视野高度的10倍,其中,所述视野高度为眼睛位置与地面之间的垂直距离,因此,当人眼的视角为平视时,设置场景远裁剪面为视野高度的10倍,如图9所示的平视视角的场景示意图,此时,视锥体向上向量lookup的z值为1。
但是,如图10所示的俯视视角的场景示意图,当人眼的视角为俯视角时,远裁剪面会减小,此时视锥体向上向量lookup的z值会减小,可见,远裁剪面的大小与lookup的z值(简称为lookup.z)正相关;当人眼的视角为垂直向下时,即人眼方向与地面垂直时,视锥体向上向量lookup的z值为0。
基于以上内容,在本申请的一种实施方式中,可以按照以下方式确定远裁剪面与眼睛位置之间的距离即所述第一距离:根据所述目标视锥体向上向量的z值、视野高度确定所述第一距离,其中,所述视野高度为所述眼睛位置与地面之间的垂直距离。
在本实施方式中,具体可以按照以下公式计算远裁剪面与眼睛位置之间的距离ffar:
ffar=fheight*2/fz;
其中,fheight为视野高度;fz=max(0.2,(1-lookup.z)),lookup.z是所述目标视锥体向上向量的z值。
由于lookup.z的取值范围为[0,1],因此,fz的取值范围为[0.2,1],当fz=0.2时,ffar的取值就是人眼平视时的分辨极限对应的最远距离(即10倍视野高度)。
在本申请的一种实施方式中,所述第一距离与所述第二距离之间的比值可以为5。在本实施例中,由于人眼观察的景物均在场景的地面上,因此在设置了合理的远裁剪面后,近裁剪面可以适当拉远,即减小远裁剪面与眼睛位置的距离与近裁剪面与眼睛位置的距离之间的比值,在实际中,将远裁剪面与眼睛位置之间的距离ffar的1/5作为近裁剪面与眼睛位置之间的距离fnear,即fnear=ffar/5,可以实现较好的图像显示效果,降低了发生z-fighting现象的可能性。
综上,通过动态调节远近裁剪面与眼睛位置之间的距离,可以在渲染场景时使目标视锥体的z轴精度大大提高,从而有效避免了z-fighting现象
参见图11,为本申请实施例提供的一种阴影图的生成装置的组成示意图,该装置包括:
区域预划分单元1101,用于预先将至少一张shadowmap纹理划分为n个相同大小的纹理区域,其中,n≥2;
视锥体生成单元1102,用于生成以眼睛位置为视点的目标视锥体;
视锥体分割单元1103,用于将所述目标视锥体由近至远分割成n个子视锥体,其中,每个子视锥体的区域由近至远依次增大;
渲染参数生成单元1104,用于生成所述子视锥体的渲染参数,所述渲染参数包括视图矩阵和投影矩阵;
深度图渲染单元1105,用于根据所述子视锥体的渲染参数,在一个所述纹理区域内渲染所述子视锥体对应的场景物体,得到以光源位置为视点的场景深度图。
在本申请的一种实施方式中,所述装置还包括:
位置判断单元,用于判断所述子视锥体的位置相比于上一时刻是否发生变化;
深度图重生单元,用于若所述子视锥体的位置相比于上一时刻发生变化,则触发所述深度图渲染单元1105;
深度图保持单元,用于所述子视锥体的位置相比于上一时刻没有发生变化,则继续使用所述子视锥体在上一时刻对应的场景深度图。
在本申请的一种实施方式中,所述位置判断单元包括:
距离确定子单元,用于确定历史位置与当前位置之间的相互距离,其中,所述历史位置为上一时刻所述子视锥体的包围球中心的坐标,所述当前位置为当前时刻所述子视锥体的包围球中心的坐标;
阈值判断子单元,用于判断所述相互距离是否大于预设阈值;
位置确定子单元,用于若所述相互距离大于预设阈值,则确定所述子视锥体中的物体的当前位置相比于上一时刻发生变化;若所述相互距离是否小于或等于预设阈值,则确定所述子视锥体中的物体的当前位置相比于上一时刻未发生变化。
在本申请的一种实施方式中,所述装置还包括:
受背光面确定单元,用于确定目标物体的受光面和背光面,其中,所述目标物体为所述目标视锥体中的物体;
渐变颜色配置单元,用于为所述受光面与所述背光面的过渡区域配置渐变的光照颜色;
受光面颜色确定单元,用于根据所述受光面每一像素点接收的光照颜色,分别确定所述受光面每一像素点的颜色;
背光面颜色确定单元,用于根据所述背光面每一像素点接收的光照颜色,分别确定所述背光面每一像素点的颜色。
在本申请的一种实施方式中,所述受背光面确定单元包括:
点积计算子单元,用于计算所述目标物体表面每一像素点对应的点积,其中,所述点积为所述像素点的法线朝向与光源方向的点积;
光面确定子单元,用于若所述像素点对应的点积大于0,则确定所述像素点位于受光面;若所述像素点对应的点积等于0,则确定所述像素点位于受光面与背光面的交界处;若所述像素点对应的点积小于0,则确定所述像素点位于背光面。
在本申请的一种实施方式中,所述渐变颜色配置单元包括:
区间选取子单元,用于从点积取值范围[-1,1]内,选取一个取值区间[-x1,x2],其中,x1和x2均为正数且小于1;
区域选择子单元,用于从所述目标物体表面选择一个过渡区域,其中,所述过渡区域内每一像素点对应的点积在所述取值区间[-x1,x2]内;
颜色配置子单元,用于使所述过渡区域一侧接收的第一光照颜色向另一侧接收的第二光照颜色渐变,其中,所述第一光照颜色为除所述过渡区域以外的受光面接收的固定光照颜色,所述第二光照颜色为除所述过渡区域以外的背光面接收的固定光照颜色。
在本申请的一种实施方式中,所述受光面颜色确定单元包括:
阴影因子确定子单元,用于确定所述受光面中每一受光像素点对应的阴影因子,其中,所述阴影因子的大小与所述受光像素点所受的阴影遮蔽程度相关;
受光颜色确定子单元,用于根据所述受光像素点的本身纹理颜色、接收的光照颜色、环境本身颜色、所述阴影因子确定所述受光像素点的颜色。
在本申请的一种实施方式中,所述阴影因子确定子单元包括:
参考像素点选取模块,用于选取所述受光像素点周边的m个参考像素点,其中,m≥2;
像素点位置确定模块,用于利用所述场景深度图,确定所述受光像素点和所述参考像素点是否处于阴影中;
阴影因子确定模块,用于若均不在阴影中,则所述受光像素点的阴影因子取值为0;若存在m个像素点在阴影中,则根据所述m个像素点中的每一像素点对应的预设阴影值,确定所述受光像素点的阴影因子取值,其中,0<m≤m+1。
在本申请的一种实施方式中,所述背光面颜色确定单元,具体用于根据所述背光面中每一背光像素点的本身纹理颜色、接收的光照颜色、环境本身颜色,确定所述背光像素点的颜色。
在本申请的一种实施方式中,所述装置还包括:
比值降低单元,用于降低第一距离与第二距离之间的比值,其中,所述第一距离为所述远裁剪面与所述眼睛位置之间的距离,所述第二距离为所述近裁剪面与所述眼睛位置之间的距离。
在本申请的一种实施方式中,所述装置还包括:
距离确定单元,用于根据所述目标视锥体向上向量的z值、视野高度确定所述第一距离,其中,所述视野高度为所述眼睛位置与地面之间的垂直距离。
在本申请的一种实施方式中,所述第一距离与所述第二距离之间的比值为5。
本发明实施例还提供了一种阴影图的生成装置的硬件构成。可包括至少一个处理器(例如cpu),至少一个网络接口或者其他通信接口,存储器,和至少一个通信总线,用于实现这些装置之间的连接通信。处理器用于执行存储器中存储的可执行模块,例如计算机程序。存储器可能包含高速随机存取存储器(ram:randomaccessmemory),也可能还包括非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。通过至少一个网络接口(可以是有线或者无线)实现该系统网关与至少一个其他网元之间的通信连接,可以使用互联网,广域网,本地网,城域网等。
参见图12,在一些实施方式中,存储器中存储了程序指令,程序指令可以被处理器执行,其中,程序指令可包括区域预划分单元1101、视锥体生成单元1102、视锥体分割单元1103、渲染参数生成单元1104、深度图渲染单元1105等。各单元的具体实现可参见上述装置实施例所揭示的相应单元,这里不再赘述。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到上述实施例方法中的全部或部分步骤可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者诸如媒体网关等网络通信设备,等等)执行本申请各个实施例或者实施例的某些部分所述的方法。
需要说明的是,本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。