一种阴影渲染方法与流程

文档序号:12273144阅读:690来源:国知局

本发明涉及三维场景渲染技术,特别是涉及一种阴影渲染方法。



背景技术:

目前,在三维场景渲染应用中,为了增加场景渲染的逼真效果,通常都会使用相关实时阴影技术来为场景中的渲染对象渲染阴影。例如,游戏场景的渲染中,为了增强游戏的显示效果,通常都会使用相关实时阴影技术来为场景中运动的游戏对象渲染阴影。

现有的阴影渲染方案中,通常是在光源位置处先渲染出一张场景的深度图,然后再在相机处对整个场景进行渲染,并与之前渲染的深度图进行比较,得到场景的阴影效果。但是对于室内的点光源来说,由于阴影的投射需要朝向光源周围的所有方向,所以需要将光源周围的所有深度信息都投射到深度纹理中。针对该情景,一般的做法是创建一个立方体纹理(CubeMap),然后在点光源处朝着点光源的6个方向构建6个投影矩阵,将每个方向上的场景都渲染到CubeMap中对应方向的深度纹理中,以供下一个通道的渲染使用。

上述传统的阴影渲染方法,对于室内点光源阴影的渲染场景,将光源周围的深度信息渲染到一个CubeMap上需要使用6张阴影纹理,这样,就会占用较大显存空间,影响渲染效率,尤其是在低端机上会产生很多效率问题。



技术实现要素:

有鉴于此,本发明的主要目的在于提供一种阴影渲染方法,该方法可以提高室内点光源阴影的渲染效率。

为了达到上述目的,本发明提出的技术方案为:

一种阴影渲染方法,包括:

将六个光源方向分成N组,将所述N组光源方向的深度信息分别渲染到N张阴影纹理中;所述六个光源方向与三维空间坐标轴的六个方向相同;1≤N≤3;

对于待渲染对象的每个像素,根据该像素所在位置对应的光源方向,确定该像素的深度信息所在的阴影纹理以及在阴影纹理中的位置;根据所述位置从所确定出的阴影纹理上采样,得到该像素的深度信息;

根据所述像素的深度信息,确定所述待渲染对象的阴影并进行相应的渲染。

综上所述,本发明提出的阴影渲染方法,通过将多个方向的深度信息渲染到同一张阴影纹理的方式,减少深度纹理的使用数量,从而可以大幅度减少显存空间的占用,从而可以在保证渲染效果的前提下,提高室内点光源阴影的渲染效率。

附图说明

图1为本发明实施例的流程示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明作进一步地详细描述。

本发明的核心思想是:通过将多个方向的深度信息渲染到同一张阴影纹理的方式,减少深度纹理的使用数量,在保证渲染效果的前提下,提高室内点光源阴影的渲染效率。

图1为本发明实施例的流程示意图,如图1所示,该实施例实现的阴影渲染方法主要包括:

步骤101、将六个光源方向分成N组,将所述N组光源方向的深度信息分别渲染到N张阴影纹理中;所述六个光源方向与三维空间坐标轴的六个方向相同;1≤N≤3。

本步骤中,需要将六个光源方向进行分组,然后将N组光源方向的深度信息分别渲染到N张阴影纹理中,也就是将同一组光源方向的深度信息渲染到一张阴影纹理中,不同组光源方向的深度信息渲染到不同的阴影纹理中。如此,通过将多个光源方向的深度信息渲染到一张阴影纹理中,可以减少所使用的阴影纹理的数量,相应的可以减少显存空间的开销,从而可以大幅度提高室内点光源阴影渲染效率,避免传统方案中需要每个光源方向各使用一张阴影纹理所存在的渲染效率低的问题。

在实际应用中,本领域技术人员可以根据实际需要来确定光源方向的分组数N的值。较佳地,可以将光源方向分成2组,即N=2。

较佳地,当N=2时,可以采用四个光源方向组成一组,另两个光源方向组成另一一组的方式将六个光源方向分成两组,即从六个光源方向中选择出四个光源方向,将所选择出的四个光源方向划分为一组,将未被选择的两个光源方向划分为另一组。进一步地,基于该分组方式,可以采用下述方法将六个光源方向分成两组:

对于每个述光源方向,将该光源方向的序号与4相除,将相除结果取整后加1作为该光源方向所在组的序号。

上述方法仅是一用于确定各光源方向所属组的具体示例,该方法易于实现,在实际应用中,并不限于此。

较佳地,可以采用下述方法将所述N组光源方向的深度信息分别渲染到N张阴影纹理中:

步骤x1、对于每组光源方向,根据阴影纹理的序号与该组光源方向的组序号相同的原则,确定该组光源方向的深度信息需要渲染至的阴影纹理。

步骤x1用于来确定各光源方向的深度信息需要渲染到哪张阴影纹理上,利用本步骤,根据光源方向所在组的序号确定阴影纹理的序号,可以确保同一组光源方向的深度信息渲染到一张阴影纹理中,不同组光源方向的深度信息渲染到不同的阴影纹理中。

步骤x2、对于每组光源方向,根据预设的纹理高度TexHeight和纹理宽度TexWidth,按照Pi=OffsetArray[i]*(TexHeight,TexWidth),计算其中每个光源方向的深度信息在需要渲染至的阴影纹理中的位置Pi,并按照所计算出的位置Pi将对应光源方向的深度信息渲染至对应的阴影纹理中。

其中,OffsetArray[i]为光源方向在阴影纹理中对应的纹理坐标偏移量,i=Index%k,%表示求余运算,Index为光源方向的序号,k为一组光源方向中光源方向数量的最大值。

这里需要说明的是,由于是将一组光源方向的深度信息即多个光源方向的深度信息渲染到一张阴影纹理中,因此,一张阴影需要分成与一组中光源方向数量相同的若干部分,每个光源方向将对应其中的一部分,用于渲染本光源方向的深度信息。上述OffsetArray[i]为光源方向在阴影纹理中对应的纹理坐标偏移量,即光源方向在阴影纹理中对应部分的坐标偏移量,基于此,即可计算出光源方向的深度信息在需要渲染至的阴影纹理中的位置Pi,从而可以将光源方向的深度信息渲染至对应部分的阴影纹理中。

较佳地,当采用上述将六个光源方向分成2组,并且按照光源方向的序号与4相除取整加1作为光源方向所在组的序号时,可以采用下述方法将所述N组光源方向的深度信息分别渲染到N张阴影纹理中:

步骤b1、按照textureIndex=int(Index/4)+1,确定每个所述光源方向的深度信息需要渲染至的阴影纹理,其中,Index为光源方向的序号,textureIndex为所确定出的阴影纹理的序号,int()为取整函数。

步骤b2、按照Pi=OffsetArray[i]*(TexHeight,TexWidth),计算其中每个光源方向的深度信息在需要渲染至的阴影纹理中的位置Pi,并按照所计算出的位置Pi将对应光源方向的深度信息渲染至对应的阴影纹理中。

其中,OffsetArray[i]为光源方向在阴影纹理中对应的纹理坐标偏移量,i=Index%4,%为求余运算,Index为光源方向的序号,OffsetArray[0]=(0,0),OffsetArray[1]=(0.5,0),OffsetArray[2]=(0,0.5),OffsetArray[3]=(0.5,0.5)。

步骤102、对于待渲染对象的每个像素,根据该像素所在位置对应的光源方向,确定该像素的深度信息所在的阴影纹理以及在阴影纹理中的位置;根据所述位置从所确定出的阴影纹理上采样,得到该像素的深度信息。

本步骤中,将从步骤101中得到的阴影纹理中,采样得到待渲染对象的每个像素当前位置对应光源方向的深度信息,以便在步骤103中利用所获得的各像素的深度信息实现对待渲染对象的阴影的渲染。

这里,对每个像素的深度信息进行采样时,需要根据像素所在位置对应的光源方向确定深度信息所在的阴影纹理以及在其中的位置,以便从中采样得到像素的深度信息。

较佳地,可以采用下述方法确定每个像素的深度信息所在的阴影纹理以及在阴影纹理中的位置:

按照t=int(r/4)+1,确定像素的深度信息所在的阴影纹理,其中,r为像素所在位置对应的光源方向的序号,t为像素的深度信息所在的阴影纹理的序号,int()为取整函数。

按照Qs=OffsetArray[s]+0.5*(u,v),计算像素的深度信息在阴影纹理中的位置Qs,其中,(u,v)为像素的原始纹理坐标,OffsetArray[s]为光源方向r在阴影纹理中对应的纹理坐标偏移量,s=r%4,%表示求余运算。

步骤103、根据所述像素的深度信息,确定所述待渲染对象的阴影并进行相应的渲染。

综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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