场景渲染方法、装置、计算机可读存储介质和计算机设备转让专利

申请号 : CN201911168110.8

文献号 : CN111105491B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘电屈禹呈

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本申请涉及一种场景渲染方法、装置、计算机可读存储介质和计算机设备,所述方法包括:加载场景渲染所需的每个物体对应的多层级三维模型和模型贴图;符合投射条件的三维模型所对应模型贴图投射了第一目标层级三维模型的光影数据;确定位于虚拟摄像机拍摄范围内的每个物体与所述虚拟摄像机的距离;根据所述距离确定相应物体在目标页面的显示层级;基于所述显示层级的三维模型及对应模型贴图在目标页面渲染相应物体。本申请提供的方案可以在增大视距范围且保证虚拟场景加载速度的情况下提升虚拟场景渲染效果。

权利要求 :

1.一种场景渲染方法,包括:

加载场景渲染所需的每个物体对应的多层级三维模型和模型贴图;符合投射条件的三维模型包括合并模型;所述合并模型所对应模型贴图投射了相应物体组合中各物体的第一目标层级单体模型的光影数据;投射的所述光影数据,是触发在所述物体组合对应的包裹体上向所述物体组合中的物体对应的碰撞体发射射线后,在所述射线中提取的所碰撞的碰撞体对应单体模型的光影数据;

确定位于虚拟摄像机拍摄范围内的每个物体与所述虚拟摄像机的距离;

根据所述距离确定相应物体在目标页面的显示层级;

基于所述显示层级从加载的场景渲染所需的多层级三维模型和模型贴图中确定所述显示层级对应的三维模型和模型贴图;

基于所述显示层级的三维模型及对应模型贴图在目标页面渲染相应物体。

2.根据权利要求1所述的方法,其特征在于,所述三维模型包括单体模型和合并模型;

所述符合投射条件的三维模型包括合并模型;所述加载场景渲染所需的每个物体对应的多层级三维模型和模型贴图包括:加载场景渲染所需的每个物体对应的多层级单体模型及模型贴图;

加载每个物体所属物体组合对应的合并模型及模型贴图,所述合并模型的模型贴图记录了相应物体组合中各物体的第一目标层级单体模型的光影数据,所述合并模型合并了相应物体组合中各物体的第二目标层级单体模型。

3.根据权利要求2所述的方法,其特征在于,所述基于所述显示层级的三维模型及对应模型贴图在目标页面渲染相应物体包括:当所述显示层级为近景层级时,基于所述物体对应显示层级的单体模型和模型贴图渲染相应物体;

当所述显示层级从所述近景层级切换至远景层级时,裁剪所述物体所属物体组合中每个物体的单体模型和模型贴图,基于所述物体对应的合并模型以及所述合并模型对应的模型贴图在目标页面渲染相应物体组合。

4.根据权利要求2所述的方法,其特征在于,所述加载每个物体所属物体组合对应的合并模型及模型贴图之前,所述方法还包括:获取场景数据,所述场景数据包括场景渲染所需的每个物体分别对应的多层级单体模型以及各层级单体模型对应的模型贴图;

根据所述物体的体积以及所述物体之间的位置关系对各个物体进行分组,得到至少一个物体组合;

将每个物体组合中各物体的第二目标层级单体模型进行合并,得到相应物体组合对应的合并模型。

5.根据权利要求4所述的方法,其特征在于,所述根据所述物体的体积以及所述物体之间的位置关系对各个物体进行分组,得到至少一个物体组合包括:根据所述物体的体积确定对每个物体执行分组操作的顺序;

确定当前顺序的物体的分组区域;

将位于所述分组区域内的每个物体与当前顺序的物体划分为一个物体组合;

当下一顺序的物体尚未被划分至物体组合时,将所述下一顺序的物体作为当前顺序的物体进行迭代,直至最后顺序的物体。

6.根据权利要求4所述的方法,其特征在于,所述将每个物体组合中各物体的第二目标层级单体模型进行合并,得到相应物体组合对应的合并模型包括:将每个物体组合中各物体的第二目标层级单体模型进行合并,得到相应物体组合所对应初始的合并模型;

根据所述初始合并模型的纹理坐标和法线对初始合并模型进行减面处理;

重新确定减面后合并模型的纹理坐标和法线,得到相应物体组合所对应目标的合并模型。

7.根据权利要求2所述的方法,其特征在于,所述加载每个物体所属物体组合对应的合并模型及模型贴图之前,所述方法还包括:在物体组合中每个物体第一目标层级的单体模型中提取光影数据;

在各第一目标层级单体模型对应的模型贴图中提取固有色数据;

将光影数据与固有色数据混合写入空白贴图中,得到合并模型的模型贴图。

8.根据权利要求7所述的方法,其特征在于,所述在物体组合中每个物体第一目标层级的单体模型中提取光影数据包括:通过对所述合并模型进行膨胀处理创建相应物体组合对应的包裹体;

通过对物体第一目标层级单体模型进行复制,创建相应物体对应的碰撞体;

触发在所述包裹体上每个像素点的位置向所述碰撞体发射射线;

在所述射线中提取所碰撞的碰撞体对应单体模型的光影数据。

9.根据权利要求7所述的方法,其特征在于,所述光影数据包括光照数据和阴影数据;

所述将光影数据与固有色数据混合写入空白贴图中,得到合并模型的模型贴图包括:生成合并模型对应的空白贴图;所述空白贴图包括颜色通道和阿尔法通道;

根据阴影数据对光照数据与固有色数据进行混合运算,得到第一混合结果;

将所述第一混合结果写入所述颜色通道,将所述阴影数据写入阿尔法通道,得到所述合并模型对应的模型贴图。

10.根据权利要求9所述的方法,其特征在于,所述根据所述阴影数据对所述光照数据和所述固有色数据进行混合运算,得到第一混合结果包括:对所述光照数据进行灰度转换,得到遮蔽数据;

对所述阴影数据与所述固有色数据进行第一逻辑运算,得到顺光数据;

对所述阴影数据、所述固有色数据以及所述遮蔽数据进行第二逻辑运算,得到背光数据;

对所述顺光数据与所述背光数据进行混合运算,得到第一混合结果。

11.根据权利要求9所述的方法,其特征在于,所述方法还包括:在所述第一目标层级单体模型对应的模型贴图中提取法线方向数据;

将所述法线方向数据与预先指定的主光方向数据进行点乘运算;

对点乘结果与所述阴影数据进行混合运算,得到第二混合结果;

将所述第二混合结果写入所述颜色通道。

12.根据权利要求1至11任一所述的方法,其特征在于,所述方法还包括:确定在加载所述模型贴图时为所述模型贴图分配内存的内存分配粒度;

根据所述内存分配粒度确定模型贴图的目标尺寸;

对所述场景中贴图尺寸小于所述目标尺寸的模型贴图进行合并,得到一个或多个贴图尺寸等于所述目标尺寸的目标贴图。

13.一种场景渲染装置,其特征在于,所述装置包括:模型及贴图加载模块,用于加载场景渲染所需的每个物体对应的多层级三维模型和模型贴图;符合投射条件的三维模型包括合并模型;所述合并模型所对应模型贴图投射了相应物体组合中各物体的第一目标层级单体模型的光影数据;投射的所述光影数据,是触发在所述物体组合对应的包裹体上向所述物体组合中的物体对应的碰撞体发射射线后,在所述射线中提取的所碰撞的碰撞体对应单体模型的光影数据;

模型选定模块,用于确定位于虚拟摄像机拍摄范围内的每个物体与所述虚拟摄像机的距离;根据所述距离确定相应物体在目标页面的显示层级;

场景渲染模块,用于基于所述显示层级从加载的场景渲染所需的多层级三维模型和模型贴图中确定所述显示层级对应的三维模型和模型贴图;基于所述显示层级的三维模型及对应模型贴图在目标页面渲染相应物体。

14.一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如权利要求1至12中任一项所述方法的步骤。

15.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如权利要求1至12中任一项所述方法的步骤。

说明书 :

场景渲染方法、装置、计算机可读存储介质和计算机设备

技术领域

[0001] 本申请涉及图像处理技术领域,特别是涉及一种场景渲染方法、装置、计算机可读存储介质和计算机设备。

背景技术

[0002] 随着图像处理技术的发展,网络游戏、军事模拟演习应用或基于VR(Virtual Reality,虚拟现实)的体感活动应用等均能够渲染实现三维虚拟场景,给用户带来强烈的视觉冲击。同时随着终端性能的发展,用户对虚拟场景的视距范围也提出了更高要求,希望能够看的更远。更远的视距范围势必意味着需要在交互页面展示更多的物体,且物体数量随视距范围增大呈指数级增长。在终端CPU (central processing unit,中央处理器),GPU(Graphic Processing Unit,图像处理器)等资源的限制下,更多的物体会造成虚拟场景加载速度的降低。
[0003] 为了在保证虚拟场景加载速度的情况下增大视距范围,传统方式主要是通过减少远处物体的细节信息来实现,而对细节信息的丢失势必会使虚拟场景渲染效果变差。

发明内容

[0004] 基于此,有必要针对目前虚拟场景渲染效果差的技术问题,提供一种场景渲染方法、装置、计算机可读存储介质和计算机设备。
[0005] 一种场景渲染方法,包括:
[0006] 加载场景渲染所需的每个物体对应的多层级三维模型和模型贴图,符合投射条件的三维模型所对应模型贴图投射了第一目标层级三维模型的光影数据;
[0007] 确定位于虚拟摄像机拍摄范围内的每个物体与所述虚拟摄像机的距离;
[0008] 根据所述距离确定相应物体在目标页面的显示层级;
[0009] 基于所述显示层级从加载的场景渲染所需的多层级三维模型和模型贴图中确定所述显示层级对应的三维模型和模型贴图;
[0010] 基于所述显示层级的三维模型及对应模型贴图在目标页面渲染相应物体。
[0011] 一种场景渲染装置,所述装置包括:
[0012] 模型及贴图加载模块,用于加载场景渲染所需的每个物体对应的多层级三维模型和模型贴图,符合投射条件的三维模型所对应模型贴图投射了第一目标层级三维模型的光影数据;
[0013] 模型选定模块,用于确定位于虚拟摄像机拍摄范围内的每个物体与所述虚拟摄像机的距离;根据所述距离确定相应物体在目标页面的显示层级;
[0014] 场景渲染模块,用于基于所述显示层级从加载的场景渲染所需的多层级三维模型和模型贴图中确定所述显示层级对应的三维模型和模型贴图;基于所述显示层级的三维模型及对应模型贴图在目标页面渲染相应物体。
[0015] 一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机可执行指令,所述计算机可执行指令被处理器执行时,使得所述处理器执行上述场景渲染的方法。
[0016] 一种计算机设备,包括存储器和处理器,所述存储器中储存有计算机可读指令,所述计算机可读指令被所述处理器执行时,使得所述处理器执行上述场景渲染的方法。
[0017] 上述场景渲染方法、计算机可读装置、存储介质和计算机设备,基于多层级三维模型综合渲染展示一个物体,可以使位于虚拟摄像机拍摄范围内的每个物体无论从任何位置观察均有对应的模型得以展示,所在位置均不为空,即物体均未被裁剪,可以扩大虚拟场景的视距范围;由于三维模型的模型贴图记录有其他层级模型的光影数据,可以将光影数据投射在本不具备或具备较少光影数据的三维模型上,使物体具有很好的光影效果,提升场景渲染效果。由于是将光影数据预先记录在了一张模型贴图中,在场景渲染时只需对三维模型进行一次贴图渲染,且模型贴图可以是预先离线烘焙好的,无需临时计算光影数据,随取随用即可,进而可以保证虚拟场景加载速度。

附图说明

[0018] 图1为一个实施例中场景渲染方法的应用环境图;
[0019] 图2为一个实施例中场景渲染方法的流程示意图;
[0020] 图3为一个实施例中基于不同技术所渲染的同一场景的页面示意图;
[0021] 图4为一个实施例中基于节点对合并模型进行优化处理的流程示意图;
[0022] 图5为一个实施例中进行不同程度优化后的合并模型的结构示意图;
[0023] 图6为一个实施例中基于不同技术在合并模型中切分出的UV坐标示意图;
[0024] 图7A为一个实施例中基于碰撞体和包裹体在高等级模型中提取光影数据的原理示意图;
[0025] 图7B为另一个实施例中基于碰撞体和包裹体在高等级模型中提取光影数据的原理示意图;
[0026] 图8为一个具体的实施例中场景渲染方法的流程示意图;
[0027] 图9为另一个具体的实施例中场景渲染方法的流程示意图;
[0028] 图10为一个实施例中场景渲染装置的结构框图;
[0029] 图11为另一个实施例中场景渲染装置的结构框图;
[0030] 图12为一个实施例中计算机设备的结构框图。

具体实施方式

[0031] 为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
[0032] 图1为一个实施例中场景渲染方法的应用环境图。参照图1,该场景渲染方法应用于场景渲染系统。该场景渲染系统包括终端110和服务器120。终端110 和服务器120通过网络连接。上述场景渲染的方法中采用的模型贴图,可以是在终端110或服务器120烘焙完成的。终端110获取渲染网络虚拟场景所需的场景数据,即合并模型、单体模型及单体模型的模型贴图,基于上述场景渲染的方法对场景数据处理,烘焙出合并模型的模型贴图,当需要加载虚拟场景时基于预先烘焙出的模型贴图以及已有场景数据进行场景渲染。或者,服务器120 获取场景数据,基于上述场景渲染的方法对场景数据处理,预先烘焙出合并模型的模型贴图,并对烘焙出的模型贴图进行存储。当接收到终端110发送的场景加载请求时,将预先存储的模型贴图等场景数据发送至终端110,终端110基于接收到的场景数据实现场景渲染。终端110具体可以是台式终端或移动终端,移动终端具体可以是手机、平板电脑、笔记本电脑等中的至少一种。服务器120 可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
[0033] 如图2所示,在一个实施例中,提供了一种场景渲染方法。本实施例主要以该方法应用于上述图1中的终端110来举例说明。参照图2,该场景渲染方法具体包括如下步骤:
[0034] S202,加载场景渲染所需的每个物体对应的多层级三维模型和模型贴图,符合投射条件的三维模型所对应模型贴图投射了第一目标层级三维模型的光影数据。
[0035] 其中,场景渲染是将预先构建的场景素材投影呈现为数字图像的过程。每个物体对应的多层级三维模型和多层级模型贴图分别为渲染虚拟场景所需的一种场景素材。物体是指虚拟场景中的虚拟物品。物体的外观形态可以是三维立方体,由多个面在三维空间拼接而成,每个面可以是一个多边形,因而三维模型具有多个顶点。根据物体的体积以及顶点密度,可以将虚拟场景中的物体区别为大型物体和小型物体。大型物体具有较大的体积但顶点密度小,如山脉、树木等。小型物体具有较小的体积但顶点密度大,如建筑物,石头、船只等。在本申请提供的实施例对小型物体的渲染效果更优,即更加适用于小型物体的渲染。
[0036] 每个物体具有对应的多层级三维模型和多层级模型贴图。在本实施例中,多层级三维模型包括多层级单体模型。单体模型是指单个物体的三维模型。多层级单体模型可以是在3Dmax等绘图软件基于LOD技术(Levels of Detai,多细节层次)绘制的物体不同层级的三维模型。比如,假设一个虚拟场景包括A、 B、C等小型物体,每个物体具有n个层级的单体模型,则物体A对应的多层级单体模型可以记作LODAi。其中,i表示层级,0≤i≤n-1,i越小表示层级越高。比如,LODA0、LODA1……LODAn-1对应的模型等级依次降低。LODA0是物体A对应的最高层级单体模型,LODAn-1是物体A对应的最低层级单体模型。等级越低的单体模型所具有的面数、材质、纹理等细节信息越简化。
[0037] 模型贴图是用于将纹理信息投射在三维模型上,以使三维模型具有纹理效果的二维图片。与多层级单体模型相对应,模型贴图也是多层级的。换言之,每个层级的单体模型具有对应层级的模型贴图。多层级模型贴图也可以是在 3Dmax等绘图软件基于LOD技术绘制得到的。
[0038] 光影数据是指能够使三维模型呈现明暗对比效果的数据。为了使虚拟场景产生明暗对比的效果,在物体所对应三维模型的绘制阶段,通常会赋予物体一定的光影数据。比如,基于3Dmax等绘图软件的灯光系统可以参照真实环境设定一个或多个光源,设定每个光源所发出光线的颜色、衰减属性、投影属性、层次等信息。光线颜色可能会由于发光物体、反光物体以及滤光物体的作用产生偏色,如木材燃烧的暖色光线、天空反射的冷色光线以及信号灯过滤的彩色光线等。光线的衰减是指光线随着物体距离光源的增加而减弱的过程。投影使得物体之间产生一种联系在一起的效果。根据照明目的不同,可以设定不同层次的光线,如主光、日光、太阳光等。在本申请提供的实施例中,光影数据具体包括光照数据和阴影数据。其中,光照数据包括天光和地光的强度、颜色等数据。天光数据是指日光和阴影下的光,地光是指太阳光的反射光。
[0039] 第一目标层级是预先指定的用于提取光影数据的单体模型的层级。可以理解,层级越高的单体模型所包含的光影数据越丰富,为了能够获取到更多的光影数据,第一目标层级可以是较高的层级,如最高层级0等。
[0040] 投射条件是指判断一个层级的三维模型是否需要投射来自第一目标层级模型的光影数据的条件。投射条件具体可以是三维模型中所包含光影数据丰富度小于阈值,或者三维模型的层级低于或等于预设层级等。为了控制需要进行光影数据投射的三维模型的数量,预设层级可以是较低的层级,如最低层级n-1 等。
[0041] 当一个层级的单体模型本身具有光影数据时,则无需再投射同物体其他层级单体模型的光影数据。当一个层级的单体模型不具有光影数据时,则渲染引擎从同物体具有光影数据的其他层级单体模型中提取光影数据,并提取的光影输入写入不存在光影数据的单体模型所对应模型贴图中。层级越高的单体模型所具备的光影数据越丰富,从而当低层级的单体模型不具备光影数据时,渲染引擎可以将高层级单体模型的光影数据投射在低层级单体模型上。比如,将LODA0的光影数据投射在LODAn-1上,如此可以使每个层级的单体模型均具有光影数据。
[0042] 具体地,当发生场景加载触发操作时,终端从服务器或本地缓存中拉取场景素材,基于场景素材渲染得到初始的目标页面。场景加载触发操作是指能够触发在目标页面开始进行虚拟场景渲染的操作,如打开目标页面的操作,在目标页面的触发操作等。场景数据包括虚拟场景每个物体的多层级单体模型以及每个单体模型对应的模型贴图。终端将拉取的场景素材导入渲染引擎。渲染引擎是指一些已编写好的可编辑电脑游戏系统或一些交互式实时图像应用程序的核心组件,具体可以是Unity、UE4(unreal engine 4,虚幻引擎4)等。
[0043] S204,确定位于虚拟摄像机拍摄范围内的每个物体与虚拟摄像机的距离。
[0044] 其中,虚拟摄像机是指虚拟场景中位于虚拟对象周围的三维模型。当采用第一人称视角时,虚拟摄像机位于虚拟对象的头部附近或位于虚拟对象的头部。当采用第三人称视角时,虚拟摄像机位于虚拟对象的后方。终端可以采用第一人称视角进行显示,所显示的虚拟场景中仅包括虚拟对象的手部、手臂或者手中所持有的兵器等,从而能够模拟通过该虚拟对象的视角观察虚拟场景的效果。或者,还可以采用第三人称视角进行显示,第三人称视角与第一人称视角的方向一致,只是第三人称视角会在虚拟场景中显示背对终端屏幕的虚拟对象,以使得用户可以在虚拟场景中看到其控制的虚拟对象的动作、所处环境等。
[0045] 通过虚拟摄像机的视角观察虚拟场景。虚拟摄像机的拍摄方向是以虚拟对象的第一人称视角或第三人称视角在虚拟场景中进行观察时的观察方向。虚拟摄像机的位置可以跟随(也可以不跟随)虚拟对象位置变化。
[0046] 虚拟场景包括多个场景区域。在虚拟对象控制过程中,用户可以操控虚拟对象从一个场景区域移动到另一个场景区域。根据用户对虚拟对象的控制,虚拟场景跟随变更,每个物体相对虚拟摄像机的位置可能随时都在发生变化。根据虚拟对象距离虚拟摄像机的远近,可以将场景区域分类为近景区域或者远景区域。比如当虚拟对象与一个物体的距离小于阈值时,该物体所在的场景区域为近景区域;当虚拟对象与一个物体的距离大于或等于阈值时,该物体所在的场景区域为远景区域。当物体处于近景区域时,采用高层级的单体模型渲染该物体;当物体处于远景区域时,采用低层级的单体模型渲染该物体。物体距离虚拟摄像机越远,用于渲染该物体的单体模型的层级越低。
[0047] S206,根据距离确定相应物体在目标页面的显示层级。
[0048] 其中,物体的显示层级是指根据物体当前与虚拟摄像机的距离确定的所应该展示的该物体的单体模型LODi的层级i。其中,0≤i≤n-1。
[0049] 在虚拟对象控制过程中,交互应用中渲染引擎根据用户对虚拟对象的控制操作,控制虚拟对象在虚拟场景中移动,并在虚拟对象移动过程中对虚拟场景中的物体进行模型层级切换和裁剪。本实施例渲染引擎预置了多种距离区间与物体显示层级的对应关系,比如,1-5cm范围内采用LOD0,对应的显示层级为0; 5-10cm范围内采用LOD1,对应的显示层级为1;10-20cm范围内采用LOD2,对应的显示层级为2等。
[0050] S208,基于显示层级从加载的场景渲染所需的多层级三维模型和模型贴图中确定显示层级对应的三维模型和模型贴图。
[0051] 具体地,在确定每个物体对应的显示层级后,在所加载的相应物体的多层级三维模型中筛选与显示层级对应的三维模型作为目标三维模型,在所加载的相应物体的多层级模型贴图中筛选与显示层级对应的模型贴图作为目标模型贴图。比如,虚拟对象在t1时刻与物体A的距离为5cm,则A物体对应的目标三维模型可以是LODA0。虚拟对象在t2时刻与物体A的距离为12cm,则A物体对应的目标三维模型可以是LODA2。
[0052] S210,基于显示层级三维模型及对应模型贴图在目标页面渲染相应物体。
[0053] 具体地,渲染引擎基于物体对应的目标三维模型和目标模型贴图在目标页面渲染展示相应物体。当虚拟场景的视角范围发生变更时,适应性调整用于渲染每个物体的目标三维模型和目标模型贴图。
[0054] 传统方式,在进行场景渲染时,对于与虚拟摄像机的距离超过阈值的物体,或直接裁减掉,或采用最低等级的单体模型。直接将远处物体裁剪掉,虚拟场景中该物体对应的位置为空,因而会缩短虚拟场景的视距范围。而LOD技术是根据物体层级可以确定物体在虚拟场景中所处的位置和重要度,决定物体渲染的资源分配,通过牺牲远处物体的面数和细节度,来保证场景渲染效率。也就是说,最低等级的单体模型LODn-1并不具备光影信息,通常只是采用漫反射贴图,这就是使得物体表面平滑无阴影,难以体现物体的体积感。
[0055] 本实施例直接将物体存在的光影数据投射到不具备光影数据的三维模型中,由此可以保证每个模型具有一定的光影数据,如此可以在低等级单体模型的模型贴图上保留较丰富的光影细节。参考图3,图3示出了一个实施例中基于不同技术所渲染的同一场景的效果图。如图3所示,基于传统技术渲染得到的虚拟场景,相比原始图像差距较大,比如图中圈选的基于传统技术渲染的建筑 302B、304B相比原始图像中建筑302A和304B均明显缺乏阴影效果。而基于本申请实施例提供的方法所渲染得到的虚拟场景中每个物体具有很好的体积感, 光影感明显更强,比如图中圈选的本申请所提供方法渲染的建筑302C、304C均与原始图像中建筑302A、304A没有明显差异.由于投射了高等级模型的光影数据,使远处的物体也能够与虚拟场景更加的融洽,自身之间的遮蔽也通过阴影表现了出来。
[0056] 值得强调的是,投射有光影数据的模型贴图可以是预先离线烘焙好的,后续需要进行场景渲染时直接采用该模型贴图进行场景渲染即可,且该模型贴图可以多次重复利用。只有在虚拟场景发生变更,需要对相应物体的三维模型或模型贴图进行调整时才需要重新烘焙模型贴图。
[0057] 上述场景渲染方法,基于多层级三维模型综合渲染展示一个物体,可以使位于虚拟摄像机拍摄范围内的每个物体无论从任何位置观察均有对应的模型得以展示,所在位置均不为空,即物体均未被裁剪,可以扩大虚拟场景的视距范围;由于三维模型的模型贴图记录有其他层级模型的光影数据,可以将光影数据投射在本不具备或具备较少光影数据的三维模型上,可以使物体具有很好的光影效果,提升场景渲染效果。由于是将光影数据预先记录在了一张模型贴图中,在场景渲染时只需对三维模型进行一次贴图渲染,且模型贴图可以是预先离线烘焙好的,无需临时计算光影数据,随取随用即可,进而可以保证虚拟场景加载速度。
[0058] 在一个实施例中,三维模型包括单体模型和合并模型;符合投射条件的三维模型包括合并模型;加载场景渲染所需的每个物体对应的多层级三维模型和模型贴图包括:加载场景渲染所需的每个物体对应的多层级单体模型及模型贴图;加载每个物体所属物体组合对应的合并模型及模型贴图;合并模型的模型贴图记录了相应物体组合中各物体的第一目标层级单体模型的光影数据;合并模型合并了相应物体组合中各物体的第二目标层级单体模型。
[0059] 其中,物体组合是指由具有较强关联性的多个物体形成的组合。每个物体组合具有对应的合并模型。合并模型可以是由相应物体组合每个物体所对应的第二目标层级单体模型合并得到的HLOD(hierarchical levels of detail,分层层次细节模型)。第二目标层级是预先指定的用于合并得到物体组合所对应合并模型的层级。可以理解,层级越低的单体模型的复杂度越低,比如,包含的面数越少。为了能够保证合并模型的加载速度,第二目标层级可以是较低的层级,如最低层级n-1等。比如,一个物体组合包括物体A,C和F,则该物体组合对应的合并模型HLODACF可以由LODAn-1、LODCn-1、LODFn-1合并得到。同一虚拟场景中可能有多个HLOD,每个HLOD具有对应的模型贴图。
[0060] 在一个实施例中,物体组合可以基于人工根据物体之间的关联性对多个物体进行分组得到。终端基于渲染引擎在三维空间展示所导入的每个物体,用户可以在三维空间对每个物体进行布局,即对物体与物体之间的相对位置关系进行配置,还可以对三维空间中的物体进行分组。每个物体具有对应的物体标识以及所属物体组合的组合标识。渲染引擎对每个物体组合内不同物体的单体模型进行合并模型。为了减少合并模型的复杂度,渲染引擎对合并模型进行减面等优化处理。三维模型由多个三角面组成,减面是指通过将多个三角面合并为一个三角面来减少模型中三角面数量的过程。
[0061] 在一个实施例中,渲染引擎中集成了分组组件。分组组件是能够对三维空间中物体自动分组的应用程序。分组组件对物体进行分组的逻辑可以基于物体之间的相对位置关系,将距离小于预设值的多个物体划分为一个物体组合。
[0062] 具体地,当发生场景加载触发操作时,终端基于拉取的场景素材生成渲染任务,调用CPU向命令缓冲区(Command Buffer)添加渲染任务命令。命令缓冲区中的命令有很多种类,如DrawCall、Shader等。GPU在完成上一次的渲染任务后,可以从命令缓冲区取出一个命令执行。在每次调用DrawCall之前,CPU 需要完成发送数据、检查渲染状态等多项准备工作。在CPU完成这些准备工作后,GPU可以开始本次的渲染。值得注意的是,GPU的渲染能力是很强的,一次能够渲染三角网格通常较大,因此渲染速度往往快于CPU提交命令的速度。如果Draw Call的数量太多,会造成CPU的过载。
[0063] 本实施例中,通过合并模型可以一次提交更多的模型供GPU处理,进而减少Drawcall提交量,减少CPU资源占用,有助于提高虚拟场景加载速度。
[0064] 在一个实施例中,基于显示层级三维模型及对应模型贴图渲染相应物体包括:当显示层级为近景层级时,基于物体对应显示层级的单体模型和模型贴图渲染相应物体;当显示层级从近景层级切换至远景层级时,裁剪物体所属物体组合中每个物体的单体模型和模型贴图,基于物体对应的合并模型以及合并模型对应的模型贴图渲染相应物体组合。
[0065] 其中,当包含合并模型时,物体的显示层级是指根据物体当前与虚拟摄像机的距离确定的所应该展示的该物体的单体模型LODi或合并模型HLOD的层级。其中,0≤i≤n-1。HLOD可以认为是物体所对应的第n层级的三维模型。如此,显示层级具体可以是0至n中的一个层级。近景层级是指需要基于单体模型LODi 渲染相应物体的显示层级i。远景层级是指需要基于合并模型HLOD渲染相应物体的显示层级n。预存储的物体与虚拟摄像机的距离与模型显示层级的对应关系还可以包括合并模型与距离的对应关系,如20-30cm范围内采用HLOD。
[0066] 具体地,当显示层级为近景层级时,渲染引擎基于物体对应显示层级的单体模型和模型贴图渲染相应物体。比如,假设物体组合(A、C、F),虚拟对象在t1时刻与物体A的距离为5cm,与物体C的距离为4cm,与物体F的距离为 5cm时,则A物体采用LODA0,C物体采用LODc0,F物体采用LODF0。虚拟对象在 t2时刻与物体A的距离为3cm,与物体C的距离为10cm,与物体F的距离为8cm 时,则A物体采用LODA0,C物体采用LODc1,F物体采用LODF1。
[0067] 当显示层级从近景层级切换至远景层级时,渲染引擎裁剪物体所属物体组合中每个物体的单体模型和模型贴图,基于物体对应的合并模型以及合并模型对应的模型贴图渲染相应物体组合。比如,在上述举例中,虚拟对象在t3时刻与物体A的距离为10cm,与物体C的距离为20cm,与物体F的距离为30cm时,则将物体A、C和F的单体模型均裁剪掉,采用合并模型HLODACF。在模型切换过程中,渲染引擎自适应替换投射至相应三维模型的模型贴图。
[0068] 本实施例中,基于多层级单体模型和合并模型综合渲染展示一个物体,可以使每个物体无论从任何位置观察它,所在位置均不为空,即物体均未被裁剪,可以扩大虚拟场景的视距范围;基于投射了第一目标层级单体模型光影数据的合体模型展示远处物体,使远处物体也具有很好的光影效果,可以保证很好的场景渲染效果。通过合并模型可以一次提交更多的模型供GPU处理,进而减少 Drawcall提交量,减少CPU资源占用,有助于提高虚拟场景加载速度。
[0069] 在一个实施例中,加载每个物体所属物体组合对应的合并模型及模型贴图之前,上述场景渲染方法还包括:获取场景数据,场景数据包括场景渲染所需的每个物体分别对应的多层级单体模型以及各层级单体模型对应的模型贴图;根据物体的体积以及物体之间的位置关系对各个物体进行分组,得到至少一个物体组合;将每个物体组合中各物体的第二目标层级单体模型进行合并,得到相应物体组合对应的合并模型。
[0070] 其中,物体的体积是指物体所对应最高层级单体模型在虚拟场景中所占据空间的大小。物体的体积可以是基于包围盒(Boundingbox)算法计算得到的。包围盒是一种求解离散点集最优包围空间的算法,是进行碰撞干涉初步检测的重要方法之一,基本思想是用体积稍大且特性简单的几何体(称为包围盒)来近似地代替复杂的几何对象。常见的包围盒算法有AABB包围盒(Axis-aligned bounding box),包围球(Sphere),方向包围盒OBB(Oriented bounding box) 以及固定方向凸包FDH(Fixed directions hulls或k-DOP)等。本实施例可以采用AABB包围盒,可以理解为能够盛装下该物体的体积最小的矩形虚拟箱体。 AABB是应用最早的包围盒,是包含该单体模型且边平行于坐标轴的最小六面体。故描述一个AABB,仅需六个标量。AABB构造比较简单,存储空间小,但紧密性差,尤其对不规则几何形体,冗余空间很大。
[0071] 具体地,渲染引擎确定每个物体所对应最高层级单体模型的包围盒,计算包围盒的体积。比如,当包围盒为能够包含单体模型的最小六面体,则可以根据六面体的顶点坐标最大值和最小值计算六面体的体积。根据物体体积可以确定识别出虚拟场景中标志性物体。渲染引擎根据物体之间的位置关系优先确定标志性物体所属的物体组合。
[0072] 在一个实施例中,渲染引擎将体积超过阈值的每个物体确定为标志性物体。将与标志性物体的最短距离小于预设值的其他非标志性物体均与该标志性物体划分至同一物体组合。
[0073] 在一个实施例中,当一个物体与多个标志性物体的距离均小于预设值时,该物体可能会同时被划分至多个物体组合。为了保证同一物体仅属于一个物体组合,渲染引擎将该物体划分至相距最近的一个标志性物体对应的物体组合中。
[0074] 本实施例中,基于体积以及物体之间的位置关系对物体进行自动分组,相比人工手动分组,不仅提高分组效果。虚拟场景里面的物体常常发生变化,每次变化都要重新分组,而且不同人分组分标准不统一,由此提高了维护成本,而自动分组的方式标准统一,可以大大降低维护成本。
[0075] 在一个实施例中,根据物体的体积以及物体之间的位置关系对各个物体进行分组,得到至少一个物体组合包括:根据物体的体积确定对每个物体执行分组操作的顺序;确定当前顺序的物体的分组区域;将位于分组区域内的每个物体与当前顺序的物体划分为一个物体组合;当下一顺序的物体尚未被划分至物体组合时,将下一顺序的物体作为当前顺序的物体进行迭代,直至最后顺序的物体。
[0076] 其中,分组区域是三维空间中包含物体的区域。分组区域可以是平面区域,比如以物体为中心所形成的平行于地面的圆形区域或其他任意多边形区域。分组区域也可以是空间区域,比如以物体为中心所形成的球形区域。
[0077] 在一个实施例中,确定当前顺序的物体的分组区域包括:确定当前顺序的物体的位置基准点;将以位置基准点为圆点,以预设值为半径形成的目标区域确定为当前顺序的物体的分组区域。
[0078] 其中,位置基准点是指物体上能够代表该物体在三维空间所处位置的一个位置坐标点,具体可以是重心坐标点。预设值是预先设定的用于限定分组区域边界的最大距离值。可以理解,当分组区域为圆形区域时,预设值为半径值。
[0079] 值得注意的是,用于确定分组区域的半径值应当合理设置。半径值过大会导致分组区域过大,进而使单体模型合并过度,这在场景渲染时就会使过多单体模型被提前替换为合并模型,影响场景渲染效果。而半径值过小会导致分组区域过小,进而使单体模型合并不充分,虚拟场景仍存在过多零散的单体模型,由于场景渲染时渲染每个单体模型都需要调用一次CPU和GPU,进而会造成资源过度占用,影响场景渲染效率。
[0080] 具体地,渲染引擎根据物体的体积降序对多个物体进行遍历。渲染引擎确定第一顺序的物体(即体积最大的物体)的分组区域,比如第一顺序的物体的位置基准点为圆心,以预设值为半径形成的圆形区域范围内的其他物体与第一顺序的物体划分至同一物体组合。
[0081] 进一步地,渲染引擎根据一个物体只能划分至一个物体组合的原则,判断第二顺序的物体(即体积次大的物体)是否已完成分组。若第二顺序的物体以及与第一顺序的物体划分为同一物体组合,则继续遍历第三顺序的物体。否则,渲染引擎确定第二顺序的物体的分组区域,将落入第二顺序的物体分组区域的尚未被分组的物体与第二顺序的物体划分为同一物体组合,如此重复,直至最后顺序的物体。
[0082] 比如,在上述举例中,虚拟场景中有A、B、C、D、E、F、G、H、I和J十个物体对应的体积依次降低,则首先对体积最大的物体A进行分组,假设(A, C,F)为一组,则下一顺序对物体B进行分组,假设(B、G、H)一组,则下一顺序对D进行分组,因为C已完成分组,如此类推。事实上,不同类型的物体可以有不同的分组机制,本实施例提供的分组机制更适用于小型物体。
[0083] 根据体积逐个对每个物体进行分组的方式,能够尽可能将虚拟场景中的标志性物体与其周围的小型物体分到同一组,使虚拟场景进行场景区域切换时具有很好的连贯性。比如,虚拟场景中具有风格相似的三个房子,当虚拟对象控制过程中,房子的位置跟随用户的控制操作而变化时,可以以三个房子整体为单位进行模型切换,可以避免关联性强的多个物体一部分切换成了另一种颜色和纹理,另一部分还保留在原来的颜色和纹理,而给用户造成一种场景断层割裂的感觉,使渲染出来的虚拟场景更加贴近真实空间,即增强了场景渲染效果。
[0084] 本实施例中,综合考虑体积以及物体之间的位置关系对物体进行自动分组的方式,能够尽可能将虚拟场景中的标志性物体与其周围的小型物体分到同一组,避免具有很高关联性的两个物体分到不同物体组合,使虚拟场景中每个物体在外观表现上具有很好的整体性。
[0085] 在一个实施例中,将每个物体组合中各物体的第二目标层级单体模型进行合并,得到相应物体组合对应的合并模型包括:将每个物体组合中各物体的第二目标层级单体模型进行合并,得到相应物体组合所对应初始的合并模型;根据初始合并模型的纹理坐标和法线对初始合并模型进行减面处理;重新确定减面后合并模型的纹理坐标和法线,得到相应物体组合所对应目标的合并模型。
[0086] 其中,法线是与面垂直的一个向量,可用以帮助调整三维模型的显示方向。为了在三维模型中表现更多的信息,出现了法线贴图。法线贴图是在原物体的凹凸表面的每个像素点上均作法线,并将法线的方向数据记录在一张贴图中。事实上,法线贴图并没有改变三维模型的纹理起伏,只是在三维模型表面垂衣与虚拟摄像机的范围内使物体产生一种凹凸的视觉效果。这种凹凸可跟随光源的变化而产生敏感区域和阴影的改变。
[0087] 在一个实施例中,渲染引擎对物体组合中每个物体第二目标层级单体模型进行合并后,可以基于渲染引擎之外的其他专用模型处理工具对合并得到的合并模型进行减面等优化处理。比如,可以将合并模型从渲染引擎导出至Houdini (一种节点式影视特效软件)中,Houdini软件基于预先配置的模型优化流程对合并模型进行减面等处理,将处理后的合并模型重新导回至渲染引擎中。
[0088] 在一个实施例中,渲染引擎中集成了Houdini触发脚本,通过Houdini触发脚本可以自动触发Houdini从渲染引擎拉取合并模型,在自动对合并模型进行减面优化后,将优化后的目标合并模型从Houdini自动导出到渲染引擎。在此过程,无需人工干预,用户自始至终只需使用渲染引擎工作即可,而无需打开Houdini,可以避免在多个应用程序之间频繁切换的繁琐。
[0089] 具体地,渲染引擎调用Houdini触发脚本,启动Houdini。Houdini基于预设插件触发预设的通用流程的数据包,即可实现自动优化。通用流程可以是预先在Houdini中设置得到的。Houdini是基于节点的渲染架构。用户可以在 Houdini调用多个流程节点,并按照对合并模型进行优化的执行流程将多个节点串联,对应的Houdini将每个节点对应的程序代码按需拼接在一起,对拼接后的程序代码进行打包,形成通用流程。
[0090] 参考图4,图4示出了一个实施例中基于节点的通用流程的示意图。如图4 所示,通用流程包括多个流程节点,如同位置顶点合并节点、同位置UV合并节点、自动减面节点、零散物件删除节点、模型清理节点、自动分UV节点、自动摆UV节点、法线生成节点和模型导出节点。
[0091] 同位置顶点合并节点用于将合并模型中应该合并在一起但实质断开的顶点融合在一起。比如,物体组合(A,C,F)中物体A对应单体模型LODAn-1中边线 M与物体C对应单体模型LODCn-1中边线N应当合并在一起,但自渲染引擎中导入过来的初始合并模型仅仅只是将两条边线贴在了一起,此时同位置顶点合并节点在检测出待合并的边线M的顶点与边线N的顶点合并在一起。
[0092] 同位置UV合并节点用于在合并模型中切分UV,并对切分得到的全部UV合并在一起。UV可以理解为从三维模型中裁剪中的二维多边形。模型中每个像素点具有对应的UV坐标,当同位置顶点合并节点进行顶点合并时,同位置UV合并节点同步将相应UV合并。顶点合并与UV合并是为了减面做准备,能够提前封装固定合并模型的顶点密度和UV密度,有助于提高后续减面和切分UV的准确性。
[0093] 自动减面节点用于根据预置的减面比例、纹理坐标、法线方向等参数对合并模型进行减面处理。减面比例是指减少的面数相对初始合并模型所具有的面数的比值。
[0094] 零散物件删除节点用于根据模型体积删除一些零散的模型。体积很小的零散模型在虚拟场景较远处不会引起用户视觉注意,但这些零散模型往往占用了很多面数,因而将零散模型删除可以在不影响场景渲染效果的情况下,提高模型精简度。
[0095] 模型清理节点用于将合并模型特别窄的面删除掉,实现逻辑与零散模型删除逻辑相似。合并模型中宽度值小于预设值的面在虚拟场景较远处同样不会引起用户视距注意,可以删除,以精简合并模型。参考图5,图5为一个实施例中进行不同程度优化后的合并模型的示意图。如图5所示,具有1772个三角面的合并模型,依次经过第四步减面、第五步删除零散模型处理以及第六步清理模型(即删除很窄的三角面)的处理后,转化为具有678个三角面的合并模型,减面比例为(1772-678)/1772。自动减面节点中预置了默认的减面比例,如40%。优选地,在渲染引擎端可以基于Houdini触发脚本调起Houdini配置面板,用户可以在Houdini配置页面对减面比例重新配置。
[0096] 自动分UV节点用于根据预置的UV间距等参数对合并模型进行重新分UV处理。由于虚拟场景较远处往往一个像素点可能横跨了两个不相关的模型面,此时会引起面与面之间颜色上的投射错误。因而设定合并模型不同UV之间应当具有一定的距离。UV间距根据合并模型表面积自动计算得到的,合并模型表面积越小的,对应的UV间距越大。重新对减面后的合并模型进行分UV处理,可以保证合并模型的每个面对于贴图都有唯一的位置与其对应,进而避免因像素点重叠造成的投影错误。参考图6,图6示出了一个实施例中分别基于不同技术进行纹理坐标切分的效果对比图。如图6所示,基于渲染引擎内部自带的UV切分算法自动分出的UV利用率只有33%,而基于Houdini自动分出的UV利用率高达 67%,提高UV利用率意味着模型贴图中更多的数据信息能够准确投射到三维模型上,提高模型渲染效果。
[0097] 自动摆UV节点用于对重新切分的UV按照一定的次序进行摆放。法线生成节点在重新摆放UV后,对应合并模型中每个面的发现可能会发生变化,因此需要重新生成每个面的法线。模型导出节点用于将经前序各节点处理得到的目标的合并模型导出,生成对应的三维模型文件。渲染引擎基于Houdini触发脚本自动从Houdini拉取三维模型文件。如图5所示,基于Houdini重新切分的UV 之间没有任何重叠。
[0098] 在一个实施例中,通用流程向外暴露一些接口,如python节点。用户可以通过这些接口对通用流程进行参数配置。通用流程的设置可以一劳永逸,每次只需调用该通用流程就可实现模型处理自动化。基于预留接口又可以灵活调整通用流程中的参数,很好的兼顾了效率和灵活性。
[0099] 传统方式基于渲染引擎本身自带的减面功能进行减面,往往使合并模型产生瑕疵的可能性较高,因为自动减面以及利用合并后贴图的前提条件是保持UV 不变,而这与减面本身是矛盾的,往往贴图缺失或者拉伸,严重影响场景渲染效果。
[0100] 本实施例中,通过减面可以精简合并模型,进而减少加载合并模型所需的内存资源,有利于提高场景渲染效率。本实施例Houdini在对合并模型减面后重新对减面后的合并模型切分UV,相比传统的减面后合并模型与减面前合并模型共用一张贴图,自动减面和分UV具有较高鲁棒性。此外,在渲染引擎中提供控制面板,支持用户自由控制减面比例,具有较好的减面效果,使得经过减面的同时很好的保留了合并模型的整体外观形态,进而有助于提高场景渲染效果。
[0101] 在一个实施例中,加载每个物体所属物体组合对应的合并模型及模型贴图之前,方法还包括:在物体组合中每个物体第一目标层级的单体模型中提取光影数据;在各第一目标层级单体模型对应的模型贴图中提取固有色数据;将光影数据与固有色数据混合写入空白贴图中,得到合并模型的模型贴图。
[0102] 其中,固有色是物体本身所呈现的固有的色彩。习惯上把白色光源下物体呈现出的色彩效果总和称为固有色。固有色数据直接记录在二维的模型贴图中。空白贴图是指包括多个像素点但像素点所记录的数据为空的贴图。贴图烘焙可以理解为空白贴图中每个像素点填入烘焙数据的过程。烘焙数据可以是对光影数据和固有数据混合计算得到的数据。光影数据实质上也是一种颜色数据,因而可以对光影数据与固有色数据进行混合计算。
[0103] 具体地,渲染引擎以物体组合为单位进行光影数据提取。渲染引擎提取物体组合中每个物体的第一目标层级单体模型中提取光影数据,将提取到的光影数据进行融合处理,将融合得到的光影数据作为合并模型的光影数据。
[0104] 在一个实施例中,对光影数据融合的方法可以是在将物体组合中每个物体对应第一目标层级单体模型的纹理坐标对齐后,对相同位置像素点的像素值加权求和或加权求平均等计算得到。其中,纹理实际上是一个二维数组,它的元素是一些颜色值。单个颜色值被称为纹理元素或纹理像素。每个纹理元素在纹理中都有一个唯一的地址,该地址由一个行和列组成,分别用U,V表示,因而纹理坐标也可以称作“UV坐标”。UV坐标是指所有的图像文件都是二维的一个平面。水平方向是U,垂直方向是V,通过这个平面的,二维的UV坐标系,可以定位图像上的任意一个象素点。目前大多绘图软件规定了一个统一的UV坐标范围[0.0,1.0]。
[0105] 渲染引擎对第一目标层级的单体模型进行分UV处理,即将单体模型展开铺平至在一个二维平面上。渲染引擎通过UV映射,在模型贴图中查询单体模型中每个像素点的固有色信息。如上,UV是基于0到1区间上的二维坐标系。体积各异的单体模型均会被映射到一个[0,1]的平面上。比如,基于UV坐标[0.5,0.5] 可以在像素为512*512的模型贴图上读取第256行256列的像素点的固有色数据。
[0106] 渲染引擎对提取到的光影数据与固有色数据进行混合计算,得到烘焙数据。混合计算可以是通过一种或多种预设逻辑运算将多种数据转换为一种数据的过程。预设逻辑运算包括但不限于四则混合运算、加权求和、机器学习算法等。渲染引擎将烘焙数据写入合并模型对应的空白贴图中,得到合并模型的模型贴图。
[0107] 在一个实施例中,渲染引擎预置了一种或多种混合计算公式,并设定了参公式中每种参数因子的输入格式。光影数据与固有色数据分别作为一种参数因子,渲染引擎按照相应的输入格式对光影数据和固有色数据进行处理后,输入混合计算公式,得到烘焙数据。
[0108] 根据所记录的数据不同,模型贴图具有多种类型,如漫反射贴图、法线贴图、AO贴图、环境贴图、光照纹理及细节贴图。传统方式每种模型贴图只用于记录一种信息,如漫反射贴图用于记录漫反射数据。本方案将多种数据压缩存储至一张贴图,也就是说,基于一张模型贴图综合记录了多种数据。
[0109] 在一个实施例中,在导入场景数据至渲染引擎之后,用户只需布局好物体之间的位置关系,后续的物体分组、单体模型合并、合并模型优化、以及合并模型对应模型贴图的烘焙均自动完成。
[0110] 在一个实施例中,在用户布局好物体之间的位置关系后,终端可以将场景数据以及物体之间的位置关系提交至服务器,由服务器按照上述方式对物体分组、单体模型合并、合并模型优化、以及合并模型对应模型贴图的烘焙。
[0111] 本实施例中,将光影数据和固有色数据混合压缩在了一张模型贴图,在场景渲染时只需对合并模型进行一次贴图渲染,可以提高虚拟场景加载速度。预先离线烘焙好的合并模型的模型贴图,后续需要进行场景渲染时直接采用该模型贴图进行场景渲染即可,可以进一步提高虚拟场景加载速度。
[0112] 在一个实施例中,在物体组合中每个物体第一目标层级的单体模型中提取光影数据包括:通过对合并模型进行膨胀处理创建相应物体组合对应的包裹体;通过对物体第一目标层级单体模型进行复制,创建相应物体对应的碰撞体;触发在包裹体上每个像素点的位置向碰撞体发射射线;在射线提取所碰撞的碰撞体对应单体模型的光影数据。
[0113] 其中,包裹体(又称Cage)是对物体组合所对应合并模型HLOD向外膨胀扩展一定距离,以将物体组合中最大的第一目标层级单体模型完全包裹住而得到的三维模型。可以认为包裹体表面有一张空白贴图,该空白贴图中每个像素点均可作为包裹体的一个射线源。比如,假设空白贴图的尺寸为512*512,则具有 512*512个射线源。包裹体是为了计算射线投射位置和方向的原材料。
[0114] 值得说明的是,合并模型HLOD是将物体组合中全部物体的第二目标层级单体模型作为一个整体进行渲染,但合并模型HLOD中被合并的第二目标层级单体模型之间不一定是空间连续的。如此,合并模型对应的包裹体可能也是空间不连续的。参考图7A,图7A为一个实施例中基于碰撞体和包裹体将高等级模型的光影数据投射至低等级模型的原理示意图。在图7A中,三个粗线空心圆即代表物体组合(A,C,F)的包裹体。
[0115] 碰撞体是通过原地复制物体第一目标层级单体模型得到的三维模型。物体组合中每个物体具有对应的一个碰撞体。如图7A中,每个细线实心圆即代表物体组合(A、C、F)中一个物体的碰撞体,碰撞体与相应物体的目标层级单体模型在虚拟场景中的位置及外观一致。碰撞体仅用于烘焙数据的提取,在完成烘焙数据的提取后即可删除,以减少对内存资源的占用。
[0116] 具体地,当虚拟场景中包含多个合并模型HLOD时,需要提取每个合并模型的烘焙数据,分别为每个合并模型烘焙对应的模型贴图。对于多组物体逐组去烘焙,渲染引擎提前将需要烘焙的一个物体组合孤立出来,而将其他组物体组合隐藏。渲染引擎构建当前被孤立出的物体组合中每个物体的碰撞体,以及该物体组合对应的包裹体。渲染引擎根据包裹体的UV坐标,可以反向提取包裹体上每个像素点的法线信息和位置信息,将提取出的法线信息和位置信息写入包裹体表面的空白贴图中,得到一张初始贴图。初始贴图可以作为碰撞体的射线源。
[0117] 进一步地,渲染引擎触发在包裹体上每个像素点的位置向碰撞体发射射线。包裹体在初始贴图上每个像素点的位置朝着与法线相反的方向(即包裹体内部方向)向碰撞体发射射线。射线仅对碰撞体可见。碰撞体用于告诉渲染引擎哪些物体是可以被投射的高等级模型(即第一目标层级单体模型)。后续只需要针对这部分高等级模型进行投射即可,相比对每个单体模型进行投射,有效限缩了投射范围,可以提高投射效率,进而提高烘焙数据提取效率。
[0118] 射线在撞击到内部的碰撞体后即可将高等级模型上的光影数据投射到低等级的合并模型上。本实施例通过射线进行交点检测,取距离包裹体最近的一个交点所在的碰撞体的光影数据写入初始贴图,得到中间贴图。如此,包裹体上每个像素点投射的是物体组合中其中一个物体目标层级单体模型上一个像素点的光影数据。如图7A所示,射线X先碰撞到物体A对应的碰撞体,则包裹体上发出射线X的像素点记录物体A的光影数据。射线Y先碰撞到物体C对应的碰撞体,则包裹体上发出射线Y的像素点记录物体C光影数据。可以理解,图7A 只是为了方便理解给出的一种示意性原理图,实际物体的三维模型较小概率是一个平面圆形,不应当视作对本方案的一种限定。
[0119] 参考图7B,图7B为另一个实施例中基于碰撞体和包裹体将高等级模型的光影数据投射至低等级模型的原理示意图。包裹体沿着法线向内部发射射线进行光线追踪,提取第一目标层级单体模型上的光影数据。
[0120] 在一个实施例中,包裹体对应的用于确定射线投射方向的初始贴图包括位置贴图和法线贴图。位置贴图和法线贴图可以是渲染引擎中的shader着色器通过包围盒boundingbox取空间极值,将物体转换到UV象限,提取其空间位置和法线位置信息而生成的。
[0121] 本实施例中,通过对合并模型进行膨胀得到的包裹体向对物体第一目标层级单体模型进行复制得到的碰撞体发射射线的方式提取光影数据,由于射线均匀来自包裹体表面,可以均匀的投射得到碰撞体上,从而可以准确的将第一目标层级单体模型上的光影数据投射到合并模型上。
[0122] 在一个实施例中,光影数据包括光照数据和阴影数据;将光影数据与固有色数据混合写入空白贴图中,得到合并模型的模型贴图包括:生成合并模型对应的空白贴图;空白贴图包括颜色通道和阿尔法通道;根据阴影数据对光照数据与固有色数据进行混合运算,得到第一混合结果;将第一混合结果写入颜色通道,将阴影数据写入阿尔法通道,得到合并模型对应的模型贴图。
[0123] 其中,颜色通道(又称RGB通道)是用于存放图像中颜色信息的数组。每个图像具有一个或多个RGB通道,默认的RGB通道数取决于其颜色模式,即一个图像的颜色模式将决定其RGB通道的数量。每个RGB通道都存放着图像的颜色信息。所有RGB通道中的颜色叠加混合产生图像中像素的颜色。RGB通道包括 R通道、G通道和B通道。阿尔法通道(又称Alpha通道)是用于存放图像的透明和半透明度信息的数组。理论上每个模型贴图具有R通道、G通道、B通道和 Alpha通道中的至少一个通道。每个通道用来存一个维度的信息。基于不同的通道记录不同的数据是为了便于数据读写。
[0124] 具体地,如上文,在高等级模型中提取的光影数据记录在中间贴图中。中间贴图在R通道记录了存储天光数据,在G通道存储了地光数据,在B通道存储了阴影数据。渲染引擎构建合并模型对应的空白贴图。该空白贴图是具有RGB 通道和Alpha通道的四通道模型贴图。渲染引擎对中间贴图中天光数据、地光数据与在高等级模型中提取的固有色数据进行混合运算,将混合结果记录至RGB 通道,将阴影数据写入Alpha通道,得到合并模型的模型贴图。值得注意的是,这里基于RGB通道记录一个固有色数据,不再区分R通道、G通道和B通道。
[0125] 在一个实施例中,生成合并模型对应的空白贴图包括:根据合并模型的表面积确定贴图尺寸;生成与贴图尺寸相匹配的空白贴图。
[0126] 根据不同虚拟场景所要求的像素精度(清晰度)不同,对应模型贴图的贴图尺寸可能一直在变化,如1024*1024,2048*2048等。理论上虚拟场景中全部物体的模型贴图可以设定相同的贴图尺寸,但虚拟场景中不同物体是大小不一的。不同尺寸的模型贴图需要占用的CPU和GPU资源是不同的。针对大小不一的物体分配相同尺寸的贴图势必会造成内存资源的浪费。
[0127] 渲染引擎计算合并模型中每个面的表面积,对全部面的表面积求和,得到合并模型总的表面积。渲染引擎将合并模型总的表面积输入预设的转换公式,输出得到合并模型对应模型贴图的贴图尺寸。如此,可以确定虚拟场景中各个合并模型所对应模型贴图分别对应的贴图尺寸。根据模型表面积确定贴图尺寸,可以实现按需分配渲染资源,也可以避免不同大小的物体在渲染精度上不统一的问题。
[0128] 本实施例中,预先提取出美术制作的三维模型和二维贴图的光影数据,并将这些光影数据提前整理写入一张贴图,等到虚拟场景加载的时候直接用即可,相比在真正场景渲染时实时去取高等级模型光影数据,大大提高虚拟场景加载速度。此外,混合运算可以将光影数据与固有色数据压缩在了一张模型贴图中,相比基于不同贴图记录不同的数据,可以减少贴图数量,进而减少CPU和GPU 调用次数,进而减少Drawcall提交量,进一步提高了虚拟场景加载速度。
[0129] 在一个实施例中,根据阴影数据对光照数据和固有色数据进行混合运算,得到第一混合结果包括:对光照数据进行灰度转换,得到遮蔽数据;对阴影数据与固有色数据进行第一逻辑运算,得到顺光数据;对阴影数据、固有色数据以及遮蔽数据进行第二逻辑运算,得到背光数据;对顺光数据与背光数据进行混合运算,得到第一混合结果。
[0130] 其中,灰度转换是指根据某种目标条件按一定变换关系逐点改变源图像中每一个像素灰度值的方法。中间贴图所记录的在高等级模型中提取的光影数据中,光线都是有颜色的,即包括光照色彩数据,如天光为蓝色,太阳光为黄色等。本实施例对中间贴图进行去色处理,转换为灰度图,也就是将彩色贴图转化为黑白贴图。如此可以减少内存占用。此外,基于灰度图可以实现任意颜色的变换。渲染引擎滤除光照数据中的色彩数据后,可以得到遮蔽数据。遮蔽数据包括光照的强度等数据。第一逻辑运算与第二逻辑运算分别可以是四则运算、加权求和等。
[0131] 具体地,渲染引擎根据中间贴图中阴影数据可以区分合并模型中阴影部分和非阴影部分。阴影部分处于合并模型中的背光面,非阴影部分处于合并模型中的顺光面。由于在背光面的主光为天光和地光等间接光,而在顺光面的主光为太阳光,间接光的比例较低。在本申请的实施例,渲染引擎在背光面保留遮蔽数据,而在顺光面则不保留遮蔽数据。如此,可以使虚拟场景中在背光面的物体具有不同程度的遮蔽。虽然在顺光面过滤遮蔽数据,损失了虚拟场景在顺光面的遮蔽数据,但因为顺光面的光照中间接光的比例本身很小,对场景渲染效果的影响可以忽略。
[0132] 在一个实施例中,对阴影数据与固有色数据进行第一逻辑运算,得到顺光数据的步骤包括:将固有色数据M与阴影数据Z相乘,将乘积M*Z确定为顺光数据。RGB通道所记录固有色数据M可以是(R,G,B),如(0.44,0.63,0.68)。
[0133] 在一个实施例中,对阴影数据、固有色数据以及遮蔽数据进行第二逻辑运算,得到背光数据的步骤包括:将固有色数据M、遮蔽数据(X+Y)及非阴影数据(1-Z)相乘,将乘积M*(X+Y)*(1-Z)确定为背光数据;其中,X为去色后的天光数据,Y为去色后的地光数据。
[0134] 在一个实施例中,对顺光数据与背光数据进行混合运算,得到第一混合结果的步骤包括:将顺光数据M*Z与背光数据M*(X+Y)*(1-Z)相加,将相加结果M*Z+M*(X+Y)*(1-Z)确定为第一混合结果。其中,M、X、Y及Z分别为映射至UV坐标系介于0至1之间的数据。
[0135] 在一个实施例中,在虚拟场景渲染时,渲染引擎基于每个物体的单体模型、合并模型以及预烘焙的模型贴图渲染展示初始的目标页面后。随着用户对虚拟场景的切换控制操作,渲染引擎动态提取每个物体的法线方向数据,计算法线方向与地面方向的夹角。渲染引擎可以根据预先存储夹角与光照强度的对应关系,确定当前物体所需的光照强度,可以将该光照强度参数提交至CPU。GPU根据CPU缓存的光照强度参数动态调整相应物体的关照强度。换言之,虽然模型贴图是预先烘焙的,但实际场景渲染阶段,仍可以对模型贴图中光线强度动态调整。
[0136] 上述混合算法逻辑简单,能够保证烘焙数据计算效率。此外,为了保证虚拟场景加载速度,将更多有效的信息压缩至模型贴图,该混合算法对阴影数据进行了取舍,仅在背光面保留遮蔽数据,可以在尽可能小的影响顺光面渲染效果的同时使物体表面光线过渡的更加平滑。需要说明的是,上述混合算法只是提供了一种如何将光影数据和固有色数据整合在一起的思路,本领域技术人员可以采用任何其他能够将光影数据和固有色数据整合在一起的方法。
[0137] 本实施例中,基于该混合算法可以调整光线组成比例,使低等级的合并模型的模型贴图效果更加贴近高等级的单体模型的模型贴图效果。此外,预先提取烘焙数据,并将烘焙数据存储至一张贴图中,该贴图相当于预先复制了正确答案,在场景渲染时无需临时计算烘焙数据,在提升场景渲染效果的同时,保证了虚拟场景加载速度。
[0138] 在一个实施例中,上述场景渲染方法还包括:在第一目标层级单体模型对应的模型贴图中提取法线方向数据;将法线方向数据与预先指定的主光方向数据进行点乘运算;对点乘结果与阴影数据进行混合运算,得到第二混合结果;将第二混合结果写入颜色通道。
[0139] 在基于OpenGL ES等技术将不同物体的三维模型和模型贴图渲染展示为虚拟场景时,渲染引擎首先将物体对应的单体模型或合并模型放置在局部空间(又称物体空间)。局部空间是以三维模型的中心点为原点的三维空间,具体可以是以三维模型的中心点为原点的三维空间。后续对三维模型的所有位置调整都是基于局部空间的相对位置去调整的。渲染引擎基于世界矩阵将三维模型从局部空间平移旋转至世界空间中的某个位置上。世界空间是以虚拟摄像机所在位置为原点,以虚拟摄像机的拍摄方向为-z轴方向的三维空间。三维模型必须在用户的视野之内。
[0140] 其中,根据所在三维空间不同,对应三维模型的法线不同。比如,在局部空间的法线可以称为模型法线,在世界空间的法线可以称为世界法线 worldNormal。主光是在虚拟场景中起到重要照明作用的光线。主光的方向可以是用户预先指定的。
[0141] 具体地,目标层级的单体模型对应的模型贴图可以有多个,如漫反射贴图、法线贴图。法线贴图是以面的法线作为X轴,面的切线作为Y轴的三维坐标系。渲染引擎从法线贴图和模型法线中提取目标层级单体模型的世界法线 worldNormal。渲染引擎获取用户预先配置的主光的方向数据lightDir。渲染引擎将世界法线方向数据worldNormal与预先指定的主光方向数据lightDir进行点乘运算,由此提取出漫反射贴图中的阴影数据dot(worldNormal,lightDir)。渲染引擎将目标层级单体模型对应漫反射贴图中的阴影数据dot(worldNormal; lightDir)与目标层级单体模型中提取出的记录在Alpha通道的阴影数据shadow 进行混合运算,得到第二混合结果。
[0142] 在一个实施例中,对点乘结果与阴影数据进行混合运算,得到第二混合结果的步骤包括:将漫反射贴图中的阴影数据dot(worldNormal,lightDir)与 Alpha通道的阴影数据shadow相乘,将乘积dot(worldNormal,lightDir) *shadow确定为第二混合结果。
[0143] 进一步地,渲染引擎将第二混合结果与第一混合结果一并写入合并模型所对应空白贴图的RGB通道,得到投射了高等级的单体模型丰富光影信息的模型贴图。在一个实施例中,也可以将第一混合结果与第二混合结果进行混合后,将混合结果写入合并模型所对应空白贴图的RGB通道。
[0144] 本实施例中,进一步将来自第一目标层级单体模型的模型贴图的阴影数据与来自第一目标层级单体模型的阴影数据混合写入合并模型的模型贴图,可以在合并模型的模型贴图上保留更多的光影细节。
[0145] 在一个实施例中,上述场景渲染方法还包括:确定在加载模型贴图时为模型贴图分配内存的内存分配粒度;根据内存分配粒度确定模型贴图的目标尺寸;对场景中贴图尺寸小于目标尺寸的模型贴图进行合并,得到一个或多个贴图尺寸等于目标尺寸的目标贴图。
[0146] 其中,在虚拟场景渲染时,渲染引擎加载预先绘制及烘焙的各物体的单体模型、合并模型及分别对应的模型贴图。每加载一个三维模型或模型贴图进行一次内存资源分配。通常终端等量分配内存,即无论所加载模型或模型贴图的数据量大小,每次分配等量的内存资源。比如,贴图尺寸只有32*32甚至更小的模型贴图在加载时可能会分配128KB的内存,造成内存资源浪费。内存分配粒度是指每次为所分配的内存资源分配值,如128KB、256KB或
1024KB等。不同终端类型对应的内存分配粒度可能不同。
[0147] 具体地,渲染引擎确定所在终端的内存分配粒度,并将内存分配粒度转换为单次加载模型贴图的目标尺寸。在一个实施例中,预存储了多种内存分配粒度与模型贴图目标尺寸的对应关系。如基于512KB的内存可以加载的最大模型贴图的贴图尺寸为512*512,则规定单次加载模型贴图的目标尺寸为512*512。
[0148] 模型贴图可以是不同像素级的正方形贴图,如128*128、256*256、512*512、 1024*1024等像素级。渲染引擎识别贴图尺寸小于目标尺寸的模型贴图。对于贴图尺寸小于目标尺寸的模型贴图,四个相同像素级的模型贴图可以合并为一个高一像素级的模型贴图。比如,4张512*512的模型贴图可以合并为拼成1张 1024*1024的模型贴图,4张256*256的模型贴图可以合并为1张512*512的模型贴图。渲染引擎按照方式将尽可能多的碎小模型贴图打包成大模型贴图,最终得到的模型贴图可能包括无需合并的贴图尺寸本身大于目标尺寸的模型贴图,经过合并后贴图尺寸为目标尺寸的模型贴图,以及即使经过合并也难以达到目标尺寸的模型贴图中的至少一种。经过合并后贴图尺寸为目标尺寸的模型贴图可以称作目标贴图。
[0149] 在一个实施例中,渲染引擎根据贴图尺寸,对虚拟场景中每个物体对应的多层级单体模型的模型贴图和合并模型对应的模型贴图进行排序,将连续的预设数量模型贴图分为一组,并发对每个组内的模型贴图执行合并操作,将每个组合并后贴图尺寸仍旧小于目标尺寸的模型贴图重新分为一个或多个组,如此重复直至获得最多的贴图尺寸为目标尺寸的模型贴图。如此目标数量可以是4 的整数倍,如16。如此可以并发对多组模型贴图进行合并,大大提高模型贴图合并效率。
[0150] 值得说明的是,在本申请的实施例中,合并的方式可以对多个模型贴图进行打包,并不需要进行实质的模型贴图拼接操作。如此,在虚拟场景加载时,既可以将多个模型贴图以数据包的方式一次性提交给CPU,终端侧也可以实现拆包即用,而无需对模型贴图进行分解,在提高内存资源利用率的同时并未增加终端的加载负担,很好的保证了虚拟场景加载速度。
[0151] 本实施例中,根据所分配内存能够承载的最大尺寸模型贴图,将尽可能多的碎小模型贴图打包成大模型贴图,可以充分利用所分配的内存资源。
[0152] 在一个具体的实施例中,参考图8,图8示出了一个实施例中合并单体模型以及烘焙模型贴图的流程示意图。如图8所示,在准备虚拟场景的场景素材时,将预准备的各个物体的多层级单体模型LOD导入渲染引擎unity,并在unity对各物体进行布局,搭建得到初始的虚拟场景。unity根据物体的体积以及与其他物体之间的位置关系,以及用户预先在unity设定好的对物体分组的分组区域半径自动对各个物体分组,得到一个或多个物体组合。unity将物体组合中每个物体的第二目标层级单体模型合并,得到相应物体组合对应的合并模型HLOD。 unity调用Houdini触发脚本,自动将合并模型HLOD导入至Houdini。unity也可以将物体组合中每个物体的第二目标层级单体模型发送至Houdini,由 Houdini合并得到相应合并模型。Houdini按照用户预先在unity设定好的对合并模型进行减面的减面比例对每个合并模型进行减面处理。Houdini对减面后的合并模型中的零散碎面进行清理,并对清理后的合并模型重新切分UV。Houdini 将减面及重新分UV的合并模型导回unity。
[0153] unity计算合并模型的表面积,根据该表面积确定合并模型所对应的模型贴图的贴图尺寸。unity生成与贴图尺寸对应的空白贴图。unity构建物体组合中每个物体第一目标层级单体模型所对应的碰撞体,以及能够将各膨胀体包围的包裹体。基于包裹体向碰撞体发射射线,基于碰撞体反射的射线可以投射得到第一目标层级单体模型的光影数据。unity将空白贴图和光影数据提交至CPU。 GPU接收到CPU的烘焙指令后,将光影数据烘焙至空白贴图,得到合并模型的模型贴图。unity对各个物体的单体模型所对应的模型贴图以及烘焙得到的每个合并模型的模型贴图中,贴图尺寸小于目标尺寸的碎小贴图进行合并,对合并后的合并模型以及模型贴图进行存储,以备实际虚拟场景渲染时所用。
[0154] 在一个具体的实施例中,如图9所示,本申请提供的场景渲染方法包括:
[0155] S902,获取场景数据;场景数据包括场景渲染所需的每个物体分别对应的多层级单体模型以及各层级单体模型对应的模型贴图。
[0156] S904,根据物体的体积确定对每个物体执行分组操作的顺序。
[0157] S906,确定当前顺序的物体的分组区域。
[0158] S908,将位于分组区域内的每个物体与当前顺序的物体划分为一个物体组合。
[0159] S910,当下一顺序的物体尚未被划分至物体组合时,将下一顺序的物体作为当前顺序的物体进行迭代,直至最后顺序的物体。
[0160] S912,将每个物体组合中各物体的第二目标层级单体模型进行合并,得到相应物体组合所对应初始的合并模型。
[0161] S914,根据初始合并模型的纹理坐标和法线对初始合并模型进行减面处理。
[0162] S916,重新确定减面后合并模型的纹理坐标和法线,得到相应物体组合所对应目标的合并模型。
[0163] S918,通过对合并模型进行膨胀处理创建相应物体组合对应的包裹体。
[0164] S920,通过对物体第一目标层级单体模型进行复制,创建相应物体对应的碰撞体。
[0165] S922,触发在包裹体上每个像素点的位置向碰撞体发射射线。
[0166] S924,在射线中提取所碰撞的碰撞体对应单体模型的光影数据。
[0167] S926,在各第一目标层级单体模型对应的模型贴图中提取固有色数据。
[0168] S928,生成合并模型对应的空白贴图;空白贴图包括颜色通道和阿尔法通道。
[0169] S930,对光照数据进行灰度转换,得到遮蔽数据。
[0170] S932,对阴影数据与固有色数据进行第一逻辑运算,得到顺光数据。
[0171] S934,对阴影数据、固有色数据以及遮蔽数据进行第二逻辑运算,得到背光数据。
[0172] S936,对顺光数据与背光数据进行混合运算,得到第一混合结果。
[0173] S938,在第一目标层级单体模型对应的模型贴图中提取法线方向数据。
[0174] S940,将法线方向数据与预先指定的主光方向数据进行点乘运算。
[0175] S942,对点乘结果与阴影数据进行混合运算,得到第二混合结果。
[0176] S944,将第一混合结果及第二混合结果写入颜色通道,将阴影数据写入阿尔法通道,得到合并模型对应的模型贴图。
[0177] S946,确定在加载模型贴图时为模型贴图分配内存的内存分配粒度。
[0178] S948,根据内存分配粒度确定模型贴图的目标尺寸。
[0179] S950,对场景中贴图尺寸小于目标尺寸的模型贴图进行合并,得到一个或多个贴图尺寸等于目标尺寸的目标贴图。
[0180] S952,当发生场景渲染触发操作时,加载场景渲染所需的每个物体对应的多层级单体模型、每个物体所属物体组合对应的合并模型以及目标贴图;目标贴图包括一个或多个模型贴图;合并模型的模型贴图记录了相应物体组合中各物体的第一目标层级单体模型的光影数据;合并模型合并了相应物体组合中各物体的第二目标层级单体模型。
[0181] S954,确定位于虚拟摄像机拍摄范围内的每个物体与虚拟摄像机的距离。
[0182] S956,根据距离确定相应物体在目标页面的显示层级。
[0183] S958,基于显示层级从加载的场景渲染所需的多层级三维模型和模型贴图中确定显示层级对应的三维模型和模型贴图。
[0184] S960,基于显示层级的三维模型及对应模型贴图在目标页面渲染相应物体。
[0185] 上述场景渲染方法,基于多层级三维模型综合渲染展示一个物体,可以使位于虚拟摄像机拍摄范围内的每个物体无论从任何位置观察均有对应的模型得以展示,所在位置均不为空,即物体均未被裁剪,可以扩大虚拟场景的视距范围;由于三维模型的模型贴图记录有其他层级模型的光影数据,可以将光影数据投射在本不具备光影数据的三维模型上,可以使物体具有很好的光影效果,提升场景渲染效果。由于是将光影数据预先记录在了一张模型贴图中,在场景渲染时只需对三维模型进行一次贴图渲染,且模型贴图可以是预先离线烘焙好的,无需临时计算光影数据,随取随用即可,进而可以保证虚拟场景加载速度。
[0186] 本实施例中,采样少,只要一张以漫反射为主的模型贴图,即可大致表现静态全局光照以及阴影数据;此外,可以实现高度自动化,从模型分组到贴图烘焙,均自动进行,尽可能减少人工干预,操作者只需在渲染引擎中导入初始的场景素材,即可得到最终的烘焙结果。由于烘焙解雇保留了全局信息,使合并模型最终呈现效果非常接近原始模型,并与场景中其他物体的关系非常融洽,大大提升了场景渲染效果。
[0187] 图2和图9为一个实施例中场景渲染方法的流程示意图。应该理解的是,虽然图2和图9的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2和图9中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
[0188] 在一个实施例中,如图10所示,本申请还提供了一种场景渲染装置1000。场景渲染装置1000包括模型及贴图加载模块1002、模型选定模块1004和场景渲染模块1006,其中,[0189] 模型及贴图加载模块1002,用于加载场景渲染所需的每个物体对应的多层级三维模型和模型贴图,符合投射条件的三维模型所对应模型贴图投射了第一目标层级三维模型的光影数据;
[0190] 模型选定模块1004,用于确定位于虚拟摄像机拍摄范围内的每个物体与虚拟摄像机的距离;根据距离确定相应物体在目标页面的显示层级;
[0191] 场景渲染模块1006,用于基于显示层级从加载的场景渲染所需的多层级三维模型和模型贴图中确定显示层级对应的三维模型和模型贴图,基于显示层级的三维模型及对应模型贴图在目标页面渲染相应物体。
[0192] 在一个实施例中,三维模型包括单体模型和合并模型;符合投射条件的三维模型包括合并模型;模型及贴图加载模块1002还用于加载场景渲染所需的每个物体对应的多层级单体模型及模型贴图;加载每个物体所属物体组合对应的合并模型及模型贴图;合并模型的模型贴图记录了相应物体组合中各物体的第一目标层级单体模型的光影数据;合并模型合并了相应物体组合中各物体的第二目标层级单体模型。
[0193] 在一个实施例中,场景渲染模块1006还用于当显示层级为近景层级时,基于物体对应显示层级的单体模型和模型贴图渲染相应物体;当显示层级从近景层级切换至远景层级时,裁剪物体所属物体组合中每个物体的单体模型和模型贴图,基于物体对应的合并模型以及合并模型对应的模型贴图渲染相应物体组合。
[0194] 在一个实施例中,如图11所示,场景渲染装置1000还包括模型合并模块 1008,用于获取场景数据;场景数据包括场景渲染所需的每个物体分别对应的多层级单体模型以及各层级单体模型对应的模型贴图;根据物体的体积以及物体之间的位置关系对各个物体进行分组,得到至少一个物体组合;将每个物体组合中各物体的第二目标层级单体模型进行合并,得到相应物体组合对应的合并模型。
[0195] 在一个实施例中,模型合并模块1008包括自动分组模块10082,用于根据物体的体积确定对每个物体执行分组操作的顺序;确定当前顺序的物体的分组区域;将位于分组区域内的每个物体与当前顺序的物体划分为一个物体组合;当下一顺序的物体尚未被划分至物体组合时,将下一顺序的物体作为当前顺序的物体进行迭代,直至最后顺序的物体。
[0196] 在一个实施例中,模型合并模块1008还包括减面优化模块10084,用于将每个物体组合中各物体的第二目标层级单体模型进行合并,得到相应物体组合所对应初始的合并模型;根据初始合并模型的纹理坐标和法线对初始合并模型进行减面处理;重新确定减面后合并模型的纹理坐标和法线,得到相应物体组合所对应目标的合并模型。
[0197] 在一个实施例中,场景渲染装置1000还包括贴图烘焙模块1010,用于在物体组合中每个物体第一目标层级的单体模型中提取光影数据;在各第一目标层级单体模型对应的模型贴图中提取固有色数据;将光影数据与固有色数据混合写入空白贴图中,得到合并模型的模型贴图。
[0198] 在一个实施例中,贴图烘焙模块1010包括光影投射模块10102,用于通过对合并模型进行膨胀处理创建相应物体组合对应的包裹体;通过对物体第一目标层级单体模型进行复制,创建相应物体对应的碰撞体;触发在包裹体上每个像素点的位置向碰撞体发射射线;在射线中提取所碰撞的碰撞体对应单体模型的光影数据。
[0199] 在一个实施例中,光影数据包括光照数据和阴影数据;贴图烘焙模块1010 还包括数据压缩存储模块10104,用于生成合并模型对应的空白贴图;空白贴图包括颜色通道和阿尔法通道;根据阴影数据对光照数据与固有色数据进行混合运算,得到第一混合结果;将第一混合结果写入颜色通道,将阴影数据写入阿尔法通道,得到合并模型对应的模型贴图。
[0200] 在一个实施例中,数据压缩存储模块10104还用于对光照数据进行灰度转换,得到遮蔽数据;对阴影数据与固有色数据进行第一逻辑运算,得到顺光数据;对阴影数据、固有色数据以及遮蔽数据进行第二逻辑运算,得到背光数据;对顺光数据与背光数据进行混合运算,得到第一混合结果。
[0201] 在一个实施例中,数据压缩存储模块10104还用于在第一目标层级单体模型对应的模型贴图中提取法线方向数据;将法线方向数据与预先指定的主光方向数据进行点乘运算;对点乘结果与阴影数据进行混合运算,得到第二混合结果;将第二混合结果写入颜色通道。
[0202] 在一个实施例中,上述场景渲染装置1000还包括贴图合并模块1012,用于确定在加载模型贴图时为模型贴图分配内存的内存分配粒度;根据内存分配粒度确定模型贴图的目标尺寸;对场景中贴图尺寸小于目标尺寸的模型贴图进行合并,得到一个或多个贴图尺寸等于目标尺寸的目标贴图。
[0203] 上述场景渲染装置,基于多层级三维模型综合渲染展示一个物体,可以使位于虚拟摄像机拍摄范围内的每个物体无论从任何位置观察均有对应的模型得以展示,所在位置均不为空,即物体均未被裁剪,可以扩大虚拟场景的视距范围;由于三维模型的模型贴图记录有其他层级模型的光影数据,可以将光影数据投射在本不具备光影数据的三维模型上,可以使物体具有很好的光影效果,提升场景渲染效果。由于是将光影数据预先记录在了一张模型贴图中,在场景渲染时只需对三维模型进行一次贴图渲染,且模型贴图可以是预先离线烘焙好的,无需临时计算光影数据,随取随用即可,进而可以保证虚拟场景加载速度。
[0204] 图12示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是图1中的终端110。如图12所示,该计算机设备包括该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、输入装置和显示屏。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现场景渲染方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行场景渲染方法。计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
[0205] 本领域技术人员可以理解,图12中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
[0206] 在一个实施例中,本申请提供的场景渲染装置可以实现为一种计算机程序的形式,计算机程序可在如图12所示的计算机设备上运行。计算机设备的存储器中可存储组成该场景渲染装置的各个程序模块,比如,图10所示的模型及贴图加载模块、模型选定模块和场景渲染模块。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的场景渲染方法中的步骤。
[0207] 例如,图12所示的计算机设备可以通过如图10所示的场景渲染装置中的模型及贴图加载模块执行步骤S202。计算机设备可通过模型选定模块执行步骤 S204和S206。计算机设备可通过场景渲染模块执行步骤S208和S210。
[0208] 在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述场景渲染方法的步骤。此处场景渲染方法的步骤可以是上述各个实施例的场景渲染方法中的步骤。
[0209] 在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述场景渲染方法的步骤。此处场景渲染方法的步骤可以是上述各个实施例的场景渲染方法中的步骤。
[0210] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM) 或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态 RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
[0211] 以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0212] 以上实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。