掌桥专利:专业的专利平台
掌桥专利
首页

光照计算方法、装置、计算机设备及计算机可读存储介质

文献发布时间:2023-06-19 11:39:06


光照计算方法、装置、计算机设备及计算机可读存储介质

技术领域

本申请涉及图像处理技术领域,特别是涉及一种光照计算方法、装置、计算机设备及计算机可读存储介质。

背景技术

近年来,图像处理技术不断发展,无论是用户还是开发人员,对于图像质量的要求越来越高,因此,为了提升计算机动画的品质,增强其真实感,基于环境的照明进行光照计算以及光照渲染已经成为图像处理中的关键点。

相关技术中,在进行光照渲染时,通常采用前向渲染的方式进行。前向渲染也叫正向渲染,是一种渲染物体的直接方式,在传统的前向渲染中,首先,确定场景中需要渲染的全部物体,在其中选取任意物体。随后,将选取的物体与场景中的全部灯光进行相交判断,确定在该物体上需要计算的灯光,并基于这些灯光对该物体进行光照计算,在计算完毕后再渲染下一个物体,直至完成全部物体的光照计算以及光照渲染。

在实现本申请的过程中,申请人发现相关技术至少存在以下问题:

场景中的物体有大有小,一个较大的物体可能受到多个小光源的影响,使得该物体的所有片元在计算时都需要计算到多个小光源,即使该小光源没有影响到该片元;而一个较小的物体即使只受到一个光源的影响,也需要按照片元进行很多次的相交运算,造成了大量的冗余计算,在复杂的场景中会产生严重的性能问题,给带宽带来较大的压力。

发明内容

有鉴于此,本申请提供了一种光照计算方法、装置、计算机设备及计算机可读存储介质,主要目的在于解决目前造成了大量的冗余计算,在复杂的场景中会产生严重的性能问题,给带宽带来较大的压力的问题。

依据本申请第一方面,提供了一种光照计算方法,该方法包括:

在预设维度对目标场景的视锥体进行划分,得到多个多面体;

判断所述多个多面体与所述目标场景中的多个光源的相对关系,根据判断结果,生成多个光源列表,所述多个光源列表中每个光源列表包括影响单个多面体或多面体集合的光源的光源索引和光源数量;

确定目标片元,在所述多个多面体中查询所述目标片元所属的目标多面体,所述目标片元是所述目标场景中任一实体模型的任意待渲染的片元;

基于所述目标多面体对应的目标光源列表对所述目标片元进行光照计算。

可选地,所述在预设维度对目标场景的视锥体进行划分,得到多个多面体,包括:

获取所述预设维度以及预设划分参数,确定所述预设维度指示的至少一个坐标方向以及所述至少一个坐标方向在所述预设划分参数中对应的子参数;

对于所述至少一个坐标方向中每个坐标方向,在所述坐标方向上将所述视锥体划分为所述坐标方向对应的子参数指示的份数;

分别在所述至少一个坐标方向上按照对应的子参数对所述视锥体进行划分,得到所述多个多面体。

可选地,所述判断所述多个多面体与所述目标场景中的多个光源的相对关系,根据判断结果,生成多个光源列表,包括:

对于所述多个多面体中每个多面体,读取所述多个光源中每个光源与所述多面体的相对关系,判断在所述相对关系下所述多个光源中每个光源的光束是否影响到所述多面体,输出所述每个光源对应的判断结果;

根据所述每个光源对应的判断结果,在所述多个光源中确定至少一个第一光源,所述至少一个第一光源对应的判断结果指示所述第一光源的光束影响所述多面体;

统计所述至少一个第一光源的光源数量,获取所述至少一个第一光源的光源索引,生成包括所述光源数量和所述光源索引的光源列表;

重复执行上述过程,分别为所述每个多面体生成包括影响所述多面体的光源的光源索引和光源数量的光源列表,得到所述多个光源列表;

将所述多个多面体与所述多个光源列表进行关联存储,其中,关联存储可以基于二层列表结构或三层列表结构实现。

可选地,所述读取所述多个光源中每个光源与所述多面体的相对关系,判断在所述相对关系下所述多个光源中每个光源的光束是否影响到所述多面体,输出所述每个光源对应的判断结果,包括:

对于所述多个光源中每个光源,读取所述光源与所述多面体的相对关系,对所述相对关系进行判断;

若所述相对关系指示所述光源的光束位于所述多面体的多个面中任意面的内侧,则判断确定所述光源影响所述多面体,输出用于指示所述光源影响所述多面体的判断结果,并继续对所述多个光源中其他光源在对应的相对关系下是否影响到所述多面体进行判断;

若所述相对关系指示所述光源的光束位于所述多个面中任意面的外侧,则判断确定所述光源不影响所述多面体,输出用于指示所述光源不影响所述多面体的判断结果,并继续对所述多个光源中其他光源在对应的相对关系下是否影响到所述多面体进行判断;

其中,所述内侧是所述任意面所在平面的垂直方向上的两侧中存在所述多个面中其他面的一侧,所述外侧是所述两侧中除所述内侧的另一侧。

可选地,所述读取所述多个光源中每个光源与所述多面体的相对关系,包括:

对于所述多个多面体中每个多面体,为所述多面体构建球型包围盒;

根据所述多个光源中每个光源与所述球型包围盒的相对位置,读取所述多个光源中每个光源与所述球型包围盒的相对关系作为所述每个光源与所述多面体的相对关系。

可选地,所述判断所述多个多面体与所述目标场景中的多个光源的相对关系,根据判断结果,生成多个光源列表,包括:

响应于合并生成请求,获取所述合并生成请求指示的合并个数;

按照所述多个多面体的排列方式,将所述多个多面体中连续的且数量满足所述合并个数的多面体进行合并,得到多个多面体集合;

对于所述多个多面体集合中每个多面体集合,读取所述多个光源中每个光源与所述多面体集合的相对关系,判断在所述相对关系下所述多个光源中每个光源是否影响到所述多面体集合,输出所述每个光源对应的判断结果;

根据所述每个光源对应的判断结果,在所述多个光源中确定至少一个第一光源,所述至少一个第一光源对应的判断结果指示所述第一光源影响所述多面体集合;

统计所述至少一个第一光源的光源数量,获取所述至少一个第一光源的光源索引,生成包括所述光源数量和所述光源索引的光源列表;

重复执行上述过程,分别为所述每个多面体集合生成包括影响所述多面体集合的光源的光源索引和光源数量的光源列表,得到所述多个光源列表;

将所述多个多面体集合与所述多个光源列表进行关联存储,其中,关联存储可以基于二层列表结构或三层列表结构实现。

可选地,所述读取所述多个光源中每个光源与所述多面体集合的相对关系,包括:

对于所述多个多面体集合中每个多面体集合,为所述多面体集合构建球型包围盒;

根据所述多个光源中每个光源与所述球型包围盒的相对位置,读取所述多个光源中每个光源与所述球型包围盒的相对关系作为所述每个光源与所述多面体集合的相对关系。

可选地,所述基于所述目标多面体对应的目标光源列表对所述目标片元进行光照计算,包括:

查询所述目标多面体绑定的光源列表;

响应于查询确定所述目标多面体存在绑定的光源列表,将所述目标多面体绑定的光源列表作为所述目标光源列表,采用所述目标光源列表包括的光源数量和光源索引对所述目标片元进行光照计算;

响应于查询确定所述目标多面体不存在绑定的光源列表,确定所述目标多面体所在的目标多面体集合,将所述目标多面体集合绑定的光源列表作为所述目标光源列表,采用所述目标光源列表包括的光源数量和光源索引对所述目标片元进行光照计算。

依据本申请第二方面,提供了一种光照计算装置,该装置包括:

划分模块,用于在预设维度对目标场景的视锥体进行划分,得到多个多面体;

生成模块,用于判断所述多个多面体与所述目标场景中的多个光源的相对关系,根据判断结果,生成多个光源列表,所述多个光源列表中每个光源列表包括影响单个多面体或多面体集合的光源的光源索引和光源数量;

查询模块,用于确定目标片元,在所述多个多面体中查询所述目标片元所属的目标多面体,所述目标片元是所述目标场景中任一实体模型的任意待渲染的片元;

计算模块,用于基于所述目标多面体对应的目标光源列表对所述目标片元进行光照计算。

可选地,所述划分模块,用于获取所述预设维度以及预设划分参数,确定所述预设维度指示的至少一个坐标方向以及所述至少一个坐标方向在所述预设划分参数中对应的子参数;对于所述至少一个坐标方向中每个坐标方向,在所述坐标方向上将所述视锥体划分为所述坐标方向对应的子参数指示的份数;分别在所述至少一个坐标方向上按照对应的子参数对所述视锥体进行划分,得到所述多个多面体。

可选地,所述生成模块,用于对于所述多个多面体中每个多面体,读取所述多个光源中每个光源与所述多面体的相对关系,判断在所述相对关系下所述多个光源中每个光源的光束是否影响到所述多面体,输出所述每个光源对应的判断结果;根据所述每个光源对应的判断结果,在所述多个光源中确定至少一个第一光源,所述至少一个第一光源对应的判断结果指示所述第一光源的光束影响所述多面体;统计所述至少一个第一光源的光源数量,获取所述至少一个第一光源的光源索引,生成包括所述光源数量和所述光源索引的光源列表;重复执行上述过程,分别为所述每个多面体生成包括影响所述多面体的光源的光源索引和光源数量的光源列表,得到所述多个光源列表;将所述多个多面体与所述多个光源列表进行关联存储,其中,关联存储可以基于二层列表结构或三层列表结构实现。

可选地,所述生成模块,用于对于所述多个光源中每个光源,读取所述光源与所述多面体的相对关系,对所述相对关系进行判断;若所述相对关系指示所述光源的光束位于所述多面体的多个面中任意面的内侧,则判断确定所述光源影响所述多面体,输出用于指示所述光源影响所述多面体的判断结果,并继续对所述多个光源中其他光源在对应的相对关系下是否影响到所述多面体进行判断;若所述相对关系指示所述光源的光束位于所述多个面中任意面的外侧,则判断确定所述光源不影响所述多面体,输出用于指示所述光源不影响所述多面体的判断结果,并继续对所述多个光源中其他光源在对应的相对关系下是否影响到所述多面体进行判断;其中,所述内侧是所述任意面所在平面的垂直方向上的两侧中存在所述多个面中其他面的一侧,所述外侧是所述两侧中除所述内侧的另一侧。

可选地,所述生成模块,用于对于所述多个多面体中每个多面体,为所述多面体构建球型包围盒;根据所述多个光源中每个光源与所述球型包围盒的相对位置,读取所述多个光源中每个光源与所述球型包围盒的相对关系作为所述每个光源与所述多面体的相对关系。

可选地,所述生成模块,用于响应于合并生成请求,获取所述合并生成请求指示的合并个数;按照所述多个多面体的排列方式,将所述多个多面体中连续的且数量满足所述合并个数的多面体进行合并,得到多个多面体集合;对于所述多个多面体集合中每个多面体集合,读取所述多个光源中每个光源与所述多面体集合的相对关系,判断在所述相对关系下所述多个光源中每个光源是否影响到所述多面体集合,输出所述每个光源对应的判断结果;根据所述每个光源对应的判断结果,在所述多个光源中确定至少一个第一光源,所述至少一个第一光源对应的判断结果指示所述第一光源影响所述多面体集合;统计所述至少一个第一光源的光源数量,获取所述至少一个第一光源的光源索引,生成包括所述光源数量和所述光源索引的光源列表;重复执行上述过程,分别为所述每个多面体集合生成包括影响所述多面体集合的光源的光源索引和光源数量的光源列表,得到所述多个光源列表;将所述多个多面体集合与所述多个光源列表进行关联存储,其中,关联存储可以基于二层列表结构或三层列表结构实现。

可选地,所述生成模块,用于对于所述多个多面体集合中每个多面体集合,为所述多面体集合构建球型包围盒;根据所述多个光源中每个光源与所述球型包围盒的相对位置,读取所述多个光源中每个光源与所述球型包围盒的相对关系作为所述每个光源与所述多面体集合的相对关系。

可选地,所述计算模块,用于查询所述目标多面体绑定的光源列表;响应于查询确定所述目标多面体存在绑定的光源列表,将所述目标多面体绑定的光源列表作为所述目标光源列表,采用所述目标光源列表包括的光源数量和光源索引对所述目标片元进行光照计算;响应于查询确定所述目标多面体不存在绑定的光源列表,确定所述目标多面体所在的目标多面体集合,将所述目标多面体集合绑定的光源列表作为所述目标光源列表,采用所述目标光源列表包括的光源数量和光源索引对所述目标片元进行光照计算。

依据本申请第三方面,提供了一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述第一方面所述方法中任一方法的步骤。

依据本申请第四方面,提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述第一方面中任一项所述的方法的步骤。

借由上述技术方案,本申请提供的一种光照计算方法、装置、计算机设备及计算机可读存储介质,本申请在预设维度对目标场景的视锥体进行划分,得到多个多面体,判断多个多面体与场景中光源的相对关系,根据判断结果生成包括有影响单个多面体或多个多面体的光源的光源索引和光源数量的光源列表,进而在对实体模型的片元进行光照计算时,使用片元所在的多面体对应的光源列表进行计算,利用临近像素分组的方式对场景的屏幕空间进行分组,并按照分组对场景中的光源进行剪裁,用剪裁后的光源对片元进行光照计算,避免片元的光照计算中涉及到未对该片元造成影响的光源,减轻了计算量,极大的降低了复杂场景中产生严重性能问题的可能性,缓解带宽压力。

上述说明仅是本申请技术方案的概述,为了能够更清楚了解本申请的技术手段,而可依照说明书的内容予以实施,并且为了让本申请的上述和其它目的、特征和优点能够更明显易懂,以下特举本申请的具体实施方式。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本申请的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:

图1示出了本申请实施例提供的一种光照计算方法流程示意图;

图2示出了本申请实施例提供的一种光照计算方法流程示意图;

图3示出了本申请实施例提供的一种光照计算装置的结构示意图;

图4示出了本申请实施例提供的一种计算机设备的装置结构示意图。

具体实施方式

下面将参照附图更详细地描述本申请的示例性实施例。虽然附图中显示了本申请的示例性实施例,然而应当理解,可以以各种形式实现本申请而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本申请,并且能够将本申请的范围完整的传达给本领域的技术人员。

本申请实施例提供了一种光照计算方法,如图1所示,该方法包括:

101、在预设维度对目标场景的视锥体进行划分,得到多个多面体。

102、判断多个多面体与目标场景中的多个光源的相对关系,根据判断结果,生成多个光源列表,多个光源列表中每个光源列表包括影响单个多面体或多面体集合的光源的光源索引和光源数量。

103、确定目标片元,在多个多面体中查询目标片元所属的目标多面体,目标片元是目标场景中任一实体模型的任意待渲染的片元。

104、基于目标多面体对应的目标光源列表对目标片元进行光照计算。

本申请实施例提供的方法,在预设维度对目标场景的视锥体进行划分,得到多个多面体,判断多个多面体与场景中光源的相对关系,根据判断结果生成包括有影响单个多面体或多个多面体的光源的光源索引和光源数量的光源列表,进而在对实体模型的片元进行光照计算时,使用片元所在的多面体对应的光源列表进行计算,利用临近像素分组的方式对场景的屏幕空间进行分组,并按照分组对场景中的光源进行剪裁,用剪裁后的光源对片元进行光照计算,避免片元的光照计算中涉及到未对该片元造成影响的光源,减轻了计算量,极大的降低了复杂场景中产生严重性能问题的可能性,缓解带宽压力。

本申请实施例提供了一种光照计算方法,如图2所示,该方法包括:

201、在预设维度对目标场景的视锥体进行划分,得到多个多面体。

在目前的图像处理技术领域中,前向渲染是一种常用的光照渲染方式,前向渲染也叫正向渲染,通过把场景中需要绘制的每个实体模型与场景中的光源进行相交判断,确定每个实体模型渲染时需要计算的光源,进而分别对每个实体模型进行渲染。但是申请人认识到,传统的前向渲染存在两个弊端,一个是场景中较大的实体模型会受到很多个小的光源的影响,比如实体模型甲受到N(N为正整数)个小的光源的影响,实体模型甲的所有片元在计算时都需要计算N个小的光源,即使这个片元实际上并没有受到其中某一个小的光源的影响,造成冗余计算。另一个是场景中较小的实体模型可能只受到一个大的光源的影响,但是需要分别对这些小的实体模型进行多次的相交运算,计算的复杂程度与场景的复杂度密切相关。这些弊端在场景光源数量不多时造成的影响并不明显,但是如果光源数量很大,就会带来严重的性能问题。

现在还有一种延迟渲染也能用于实体模型的光照计算,在延迟渲染中需要对每个光源进行光栅化,得到实体模型中受到该光源影响的片元,进而对这些片元进行光照计算。这种渲染方式的优点在于与场景的复杂度无关,不会有冗余计算。但是申请人认识到,延迟渲染中每次进行光照计算都需要读取和写入G-Buffer(Geometry Buffer,几何缓冲),在光源较多时会造成很大的带宽压力,该压力会在终端设备的性能上体现。

因此,为了使光照计算的复杂程度能够与场景的复杂度解耦,解决冗余计算的问题,缓解带宽压力,本申请提出了一种光照计算的方法,在预设维度对指示了目标场景的屏幕空间的视锥体进行划分,得到多个多面体,根据多个多面体与场景中光源的交互情况,生成包括有影响单个多面体或多面体集合的光源的光源索引和光源数量的光源列表,进而在对实体模型的片元进行光照计算时,使用片元所在的多面体对应的光源列表进行计算,利用临近像素分组的方式对场景的屏幕空间进行分组,后续按照分组对场景中的光源进行剪裁,用剪裁后的光源对片元进行光照计算,避免片元的光照计算中涉及到未对该片元造成影响的光源,减轻了计算量,极大的降低了复杂场景中产生严重性能问题的可能性,缓解带宽压力。

而为了实现本申请,首先需要在预设维度对目标场景的视锥体进行划分,得到多个多面体。由于视锥体指示了场景的屏幕空间,能够表现出场景中可见的椎体范围,因此,对视锥体的划分实际上是利用临近像素分组的方式对场景的屏幕空间进行分组,得到的多个多面体也即视锥体两个截平面之间的三维空间。多面体可以用Cluster(集合)表示,通常为六面体。下面对视锥体进行划分得到多面体的过程进行描述:

首先,获取预设维度以及预设划分参数,确定预设维度指示的至少一个坐标方向以及至少一个坐标方向在预设划分参数中对应的子参数。其中,预设维度可以是三维空间的X、Y、Z方向,这样,指示的至少一个坐标方向即为三维空间的X、Y、Z方向。预设划分参数包括至少一个坐标方向对应的子参数,子参数指示了在相应坐标方向上对视锥体的划分份数。例如,预设划分参数可以为32*16*32,32、16、32也即预设划分参数包括的子参数,32、16、32分别指示了在三维空间中X、Y、Z方向上对视锥体切分的份数。需要说明的是,该预设划分参数实际上可以根据场景的复杂程度、计算速度或者粒度的要求等自行设置,假设目前的预设划分参数为32*16*32,而为了提升性能,可以适当牺牲剪裁精度,将预设划分参数降低到16*8*32。

随后,对于至少一个坐标方向中每个坐标方向,在坐标方向上将视锥体划分为坐标方向对应的子参数指示的份数,并重复执行划分的过程,分别在至少一个坐标方向上按照对应的子参数对视锥体进行划分,得到多个多面体。需要说明的是,有时预设划分参数可能仅是一个具体的数值,比如32,这样,在X、Y、Z方向分别将视锥体划分为32份即可。而有时预设划分参数可能是诸如上述32*16*32的形式,包括多个子参数,这样,按照子参数在相应的坐标方向上进行划分即可。本申请对预设划分参数指示的数值内容不进行具体限定。

202、判断多个多面体与目标场景中的多个光源的相对关系,根据判断结果,生成多个光源列表。

在本申请实施例中,由于屏幕空间中相邻的像素很可能受同一个光源的影响,因此,在得到了多个多面体后,可以根据每一个多面体对光源进行裁剪,得到影响该多面体的光源列表,以便后续在对某个实体模型的片元进行光照计算时,能够直接使用该片元所在多面体的光源列表进行光照计算。需要说明的是,目前存在一些能够用于动画创作以及运营的工具,比如Unity(一种实时3D互动内容创作和运营平台),因此,实际上可以基于工具,为多个多面体中每个多面体设置对应的处理线程,运行多个多面体对应的处理线程,进而基于多个处理线程,并行判断多个多面体与多个光源的相对关系,根据判断结果为每个多面体生成包括影响多面体的光源的光源索引和光源数量的光源列表,得到多个光源列表,下面对生成光源列表的具体逻辑过程进行描述:

对于多个多面体中每个多面体,首先,读取多个光源中每个光源与多面体的相对关系,判断在相对关系下多个光源中每个光源的光束是否影响到多面体,输出每个光源对应的判断结果。其中,由于多面体对应有处理线程,因此,可以基于处理线程读取多个光源中每个光源与多面体的相对关系,该相对关系实际上指示了光源是否会与多面体相交,在后续通过对相对关系进行判断,输出判断结果,基于该判断结果便可确定光源发生的光束是否会影响到多面体。具体地,对于多个光源中每个光源,读取光源与多面体的相对关系,对相对关系进行判断,若相对关系指示光源的光束位于多面体的多个面中任意面的内侧,内侧是任意面所在平面的垂直方向上的两侧中存在多个面中其他面的一侧,也就是说,任意面的内侧还存在该多面体的其他面,则判断确定光源影响多面体,输出用于指示光源影响多面体的判断结果,并继续对多个光源中其他光源在对应的相对关系下是否影响到多面体进行判断。而相反,若相对关系指示光源的光束位于多个面中任意面的外侧,外侧是两侧中除内侧的另一侧,则判断确定光源不影响多面体,可以将光源过滤,输出用于指示光源不影响多面体的判断结果,并继续对多个光源中其他光源在对应的相对关系下是否影响到多面体进行判断。也就是说,实际上用相对关系判断光源的光束是否穿过多面体或者是否与多面体的任何一个面发生了交互,以此来确定该光源是否影响到了多面体。

需要说明的是,为了简化多面体与光源之间的交互计算,上述读取光源与多面体的相对关系的过程中还可以用球型包围盒代替多面体,也即为多面体构建球型包围盒,根据多个光源中每个光源与球型包围盒的相对位置,读取多个光源中每个光源与球型包围盒的相对关系作为每个光源与多面体的相对关系,在后续对确定的相对关系进行判断输出判断结果。其中,利用球型包围盒读取相对关系的过程也可以基于多面体对应的处理线程实现,直接基于一个球面便实现了光源列表的生成,提升了性能。

通过对相对关系的判断输出判断结果后,先根据每个光源对应的判断结果,在多个光源中确定至少一个第一光源,其中,至少一个第一光源对应的判断结果指示第一光源的光束影响多面体。随后,统计至少一个第一光源的光源数量,获取至少一个第一光源的光源索引,生成包括光源数量和光源索引的光源列表。

上面描述的过程是为某一个多面体生成该多面体对应的光源列表的过程,通过重复执行上述过程,可以为每一个多面体生成对应的光源列表。而在实际应用的过程中,为了减少光源遍历次数,可以将几个多面体进行合并处理,采用粗粒度剔除的方法提升计算效率,具体将多面体合并处理的过程如下:

响应于合并生成请求,首先,获取合并生成请求指示的合并个数,该合并个数指示了将多少个多面体进行合并计算。随后,按照多个多面体的排列方式,将多个多面体中连续的且数量满足合并个数的多面体进行合并,得到多个多面体集合。对于多个多面体集合中每个多面体集合,读取多个光源中每个光源与多面体集合的相对关系,判断在相对关系下多个光源中每个光源是否影响到多面体集合,输出每个光源对应的判断结果。根据每个光源对应的判断结果,在多个光源中确定至少一个第一光源,至少一个第一光源对应的判断结果指示第一光源影响多面体集合,并统计至少一个第一光源的光源数量,获取至少一个第一光源的光源索引,生成包括光源数量和光源索引的光源列表。通过重复执行上述过程,便可以分别为每个多面体集合生成包括影响多面体集合的光源的光源索引和光源数量的光源列表,得到多个光源列表。其中,生成光源列表的过程与上述针对一个多面体生成光源列表的过程一致,也可以通过对多面体集合的外表面与光源之间的相对关系进行判断确定光源是否与多面体集合发生交互,或者还可以为该多面体集合构建球型包围盒,根据多个光源中每个光源与球型包围盒的相对位置,读取多个光源中每个光源与球型包围盒的相对关系作为每个光源与多面体集合的相对关系,进而利用球型包围盒读取光源与多面体集合的相对关系,以便确定哪些光源与多面体集合发生交互,此处不再进行赘述。通过重复执行上述的过程,便可以为每一个多面体集合生成光源列表。

再有,实际应用中可以分别为多个多面体集合中每个多面体集合设置对应的处理线程,运行多个多面体集合对应的处理线程,基于多个多面体集合对应的处理线程,并行判断多个多面体集合与多个光源的相对关系,根据判断结果为每个多面体集合生成包括影响多面体集合的光源的光源索引和光源数量的光源列表,得到多个光源列表。

实际上对多面体进行合并的过程也就是将多个相邻的多面体合成一个大的多面体统一计算的过程,比如假设目前划分得到的多面体均是小六边体,合并个数为5,则将相邻的5个小六面体合为一个大的六面体,并以该大的六面体为基础确定哪些光源是影响该大的六面体的光源,为大的六面体生成光源列表。

综上,本申请实施例中实际上是可以采用两种方式生成光源列表的,一种是针对单个多面体生成光源列表,另一种是针对多个多面体组成的多面体集合生成光源列表,因此,本申请中的光源列表实际上包括影响单个多面体或多面体集合的光源的光源索引和光源数量。

而无论是采用哪种方式生成光源列表,生成的光源列表都不止一个,每个光源列表都有针对的单个多面体或者多面体集合,因此,为了明确单个多面体或多面体集合与光源列表之间的关联关系,便于光源列表准确应用到后续的光照计算过程中,在本申请实施例中,会将单个多面体或者多面体集合与其对应的光源列表进行关联存储,具体关联存储可以基于二层列表结构或三层列表结构实现。如果采用二层列表结构进行存储,则其中一层表结构可为Light List(光源列表),用于存储现有的多个光源列表包括的全部内容,另一层可为Light Grid(光栅),用于存储每个单个多面体或者每个多面体集合以及其对应的光源索引和光源数量。而如果采用三层列表结构进行存储,则其中一层表结构可为LightList,用于存储现有的多个光源列表包括的全部内容,还有一层可为Light Grid,用于存储每个单个多面体或者每个多面体集合在Light List中的开始位置和结束位置,再有一层表结构可为Light Index List(光源索引列表),用于存储每个单个多面体或者每个多面体集合对应的光源索引。本申请对采用哪种方式存储多个光源列表不进行具体限定。另外,由于这些列表都需要在终端中应用的,因此,在终端中按照列表结构存储多个光源列表时,可以采用Struct Buffer(结构缓冲区)和Textrue(连续存储)两种方式,具体可以根据终端操作系统的情况进行选取,本申请不进行具体限定。

进一步地,上面提及能够使用诸如Unity等工具实现整个光源列表的生成过程,但是有些工具可能不具备这一功能,而诸如Unity的LWRP(Light Weight Render Pipeline,渲染管线)有很强的可定制性,因此,能够通过对LWRP的修改,在LWRP的前向渲染中增加生成光源列表的功能。需要注意的是,在基于工具生成光源列表时,要将前向渲染中的默认剪裁方式关闭,且取消默认的光源设置,之后再开始光源列表的生成。具体地,可以基于工具的Compute Shader(计算着色器)为每个多面体分配处理线程,实现并行生成光源列表。具体地,Compute Shader中num_threads(线程数)可以适当增大,从而提升处理速度。或者也可以基于工具中封装有多线程操作的Job system(工作系统),将为生成光源列表的任务加入到执行队列中,由引擎负责调度、资源竞争处理、多线程分配等工作,本申请对如何基于工具实现光源列表的生成不进行具体限定。

203、确定目标片元,在多个多面体中查询目标片元所属的目标多面体。

在本申请实施例中,生成了多个光源列表后,可以开始基于这些光源列表对目标场景中的实体模型进行光照计算。具体地,可以确定目标片元,在多个多面体中查询目标片元所属的目标多面体,目标片元是目标场景中任一实体模型的任意待渲染的片元,由于每个多面体实际上都指示了部分屏幕空间,因此,可以直接通过对目标场景的查看来确定目标片元位于哪部分屏幕空间中,进而确定目标多面体。

204、基于目标多面体对应的目标光源列表对目标片元进行光照计算。

在本申请实施例中,确定了目标多面体后,基于目标多面体对应的目标光源列表对目标片元进行光照计算。其中,由于上面过程描述了光源列表实际上可以根据单个多面体或者多面体集合生成,因此,需要先查询目标多面体绑定的光源列表,判断该目标多面体是否存在为其单独生成的光源列表。进一步地,响应于查询确定目标多面体存在绑定的光源列表,将目标多面体绑定的光源列表作为目标光源列表,采用目标光源列表包括的光源数量和光源索引对目标片元进行光照计算,也即用单独为该目标多面体生成的光源列表对目标片元进行光照计算。而响应于查询确定目标多面体不存在绑定的光源列表,确定目标多面体所在的目标多面体集合,将目标多面体集合绑定的光源列表作为目标光源列表,采用目标光源列表包括的光源数量和光源索引对目标片元进行光照计算,也即确定该目标多面体属于哪个多面体集合,用该多面体集合的光源列表对目标片元进行光照计算。

需要说明的是,如果目标场景中的光源没有发生改变,则可以持续采用上述生成的光源列表对目标场景中实体模型的片元进行光照计算。如果目标场景中增加了实体模型,但是没有发生光源的改变,则也可以持续采用上述生成的光源列表对目标场景中的实体模型的片元进行光照计算,无需对光源列表进行更新。而如果目标场景中增加了光源或者减少了光源,则需要重新执行上述步骤201至步骤202中的过程生成新的光源列表,并基于新的光源列表对目标场景中实体模型的片元进行光照计算。

本申请实施例提供的方法,在预设维度对目标场景的视锥体进行划分,得到多个多面体,判断多个多面体与场景中光源的相对关系,根据判断结果生成包括有影响单个多面体或多个多面体的光源的光源索引和光源数量的光源列表,进而在对实体模型的片元进行光照计算时,使用片元所在的多面体对应的光源列表进行计算,利用临近像素分组的方式对场景的屏幕空间进行分组,并按照分组对场景中的光源进行剪裁,用剪裁后的光源对片元进行光照计算,避免片元的光照计算中涉及到未对该片元造成影响的光源,减轻了计算量,极大的降低了复杂场景中产生严重性能问题的可能性,缓解带宽压力。

进一步地,作为图1所述方法的具体实现,本申请实施例提供了一种光照计算装置,如图3所示,所述装置包括:划分模块301,生成模块302,查询模块303和计算模块304。

该划分模块301,用于在预设维度对目标场景的视锥体进行划分,得到多个多面体;

该生成模块302,用于判断所述多个多面体与所述目标场景中的多个光源的相对关系,根据判断结果,生成多个光源列表,所述多个光源列表中每个光源列表包括影响单个多面体或多面体集合的光源的光源索引和光源数量;

该查询模块303,用于确定目标片元,在所述多个多面体中查询所述目标片元所属的目标多面体,所述目标片元是所述目标场景中任一实体模型的任意待渲染的片元;

该计算模块304,用于基于所述目标多面体对应的目标光源列表对所述目标片元进行光照计算。

在具体的应用场景中,该划分模块301,用于获取所述预设维度以及预设划分参数,确定所述预设维度指示的至少一个坐标方向以及所述至少一个坐标方向在所述预设划分参数中对应的子参数;对于所述至少一个坐标方向中每个坐标方向,在所述坐标方向上将所述视锥体划分为所述坐标方向对应的子参数指示的份数;分别在所述至少一个坐标方向上按照对应的子参数对所述视锥体进行划分,得到所述多个多面体。

在具体的应用场景中,该生成模块302,用于对于所述多个多面体中每个多面体,读取所述多个光源中每个光源与所述多面体的相对关系,判断在所述相对关系下所述多个光源中每个光源的光束是否影响到所述多面体,输出所述每个光源对应的判断结果;根据所述每个光源对应的判断结果,在所述多个光源中确定至少一个第一光源,所述至少一个第一光源对应的判断结果指示所述第一光源的光束影响所述多面体;统计所述至少一个第一光源的光源数量,获取所述至少一个第一光源的光源索引,生成包括所述光源数量和所述光源索引的光源列表;重复执行上述过程,分别为所述每个多面体生成包括影响所述多面体的光源的光源索引和光源数量的光源列表,得到所述多个光源列表;将所述多个多面体与所述多个光源列表进行关联存储,其中,关联存储可以基于二层列表结构或三层列表结构实现。

在具体的应用场景中,该生成模块302,用于对于所述多个光源中每个光源,读取所述光源与所述多面体的相对关系,对所述相对关系进行判断;若所述相对关系指示所述光源的光束位于所述多面体的多个面中任意面的内侧,则判断确定所述光源影响所述多面体,输出用于指示所述光源影响所述多面体的判断结果,并继续对所述多个光源中其他光源在对应的相对关系下是否影响到所述多面体进行判断;若所述相对关系指示所述光源的光束位于所述多个面中任意面的外侧,则判断确定所述光源不影响所述多面体,输出用于指示所述光源不影响所述多面体的判断结果,并继续对所述多个光源中其他光源在对应的相对关系下是否影响到所述多面体进行判断;其中,所述内侧是所述任意面所在平面的垂直方向上的两侧中存在所述多个面中其他面的一侧,所述外侧是所述两侧中除所述内侧的另一侧。

在具体的应用场景中,该生成模块302,用于对于所述多个多面体中每个多面体,为所述多面体构建球型包围盒;根据所述多个光源中每个光源与所述球型包围盒的相对位置,读取所述多个光源中每个光源与所述球型包围盒的相对关系作为所述每个光源与所述多面体的相对关系。

在具体的应用场景中,该生成模块302,用于响应于合并生成请求,获取所述合并生成请求指示的合并个数;按照所述多个多面体的排列方式,将所述多个多面体中连续的且数量满足所述合并个数的多面体进行合并,得到多个多面体集合;对于所述多个多面体集合中每个多面体集合,读取所述多个光源中每个光源与所述多面体集合的相对关系,判断在所述相对关系下所述多个光源中每个光源是否影响到所述多面体集合,输出所述每个光源对应的判断结果;根据所述每个光源对应的判断结果,在所述多个光源中确定至少一个第一光源,所述至少一个第一光源对应的判断结果指示所述第一光源影响所述多面体集合;统计所述至少一个第一光源的光源数量,获取所述至少一个第一光源的光源索引,生成包括所述光源数量和所述光源索引的光源列表;重复执行上述过程,分别为所述每个多面体集合生成包括影响所述多面体集合的光源的光源索引和光源数量的光源列表,得到所述多个光源列表;将所述多个多面体集合与所述多个光源列表进行关联存储,其中,关联存储可以基于二层列表结构或三层列表结构实现。

在具体的应用场景中,该生成模块302,用于对于所述多个多面体集合中每个多面体集合,为所述多面体集合构建球型包围盒;根据所述多个光源中每个光源与所述球型包围盒的相对位置,读取所述多个光源中每个光源与所述球型包围盒的相对关系作为所述每个光源与所述多面体集合的相对关系。

在具体的应用场景中,该计算模块304,用于查询所述目标多面体绑定的光源列表;响应于查询确定所述目标多面体存在绑定的光源列表,将所述目标多面体绑定的光源列表作为所述目标光源列表,采用所述目标光源列表包括的光源数量和光源索引对所述目标片元进行光照计算;响应于查询确定所述目标多面体不存在绑定的光源列表,确定所述目标多面体所在的目标多面体集合,将所述目标多面体集合绑定的光源列表作为所述目标光源列表,采用所述目标光源列表包括的光源数量和光源索引对所述目标片元进行光照计算。

本申请实施例提供的装置,在预设维度对目标场景的视锥体进行划分,得到多个多面体,判断多个多面体与场景中光源的相对关系,根据判断结果生成包括有影响单个多面体或多个多面体的光源的光源索引和光源数量的光源列表,进而在对实体模型的片元进行光照计算时,使用片元所在的多面体对应的光源列表进行计算,利用临近像素分组的方式对场景的屏幕空间进行分组,并按照分组对场景中的光源进行剪裁,用剪裁后的光源对片元进行光照计算,避免片元的光照计算中涉及到未对该片元造成影响的光源,减轻了计算量,极大的降低了复杂场景中产生严重性能问题的可能性,缓解带宽压力。

需要说明的是,本申请实施例提供的一种光照计算装置所涉及各功能单元的其他相应描述,可以参考图1和图2中的对应描述,在此不再赘述。

在示例性实施例中,参见图4,还提供了一种设备,该设备包括通信总线、处理器、存储器和通信接口,还可以包括输入输出接口和显示设备,其中,各个功能单元之间可以通过总线完成相互间的通信。该存储器存储有计算机程序,处理器,用于执行存储器上所存放的程序,执行上述实施例中的光照计算方法。

一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现所述的光照计算方法的步骤。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本申请可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施场景所述的方法。

本领域技术人员可以理解附图只是一个优选实施场景的示意图,附图中的模块或流程并不一定是实施本申请所必须的。

本领域技术人员可以理解实施场景中的装置中的模块可以按照实施场景描述进行分布于实施场景的装置中,也可以进行相应变化位于不同于本实施场景的一个或多个装置中。上述实施场景的模块可以合并为一个模块,也可以进一步拆分成多个子模块。

上述本申请序号仅仅为了描述,不代表实施场景的优劣。

以上公开的仅为本申请的几个具体实施场景,但是,本申请并非局限于此,任何本领域的技术人员能思之的变化都应落入本申请的保护范围。

相关技术
  • 光照计算方法、装置、计算机设备及计算机可读存储介质
  • 佣金计算方法、平台、计算机设备及计算机可读存储介质
技术分类

06120113006506