CN111798558A - 数据处理方法及装置 - Google Patents

数据处理方法及装置 Download PDF

Info

Publication number
CN111798558A
CN111798558A CN202010489944.5A CN202010489944A CN111798558A CN 111798558 A CN111798558 A CN 111798558A CN 202010489944 A CN202010489944 A CN 202010489944A CN 111798558 A CN111798558 A CN 111798558A
Authority
CN
China
Prior art keywords
region
sub
instance
node
rendering
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202010489944.5A
Other languages
English (en)
Inventor
姜明余
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Perfect World Beijing Software Technology Development Co Ltd
Original Assignee
Perfect World Beijing Software Technology Development Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Perfect World Beijing Software Technology Development Co Ltd filed Critical Perfect World Beijing Software Technology Development Co Ltd
Priority to CN202010489944.5A priority Critical patent/CN111798558A/zh
Priority to PCT/CN2020/112547 priority patent/WO2021243862A1/zh
Publication of CN111798558A publication Critical patent/CN111798558A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T17/00Three dimensional [3D] modelling, e.g. data description of 3D objects
    • G06T17/005Tree description, e.g. octree, quadtree
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management

Landscapes

  • Physics & Mathematics (AREA)
  • Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Graphics (AREA)
  • Geometry (AREA)
  • Software Systems (AREA)
  • Image Generation (AREA)

Abstract

本申请实施例提供一种数据处理方法及装置,涉及计算机应用技术领域。其中,将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;按照多个子区域的嵌套关系,构建四叉树;在四叉树的每个节点中存储其对应子区域的实例缓存数据,其中,实例缓存数据包括子区域中的各个对象实例的渲染数据;该四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。本申请实施例提供的技术方案提高了渲染效率。

Description

数据处理方法及装置
技术领域
本申请实施例涉及计算机应用技术领域,尤其涉及一种数据处理方法及装置。
背景技术
随着图像处理技术的不断提升,很多场景中的物体可以在显示设备中进行渲染显示。
对于场景中重复数量较多、密度较大的物体,如草、石块等,以草为例,进行草地渲染时是将草地均匀划分为多个草地块,CPU根据每个草地块中包含的草实例的渲染数据生成一次绘制命令,以调用GPU基于该渲染数据进行一次草实例的渲染。由于草地块的数量较多,每一个草地块对应一次绘制命令,导致绘制命令的数量较多。而大量的绘制命令会造成CPU过载,进而影响渲染效率。
发明内容
本申请实施例提供一种数据处理方法及装置、渲染方法及装置,用以解决现有技术中渲染数量较多、密度较大的物体时,CPU发起绘制命令的数量较多,导致CPU过载,影响渲染效率的问题。
本发明的第一方面提供了一种数据处理方法,该方法包括:
将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;
按照所述多个子区域的嵌套关系,构建所述四叉树;
在所述四叉树的每个节点中存储其对应子区域的实例缓存数据,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
本发明的第二方面提供了一种数据处理方法,该方法包括:
将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;
按照所述多个子区域的嵌套关系,构建所述四叉树;
在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域以确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
本发明的第三方面提供了一种渲染方法,该方法包括:
确定待渲染区域对应的四叉树;其中,所述待渲染区域预先按照所述四叉树的树形结构进行网格划分获得多个子区域;所述四叉树基于所述多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据或者所述缓存数据对应的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
基于每个目标子区域对应的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
本发明的第四方面提供了一种数据处理装置,该装置包括:
划分模块,用于将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;
构建模块,用于按照所述多个子区域的嵌套关系,构建所述四叉树;
第一存储模块,用于在所述四叉树的每个节点中存储其对应子区域的实例缓存数据,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
本发明的第五方面提供了一种数据处理装置,该装置包括:
划分模块,用于将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;
构建模块,用于按照所述多个子区域的嵌套关系,构建所述四叉树;
第二存储模块,用于在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域以确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
本发明的第六方面提供了一种渲染装置,该装置包括:
第三确定模块,用于确定待渲染区域对应的四叉树;其中,所述待渲染区域预先按照所述四叉树的树形结构进行网格划分获得多个子区域;所述四叉树基于所述多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据或者所述缓存数据对应的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
第三遍历模块,用于遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
第三发送模块,用于基于每个目标子区域对应的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
本发明中,构建四叉树,并在四叉树的每个节点中存储其对应子区域的实例缓存数据,也即若某一节点有连接的孩子节点时,该节点中可以存储其连接的各孩子节点中所存储的实例缓存数据。在进行对象实例渲染时,遍历该四叉树中每个节点对应的子区域以确定位于视野范围内的目标子区域,基于目标子区域对应节点存储的实例缓存数据,发起一次绘制命令。通过将实例缓存数据进行合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行渲染,减少了绘制命令的次数,避免发生CPU过载的情况,提高了渲染效率。
本发明的这些方面或其他方面在以下实施例的描述中会更加简明易懂。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例的一种数据处理方法的一个实施例的流程图;
图1-1是本发明实施例的四叉树划分空间示意图;
图1-2是本发明实施例的四叉树构建示意图;
图2是本发明实施例的一种渲染方法的一个实施例的流程图;
图2-1是本发明实施例的四叉树的一个遍历示意图;
图2-2是本发明实施例的四叉树的另一个遍历示意图;
图3是本发明实施例的一种数据处理方法的另一个实施例的流程图;
图4是本发明实施例的一种渲染方法的另一个实施例的流程图;
图5是本发明实施例的一种渲染方式的另一个实施例的流程图;
图6是本发明实施例的一种渲染方法的另一个实施例的流程图;
图7是本发明实施例的一种数据处理装置的一个实施例的结构示意图;
图8是本发明实施例的一种渲染装置的一个实施例的结构示意图;
图9是本发明实施例的一种数据处理装置的另一个实施例的结构示意图;
图10是本发明实施例的一种渲染装置的另一个实施例的结构示意图;
图11是本发明实施例的一种渲染装置的另一个实施例的结构示意图;
图12是本发明实施例的一种渲染装置的另一个实施例的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。
在本申请的说明书和权利要求书及上述附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如101、102等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
本发明实施例主要适用于场景中数量较多、密度较大的物体的渲染,如草、石块等。以草为例,现有技术中,进行草地渲染时通常是将草地均匀划分为多个区域,CPU根据每个区域中包含的草实例的渲染数据生成一次绘制命令,以调用GPU基于该渲染数据进行一次草实例的渲染。
对于草地中的草来说,进行草地渲染时,草地中的一棵草对应一个草实例,对草地中的草实例进行渲染即可以完成对草地的渲染。现有技术中,进行草地渲染时,通常是采用将草地均匀划分为草地块的方式,获得多个草地块。每一个草地块中通常包含多个草实例。CPU根据每个草地块中包含的草实例的渲染数据生成一次绘制命令,并将绘制命令发送至GPU,以调用GPU基于该渲染数据进行一次渲染,直至完成该草地中所有草地块的草实例的渲染。
但是,发明人在实现本发明的过程中发现,现有技术的方案中,每一个草地块对应一次绘制命令,导致绘制命令的数量较多。而大量的绘制命令会造成CPU过载,进而影响渲染效率。为了提高渲染效率,发明人经过一系列研究提出了本申请的技术方案,在本申请实施例中,将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;按照所述多个子区域的嵌套关系,构建所述四叉树;在所述四叉树的每个节点中存储其对应子区域的实例缓存数据,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;进行渲染时,遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
构建四叉树,并在四叉树的每个节点中存储其对应子区域的实例缓存数据,也即若某一节点有连接的孩子节点时,该节点中可以存储其连接的各孩子节点中所存储的实例缓存数据。在进行对象实例渲染时,遍历该四叉树中每个节点对应的子区域以确定位于视野范围内的目标子区域,基于目标子区域对应节点存储的实例缓存数据,发起一次绘制命令。通过将实例缓存数据进行合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行渲染,减少了绘制命令的次数,避免发生CPU过载的情况,提高了渲染效率。
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
如图1所示,为本发明实施例提供的一种数据处理方法一个实施例的流程图,该方法可以包括以下几个步骤:
101:将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域。
四叉树是一种树状数据结构,用于存储、组织场景空间中的数据。遍历四叉树,对四叉树中存储的数据进行渲染,可以实现对场景区域的渲染。四叉树以递归的方式将场景空间进行分割,获得多个子区域。每层递归以四叉树的节点表示,每个节点最多有四个子节点。每个子节点代表一个子区域,用于存储该子区域中的数据。
在实际场景中,以待渲染区域是草地为例,如图1-1中所示,A表示草地,即待渲染区域,将A区域按照四叉树的树形结构进行网格划分,得到a,b,c,d四个子区域,再以递归的方式将a子区域进行划分,得到a1,a2,a3,a4四个子区域,依次进行,获得多个子区域。
102:按照所述多个子区域的嵌套关系,构建所述四叉树。
由于四叉树是按照递归的方式对场景空间进行划分,以获得多个子区域,则多个子区域之间具有嵌套关系。按照该嵌套关系,可以完成四叉树的构建。
在实际场景中,图1-1示出了按照四叉树结构进行的网格划分,参见图1-2中所示,为基于图1-1划分获得的子区域构建形成的四叉树,其中,节点1对应于区域A,节点2-5分别对应于子区域a-d,节点6-9分别对应于子区域a1-a4。对应于多个子区域的嵌套关系,多个节点之间也具有父与子的连接关系。
四叉树中存在一个根节点,是该四叉树中除自身外所有节点的祖先,没有父节点,如图1-2中所示的节点1。通常情况下,可以将待渲染区域的整个区域作为四叉树的根节点,也即图1-2中的节点1对应于图1-1中的区域A。四叉树中还存在叶子节点,叶子节点在该四叉树中不存在其对应的孩子节点,而存在对应的父节点,如图1-2中所示的节点3、节点4、节点5、节点6、节点7、节点8和节点9。通常情况下,可以将待渲染区域划分的最小子区域作为四叉树的叶子节点,也即图1-2中的节点3-5分别对应于图1-1中的子区域b-d,节点6-9分别对应于子区域a1-a4。根节点和叶子节点之间存在着中间节点,中间节点存在其对应的父节点和孩子节点,如图1-2中所示的节点2。可以将待渲染区域中位于整个区域和最小子区域之间的子区域作为四叉树的中间节点,也即图1-2中的节点2对应于图1-1中的区域a。按照根节点、中间节点和叶子节点的连接关系,可以实现四叉树的构建。
103:在所述四叉树的每个节点中存储其对应子区域的实例缓存数据。
实例缓存数据可以包括子区域中的各个对象实例的渲染数据。
以草地渲染为例,可选地,对象即是指一棵草,对象实例为草实例。草实例的渲染数据可以包括草的位置、缩放等数据。该渲染数据用于草实例的渲染。
实例缓存数据存储于其所属子区域对应的节点中,草实例的渲染数据存储于其所属子区域对应的节点中,如根节点、中间节点和叶子节点。
可选地,在四叉树的每个节点中存储其对应子区域的实例缓存数据的方法可以包括:
在所述四叉树的任一个叶子节点中,存储其对应子区域的实例缓存数据;
在所述四叉树的任一个非叶子节点中,存储其连接的各孩子节点中所存储的实例缓存数据。
对于待渲染区域对应的四叉树,是按照多个子区域的嵌套关系完成构建的,而子区域与四叉树的节点是一一对应的,即四叉树的节点也存在着父节点与孩子节点等对应的嵌套关系,因此每个节点中存储其对应子区域的实例缓存数据时,也可以具有对应的嵌套关系。
如图1-1及1-2所示,该四叉树具有一个根节点,图1-2中的节点1;一个中间节点,图1-2中的节点2;以及多个叶子节点,图1-2中的节点3-9。对于叶子节点3-9,由于其不存在连接的孩子节点,则该节点只存储其对应子区域的实例缓存数据。如,节点3存储子区域b的实例缓存数据,节点9存储子区域a4的实例缓存数据等。
对于中间节点2和根节点1,由于其存在连接的孩子节点,该节点对应的子区域可以包括其连接的所有孩子节点对应的子区域,也即所有孩子节点对应子区域的合集。此时,该节点中可以存储其连接的所有孩子节点中所存储的实例缓存数据,即连接的所有孩子节点分别对应的子区域中的实例缓存数据。如,节点2存储子区域a的实例缓存数据,也即子区域a1-a4的实例缓存数据的并集;节点1存储子区域A的实例缓存数据,也即子区域a-d的实例缓存数据的并集,即子区域a1-a4,b-d的实例缓存数据的并集。
由于四叉树的每个节点中都可以存储其对应子区域的实例缓存数据,也即若某一节点有连接的孩子节点时,该节点中可以存储其连接的各孩子节点中所存储的实例缓存数据,相当于将实例缓存数据进行了合并存储,可以实现获取某一中间节点存储的实例缓存数据时,也获取了其所连接的各孩子节点所存储的实例缓存数据。进一步地,对某一中间节点存储的实例缓存数据进行渲染时,也可以完成对其所连接的各孩子节点所存储的实例缓存数据的渲染。
基于四叉树的构建,在进行渲染时,可以对四叉树的节点进行遍历,对于视野范围内的节点进行渲染,而视野范围外的节点进行舍弃,提高渲染效率。以四叉树为例,如图1-2所示,可以从根节点向叶子节点遍历,也即从节点1向节点3-9进行遍历。若某一节点位于视野范围内,并按照连接关系继续进行遍历,如,节点1位于视野范围内,则继续进行遍历节点2-9。若某一节点位于视野范围外,则不再遍历其连接的各孩子节点,如,节点2位于视野范围外,则不在遍历节点6-9。若某一叶子节点位于视野范围内,则对该叶子节点进行渲染。如,若节点3-4位于视野范围内,对节点3-4进行渲染。若某一叶子节点位于视野范围外,则不对该叶子节点进行渲染。如,若节点5位于视野范围外,则不再对节点5进行渲染。
基于构建的四叉树,在进行对象实例渲染时,可以遍历每个节点对应的子区域,确定位于视野范围内的目标子区域。该目标子区域对应的节点可以是叶子节点,也可以是非叶子节点。当该目标子区域对应的节点是叶子节点时,可以基于该目标子区域对应的叶子节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染;当该目标子区域对应的节点是非叶子节点时,若其连接的孩子节点也位于视野范围内,则无需遍历各孩子节点,可以直接基于该目标子区域对应的非叶子节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。由于无需遍历各孩子节点,也无需对每一个孩子节点都发起一次绘制命令,缩短了遍历过程,同时也减少了绘制命令的次数,提高了渲染效率。
本实施例中,构建四叉树,并在四叉树的每个节点中存储其对应子区域的实例缓存数据,也即若某一节点有连接的孩子节点时,该节点中可以存储其连接的各孩子节点中所存储的实例缓存数据。在进行对象实例渲染时,遍历该四叉树中每个节点对应的子区域以确定位于视野范围内的目标子区域,基于目标子区域对应节点存储的实例缓存数据,发起一次绘制命令。通过将实例缓存数据进行合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行渲染,减少了绘制命令的次数,避免发生CPU过载的情况,提高了渲染效率。
此外,发明人在研究中发现,现有技术中将草地均匀划分为多个草地块的进行渲染的方式,然而这种划分方式,划分出的某些草地块中的草实例数量有可能很少,仍然需要基于该草地块发起一次绘制命令,也会增加渲染计算量,影响渲染效率,为了进一步提高渲染效率,在某些实施例中,将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域的方法可以包括:
将待渲染区域均匀划分为四个子区域;
对每个子区域继续划分为四个子区域,直至每个子区域满足渲染条件。
将待渲染区域按照四叉树的树形结构均匀划分为四个子区域,再对每一个子区域均匀划分为四个子区域,依次进行,直至每个子区域都能满足渲染条件,也即直到获得最小单位的子区域。
通过增加渲染条件,可以避免出现划分得到的子区域中草实例数量较少的情况,从而无需基于该子区域发起一次绘制命令,较少渲染计算量,提高渲染效率。
可选地,对每个子区域继续划分为N个子区域,直至每个子区域满足渲染条件的方法可以包括:
对每个子区域继续划分为N个子区域,直至每个子区域中的对象实例数量小于一定阈值。
渲染条件可以包括子区域中的对象实例数量所满足的条件,例如可以是数量小于一定阈值。其中,该数量阈值可以根据实际情况进行设定,此处不再进行限定。以待渲染区域是草地为例,可以设置最小子区域的草实例数量小于100,则对草地进行依次划分的过程中,若某一子区域的草实例数量小于100,则不再对其进行划分,该子区域即可称为最小子区域。
作为一种可能的实现方式,实例缓存数据具体可以包括子区域中的各个对象实例的静态渲染数据和动态渲染数据。
在实际场景中,以草实例为例,草实例的静态渲染数据可以包括位置、缩放等数据,动态渲染数据可以包括摆动参数等数据。
进行草实例的渲染时,CPU(Central Processing Unit,中央处理器)可以发送绘制命令至GPU,GPU可以根据绘制命令获取草实例的静态渲染数据和动态渲染数据,结合草实例的静态渲染数据及动态渲染数据,即位置、缩放和摆动参数等数据,渲染获得草实例。
而发明人在研究中发现,草实例的动态渲染数据生成需要进行一系列计算,如果该计算过程由CPU来完成,则会造成CPU算力的浪费,影响渲染效率,因此,为了进一步提高渲染效率,作为另一种可能的实现方式,实例缓存数据具体可以只包括子区域中的各个对象实例的静态渲染数据。
由此,绘制命令具体可以用于调用GPU生成每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
以草实例为例,进行草实例的渲染时,CPU发送绘制命令至GPU,GPU可以根据绘制命令生成草实例的动态渲染数据,再结合草实例的静态渲染数据及动态渲染数据,即位置、缩放和摆动参数等数据,渲染获得草实例。
通过将对象实例的动态渲染数据的生成过程由CPU转移至GPU,解决了现有技术中由CPU计算获得动态渲染数据,导致CPU算力浪费的问题,进一步提高了渲染效率,有利于实现高效地完成大面积待渲染区域的渲染。
基于图1所示实施例提供的数据处理方法中构建的四叉树,如图2中所示,为本发明实施例提供的一种渲染方法一个实施例的流程图,该方法可以包括以下几个步骤:
201:确定待渲染区域对应的四叉树。
待渲染区域预先按照四叉树的树形结构进行网格划分获得多个子区域,而该四叉树是基于多个子区域的嵌套关系构建生成的。其中,待渲染区域的划分过程以及四叉树的构建过程在图1、图1-1以及图1-2所示的实施例中有详细描述,在此不再进行赘述。
该四叉树的构建过程可以是在渲染时执行,也可以是预先构建。对于四叉树的预先构建,可以是在离线时进行的,可以避免运行时产生大量更新。
四叉树的每个节点中可以存储其对应子区域的实例缓存数据。其中,实例缓存数据可以包括子区域中的各个对象实例的渲染数据。
可选地,四叉树的叶子节点中可以存储其对应子区域的实例缓存数据;四叉树的非叶子节点中,可以存储其连接的各孩子节点中所存储的实例缓存数据。
202:遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域。
视野范围可以指摄像机的视锥体的范围。在实际场景中,渲染较大规模的场景空间时,场景中的部分区域会位于摄像机的视锥体的范围之外,在摄像机的视锥体中是不可见的,不属于视野范围内,需要对其进行剔除。只对在摄像机的视锥体中可见的,视野范围内的区域进行渲染。
由于待渲染区域是预先按照四叉树的树形结构进行划分的,遍历四叉树中每个节点对应的子区域,以确定位于视野范围内的目标子区域。例如,可以从根节点向叶子节点遍历,判断各节点对应的子区域是否在摄像机的视锥体中可见,是否属于位于视野范围内的目标子区域。
可选地,遍历四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域的方法可以包括:
遍历所述四叉树,若任一个节点对应的子区域与视锥体相交,继续遍历所述任一个节点连接的各孩子节点;
若任一个节点对应的子区域位于视锥体内,确定所述任一个节点对应的子区域为位于视野范围内的目标子区域。
遍历四叉树时,从根节点开始,对于遍历到的每一个节点,需要进行该节点对应的子区域与摄像机的视锥体是否相交的判定。若某一区域与视锥体相交,则表明该区域中有部分区域是在视锥体内部的。因此,当判定某一节点对应的子区域与视锥体是相交关系时,继续遍历该节点连接的各孩子节点,以确定出在视锥体内部的部分区域对应的具体的孩子节点。当判定某一节点对应的子区域完全位于视锥体内部时,可以确定该节点对应的子区域属于视野范围内的目标子区域,同时不再对该节点连接的各孩子节点进行遍历。若判定某一节点对应的子区域完全位于视锥体外部时,表明该子区域在摄像机的视锥体中是不可见的,不属于视野范围内,需要对其进行剔除,也即不作为视野范围内的目标子区域,同时不再对该节点连接的各孩子节点进行遍历。因为,若某一区域完全位于视锥体外部,则表明该区域中不存在位于视锥体内部的子区域,没有进一步遍历的必要。
如图2-1所示,从根节点向叶子节点遍历,若判定某一中间节点对应的子区域与视锥体是相交关系,则继续遍历该节点连接的四个孩子节点,如四个叶子节点,直至确定出在视锥体内部的部分区域对应的具体的孩子节点。如,若判定节点1对应的子区域与视锥体是相交关系,则继续遍历节点2-5,若判定节点2对应的子区域与视锥体是相交关系,则继续遍历节点6-9,确定出在视锥体内部的子区域对应的节点,如节点6和节点7,在视锥体外部的子区域对应的节点则为节点8和节点9。
若判定某一中间节点对应的子区域完全位于视锥体内部时,可以确定该节点对应的子区域属于视野范围内的目标子区域,同时不再对该节点连接的四个孩子节点进行遍历。如图2-2所示,若判定节点2对应的子区域完全位于视锥体内部时,则不再进行节点6-9的遍历。若判定某一中间节点对应的子区域完全位于视锥体外部时,需要对其进行剔除,不作为视野范围内的目标子区域,同时不再对该节点连接的四个孩子节点进行遍历。如,若节点2对应的子区域完全位于视锥体外部时,也不再进行节点6-9的遍历。
可选地,若判定某一叶子节点对应的子区域与视锥体是相交关系时,将该叶子节点对应的子区域作为视野范围内的目标子区域。如图2-1所示,若节点3对应的子区域与视锥体是相交关系时,将节点3对应的子区域b作为视野范围内的目标子区域。
在实际应用中,可以通过函数的调用实现对四叉树的遍历。作为一种可选方式,可以利用递归函数采用递归方式遍历四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域。也即定义递归函数,该递归函数的输入是四叉树的一个节点,在函数内部先访问输入节点中的数据,再对该输入节点的所有孩子节点调用该递归函数访问孩子节点,当递归函数中输入节点没有孩子节点时,该递归函数访问输入节点的数据并直接返回。待所有的递归函数都返回后,即可完成对四叉树所有节点的遍历。
由于采用递归方式遍历四叉树的算法依赖于计算机系统的递归调用栈,每次函数的递归调用都会触发函数调用上下文的入栈,造成性能损失。因此,为了减少递归调用带来的性能损失,作为另一种可选方式,可以利用非递归函数采用非递归方式遍历四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域。也即利用用户定义的栈来保存已经访问过的节点,先将根节点入栈,不断循环判断当前栈是否为空,若不为空就将栈中的栈顶元素出栈,访问该节点的数据,再判断该节点的孩子节点是否为空,若不为空则将所有孩子节点依次压入栈中,若为空则继续执行上述循环逻辑,直到栈中元素为0,即可实现四叉树的遍历。
利用非递归函数采用非递归方式进行遍历可以减少函数的调用次数,节省系统进行函数调用时的入栈出栈操作,从而提高效率。
203:基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
确定出位于视野范围内的目标子区域后,可以获取每个目标子区域对应节点存储的实例缓存数据,并基于该实例缓存数据发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。
作为一种可能的实现方式,实例缓存数据具体可以包括子区域中的各个对象实例的静态渲染数据和动态渲染数据。
在实际场景中,以草实例为例,草实例的静态渲染数据可以包括位置、缩放等数据,动态渲染数据可以包括摆动参数等数据。
基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染的方法可以包括:
基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,调用GPU获取所述目标子区域中每个对象实例的静态渲染数据和动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
为了进一步提高渲染效率,作为另一种可能的实现方式,实例缓存数据具体可以包括子区域中的各个对象实例的静态渲染数据。
基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染的方法可以包括:
基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,调用GPU生成所述目标子区域中每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
以草实例为例,草实例的静态渲染数据可以包括位置、缩放等数据,动态渲染数据可以包括摆动参数等数据。进行草实例的渲染时,基于每个目标子区域对应节点存储的实例缓存数据,也即草实例的静态渲染数据,CPU可以发送一次绘制命令至GPU,GPU可以根据绘制命令生成草实例的动态渲染数据,再结合草实例的静态渲染数据及动态渲染数据,即位置、缩放和摆动参数等数据,渲染获得草实例。
在实际场景中,以草实例为例,除了会出现迎风摆动的摆动效果之外,还可能会与场景中的动态物体进行交互,产生交互效果,也即存在碰撞动作。例如,以动态物体是人为例,会出现草被人推开的效果。因此,确定出位于视野范围内的目标子区域之后,该方法还可以包括:
从位于视野范围内的目标子区域中确定存在对象实例与动态物体发送碰撞的第一目标子区域;
其中,所述绘制命令中包括目标子区域为第一目标子区域的标识信息;所述标识信息用于GPU确定所述第一目标子区域,并针对所述第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据和摆动参数数据,以及针对所述第一目标子区域中未与动态物体发生碰撞的对象实例生成摆动参数数据。
其中,动态物体可以指场景中可以与对象实例产生交互动作的动态物体,例如人。对四叉树进行遍历的过程中,确定出位于视野范围内的目标子区域之后,可以查找确定是否存在对象实例与动态物体发送碰撞的第一目标子区域,若存在,将第一目标子区域的标识信息通过绘制命令告知GPU,以便于GPU确定该第一目标子区域,从而可以实现对第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据和摆动参数数据;对第一目标子区域中未与动态物体发生碰撞的对象实例生成摆动参数数据,增加渲染的真实性。同时,使得GPU在生成动态渲染数据时,只对动态物体影响到的节点使用带碰撞逻辑的渲染器进行交互模拟数据计算,未被动态物体影响的节点则不使用带碰撞逻辑的渲染器计算,减少了计算量,提高了渲染效率。
本实施例中,基于构建的待渲染区域对应的四叉树进行渲染时,只需要遍历四叉树以确定视野范围内的目标子区域,并根据目标子区域的实例缓存数据发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。由于四叉树中存储的实例缓存数据存在合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行遍历,减少了绘制命令的次数,避免发生CPU过载的情况,提高了渲染效率。同时,通过将对象实例的动态渲染数据的生成过程由CPU转移至GPU,解决了现有技术中由CPU计算获得动态渲染数据,导致CPU算力浪费的问题,进一步提高了渲染效率,有利于实现高效地完成大面积待渲染区域的渲染。
在实际应用中,若在四叉树的每个节点中都存储实例缓存数据,则会造成显存的极大浪费,因此,为了避免显存浪费,进一步提高渲染效率,如图3所示,为本发明实施例提供的一种数据处理方法另一个实施例的流程图,该方法可以包括以下几个步骤:
301:将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域。
302:按照所述多个子区域的嵌套关系,构建所述四叉树。
步骤301-302的实现方式与图1所示实施例中步骤101-102的实现方式一致,上述步骤可以参考图1所示实施例中步骤101-102的具体实现方式,在此不再进行赘述。
303:在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址。
其中,实例缓存数据包括子区域中的各个对象实例的渲染数据。
索引地址可以与实例缓存数据一一对应,用于查找对应的实例缓存数据。索引数据占用的存储空间远远小于实例缓存数据占用的存储空间。
可选地,在四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址的方法可以包括:
在所述四叉树的任一个叶子节点中,存储其对应子区域的实例缓存数据的缓存地址;
在所述四叉树的任一个非叶子节点中,存储其连接的各孩子节点中所存储的缓存地址。
由于四叉树的叶子节点中可以存储其对应子区域的实例缓存数据,非叶子节点中可以存储其连接的各孩子节点中所存储的实例缓存数据,则与此对应的,为了减少存储空间的占用,可以在四叉树的叶子节点中存储其对应子区域的实例缓存数据的缓存地址,在非叶子节点中存储其连接的各孩子节点中所存储的缓存地址。
可选地,该方法还可以包括:
将所述四叉树的每个叶子节点对应子区域的实例缓存数据,存储至共享缓存区,其中,连接同一个父节点的叶子节点的缓存地址连续。
共享缓存区是一个独立的数据存储区域,不会占用显存的存储空间。将实例缓存数据存储至共享缓存区,同时将对应的缓存地址存储至所属子区域对应的四叉树节点中,可以实现通过索引地址获取共享缓存区中存储的对应的实例缓存数据,同时避免了显存的浪费。
在实际应用中,为了方便存储和提取实例缓存数据,可以将连接同一个父节点的叶子节点的缓存地址连续。
可选地,在四叉树的任一个非叶子节点中,存储其连接的各孩子节点中所存储的缓存地址的方法可以包括:
在所述四叉树的任一个非叶子节点中,基于其连接的各孩子节点中所存储的缓存地址,存储各孩子节点中所存储的缓存地址对应的缓存地址范围。
由于四叉树中非叶子节点可以存储其连接的各孩子节点中所存储的所有实例缓存数据,并且连接同一个父节点的叶子节点的缓存地址是连续的,因此,在存储其连接的各孩子节点中所存储的缓存地址时,可以直接存储各孩子节点中所存储的缓存地址对应的缓存地址范围。可以实现进一步地减少存储空间的占用,简洁易存储。
如图1-2所示,例如,节点6存储的缓存地址是[0,0],节点7存储的缓存地址是[1,1]等,彼此不相同,与各自的实例缓存数据一一对应。四叉树的非叶子节点可以存储其连接的各孩子节点中所存储的缓存地址对应的缓存地址范围。例如,节点2连接节点6-9,节点6-9存储的缓存地址分别是[0,0]、[1,1]、[2,2]、[3,3],则节点2存储四个缓存地址的缓存地址范围,即[0,3]。
基于构建的四叉树,在进行对象实例渲染时,可以遍历每个节点对应的子区域,确定位于视野范围内的目标子区域。基于该目标子区域对应的节点存储的实例缓存数据的索引地址,从共享缓存区获取对应的实例缓存数据,并基于该实例缓存数据发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。
本实施例中,构建四叉树,并在四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址,也即若某一节点有连接的孩子节点时,该节点中可以存储其连接的各孩子节点中所存储的实例缓存数据的缓存地址。在进行对象实例渲染时,遍历该四叉树中每个节点对应的子区域以确定位于视野范围内的目标子区域,基于目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令。通过将实例缓存数据地址进行合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行渲染,减少了绘制命令的次数,避免发生CPU过载的情况。进一步地,在节点中只存储其对应子区域的实例缓存数据的缓存地址,避免了每个节点存储实例数据造成的显存的极大浪费,节省了实例数据的存储空间,提高了渲染效率。
作为一种可能的实现方式,实例缓存数据具体可以包括子区域中的各个对象实例的静态渲染数据和动态渲染数据。
在实际场景中,以草实例为例,草实例的静态渲染数据可以包括位置、缩放等数据,动态渲染数据可以包括摆动参数等数据。
进行草实例的渲染时,CPU可以发送绘制命令至GPU,GPU可以根据绘制命令获取草实例的静态渲染数据和动态渲染数据,结合草实例的静态渲染数据及动态渲染数据,即位置、缩放和摆动参数等数据,渲染获得草实例。
为了进一步提高渲染效率,作为另一种可能的实现方式,实例缓存数据具体可以只包括子区域中的各个对象实例的静态渲染数据。
绘制命令具体可以用于调用GPU生成每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
以草实例为例,进行草实例的渲染时,CPU可以发送绘制命令至GPU,GPU可以根据绘制命令生成草实例的动态渲染数据,再结合草实例的静态渲染数据及动态渲染数据,即位置、缩放和摆动参数等数据,渲染获得草实例。
通过将对象实例的动态渲染数据的生成过程由CPU转移至GPU,解决了现有技术中由CPU计算获得动态渲染数据,导致CPU算力浪费的问题,进一步提高了渲染效率,有利于实现高效地完成大面积待渲染区域的渲染。
基于图3所示实施例提供的数据处理方法中构建的四叉树,如图4所示,为本发明实施例提供的一种渲染方法另一个实施例的流程图,该方法可以包括以下几个步骤:
401:确定待渲染区域对应的四叉树。
待渲染区域预先按照四叉树的树形结构进行网格划分获得多个子区域,而该四叉树是基于多个子区域的嵌套关系构建生成的。其中,待渲染区域的划分过程以及四叉树的构建过程在图1、图1-1以及图1-2所示的实施例中有详细描述,在此不再进行赘述。
该四叉树的构建过程可以是在渲染时执行,也可以是预先构建。对于四叉树的预先构建,可以是在离线时进行的,可以避免运行时产生大量更新。
四叉树的每个节点中可以存储其对应子区域的实例缓存数据的索引地址。其中,实例缓存数据可以包括子区域中的各个对象实例的渲染数据。
可选地,四叉树的叶子节点中可以存储其对应子区域的实例缓存数据的索引地址;四叉树的非叶子节点中,可以存储其连接的各孩子节点中所存储的缓存地址对应的缓存地址范围。
402:遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域。
遍历四叉树以确定目标子区域的具体过程在图2所示的实施例中有详细描述,在此不再进行赘述。
403:基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
确定出位于视野范围内的目标子区域后,可以获取每个目标子区域对应节点存储的索引地址索引的实例缓存数据,并基于该实例缓存数据发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。
作为一种可能的实现方式,实例缓存数据具体可以包括子区域中的各个对象实例的静态渲染数据和动态渲染数据。
在实际场景中,以草实例为例,草实例的静态渲染数据可以包括位置、缩放等数据,动态渲染数据可以包括摆动参数等数据。
基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染的方法可以包括:
基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,调用GPU获取所述目标子区域中每个对象实例的静态渲染数据和动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
为了进一步提高渲染效率,作为另一种可能的实现方式,实例缓存数据具体可以只包括子区域中的各个对象实例的静态渲染数据。
基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染的方法可以包括:
基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,调用GPU生成所述目标子区域中每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
以草实例为例,进行草实例的渲染时,基于每个目标子区域对应节点存储的索引地址索引的实例缓存数据,也即草实例的静态渲染数据,CPU可以发送一次绘制命令至GPU,GPU可以根据绘制命令生成草实例的动态渲染数据,再结合草实例的静态渲染数据及动态渲染数据,即位置、缩放和摆动参数等数据,渲染获得草实例。
在实际场景中,以草实例为例,除了会出现迎风摆动的摆动效果之外,还可能会与场景中的动态物体进行交互,产生交互效果,也即存在碰撞动作。例如,以动态物体是人为例,会出现草被人推开的效果。因此,确定出位于视野范围内的目标子区域之后,该方法还可以包括:
从位于视野范围内的目标子区域中确定存在对象实例与动态物体发送碰撞的第一目标子区域;
其中,所述绘制命令中包括目标子区域为第一目标子区域的标识信息;所述标识信息用于GPU确定所述第一目标子区域,并针对所述第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据和摆动参数数据,以及针对所述第一目标子区域中未与动态物体发生碰撞的对象实例生成摆动参数数据。
其中,动态物体可以指场景中可以与对象实例产生交互动作的动态物体,例如人。对四叉树进行遍历的过程中,确定出位于视野范围内的目标子区域之后,可以查找确定是否存在对象实例与动态物体发送碰撞的第一目标子区域,若存在,将第一目标子区域的标识信息通过绘制命令告知GPU,以便于GPU确定该第一目标子区域,从而可以实现对第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据和摆动参数数据;对第一目标子区域中未与动态物体发生碰撞的对象实例生成摆动参数数据,增加渲染的真实性。同时,使得GPU在生成动态渲染数据时,只对动态物体影响到的节点使用带碰撞逻辑的渲染器进行交互模拟数据计算,未被动态物体影响的节点则不使用带碰撞逻辑的渲染器计算,减少了计算量,提高了渲染效率。
本实施例中,基于构建的待渲染区域对应的四叉树进行渲染时,只需要遍历四叉树以确定视野范围内的目标子区域,并根据目标子区域的缓存地址索引的实例缓存数据发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。由于四叉树中存储的实例缓存数据的索引地址存在合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行遍历,减少了绘制命令的次数,避免发生CPU过载的情况。同时,在节点中只存储其对应子区域的实例缓存数据的缓存地址,避免了每个节点存储实例数据造成的显存的极大浪费,节省了实例数据的存储空间,进一步提高了渲染效率。进一步地,通过将对象实例的动态渲染数据的生成过程由CPU转移至GPU,解决了现有技术中由CPU计算获得动态渲染数据,导致CPU算力浪费的问题,进一步提高了渲染效率,有利于实现高效地完成大面积待渲染区域的渲染。
如图5所示,为本发明实施例提供的一种渲染方式另一个实施例的流程图,该方法可以包括以下步骤:
501:确定待渲染区域对应的四叉树。
其中,待渲染区域预先按照四叉树的树形结构进行网格划分获得多个子区域;该四叉树基于多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据或者缓存数据对应的缓存地址。
其中,实例缓存数据可以包括子区域中的各个对象实例的渲染数据。
四叉树的构建过程以及实例缓存数据或缓存地址的存储过程在前面的部分已经进行了详细描述,在此不再进行赘述。
502:遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域。
遍历四叉树以确定目标子区域的具体过程在图2所示的实施例中有详细描述,在此不再进行赘述。
503:基于每个目标子区域对应的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
其中,基于每个目标子区域对应的实例缓存数据,发起一次绘制命令具体可以是,若在每个节点中存储的是其对应子区域的实例缓存数据,则基于每个目标子区域存储的实例缓存数据,发起一次绘制命令;若在每个节点中存储的是其对应子区域的实例缓存数据的缓存地址,则基于每个目标子区域存储的缓存地址索引的实例缓存数据,发起一次绘制命令。
本实施例中,基于构建的待渲染区域对应的四叉树进行渲染时,只需要遍历四叉树以确定视野范围内的目标子区域,并根据目标子区域对应的实例缓存数据发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。由于四叉树中存储的实例缓存数据或实例缓存数据的索引地址存在合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行遍历,减少了绘制命令的次数,避免发生CPU过载的情况,提高了渲染效率。
如图6所示,为本发明实施例提供的一种渲染方法另一个实施例的流程图,该方法可以包括以下几个步骤:
601:接收CPU发送的绘制命令。
该渲染方法具体可以应用于GPU端。GPU可以基于该绘制命令进行渲染。其中,绘制命令为CPU基于待渲染区域中的位于视野范围内的目标子区域的实例缓存数据发起。实例缓存数据可以包括目标子区域中的各个对象实例的静态渲染数据。
以草实例为例,静态渲染数据可以为草实例的位置、缩放等数据。
602:确定所述目标子区域的实例缓存数据。
由于该绘制命令为CPU基于待渲染区域中的位于视野范围内的目标子区域的实例缓存数据发起,则根据该绘制命令可以确定目标子区域的实例缓存数据。
603:生成所述目标子区域中每个对象实例的动态渲染数据。
GPU可以根据对象实例的静态渲染数据生成对应的动态渲染数据。
可选地,生成所述目标子区域中每个对象实例的动态渲染数据的方法可以包括:
生成所述目标子区域中每个对象实例的摆动参数数据;
如果所述目标子区域为存在对象实例与动态物体发生碰撞的第一目标子区域,针对所述第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据。
以草实例为例,动态渲染数据可以包括摆动参数数据和/或交互模拟数据,其中,结合摆动参数数据进行渲染获得草实例的摆动动画效果,结合交互模拟数据进行渲染可以获得草实例与动态物体发生碰撞的交互模拟效果。
在实际应用中,目标子区域中所有草实例都可以实现随风摆动的摆动动画效果,可以利用不同频率和周期的正弦波叠加得到较复杂的摆动波形,获得摆动参数数据,根据摆动参数数据可以对草模型的顶点进行偏移,获得草实例的摆动动画。
而对于交互模拟效果,并非目标子区域中所有草实例都可以实现,只有第一目标子区域中与动态物体发生碰撞的草实例才可以实现。因此,针对第一目标子区域中与动态物体发生碰撞的草实例可以生成交互模拟数据。可以将动态物体的位置坐标和草实例的位置坐标计算获得三维方向向量,将该三维方向向量和碰撞半径平方的倒数传入渲染器,计算获得交互模拟数据。将交互模拟数据与摆动参数数据进行叠加,可以获得顶点偏移数据。基于该顶点偏移数据,可以对草模型的顶点进行偏移,获得草实例的交互模拟效果。
通过只对场景中与动态物体发生碰撞的草实例进行交互模拟数据计算,实现与动态物体发生碰撞的草实例可以出现交互模拟效果,如草被人推开,而对于没有与动态物体发生碰撞的草实例则不进行交互模拟数据计算,减少了计算量,可以进一步提高渲染效率。
604:结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
GPU结合对象实例的静态渲染数据及动态渲染数据,可以渲染获得每个对象实例,例如,对于没有与动态物体发生碰撞的草实例,动态渲染数据只包括摆动参数数据,则结合草实例的位置、缩放和摆动参数数据,可以渲染获得具有摆动动画效果的草实例;而对于与动态物体发生碰撞的草实例,动态渲染数据除了包括摆动参数数据之外,还包括交互模拟数据,则结合草实例的位置、缩放、摆动参数数据和交互模拟数据,可以渲染获得具有摆动动画效果和交互模拟效果的草实例。
本实施例中,GPU基于CPU发送的绘制命令确定待渲染区域的静态缓存数据,并基于每个对象实例的静态缓存数据生成动态渲染数据,再结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。通过将对象实例动态渲染数据的生成过程由CPU转移至GPU,降低了CPU算力的浪费,同时避免每帧了更新缓存,进一步提高了渲染效率。
在某些实施例中,待渲染区域可以预先按照四叉树的树形结构进行网格划分获得多个子区域,而四叉树可以基于多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据。
绘制命令具体为CPU遍历四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于每个目标子区域对应节点存储的实例缓存数据发起。
通过构建四叉树,在四叉树的每个节点中存储其对应子区域的实例缓存数据,也即若某一节点有连接的孩子节点时,该节点中可以存储其连接的各孩子节点中所存储的实例缓存数据。在进行对象实例渲染时,遍历该四叉树中每个节点对应的子区域以确定位于视野范围内的目标子区域,基于目标子区域对应节点存储的实例缓存数据,发起一次绘制命令。通过将实例缓存数据进行合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行渲染,减少了绘制命令的次数,避免发生CPU过载的情况,提高了渲染效率。
如图7所示,为本发明实施例提供的一种数据处理装置一个实施例的结构示意图,该装置可以包括以下几个模块:
划分模块701,用于将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域。
构建模块702,用于按照所述多个子区域的嵌套关系,构建所述四叉树。
第一存储模块703,用于在所述四叉树的每个节点中存储其对应子区域的实例缓存数据。其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据。
可选地,第一存储模块703可以包括:
第一存储单元,用于在所述四叉树的任一个叶子节点中,存储其对应子区域的实例缓存数据;
第二存储单元,用于在所述四叉树的任一个非叶子节点中,存储其连接的各孩子节点中所存储的实例缓存数据。
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
本实施例中,通过构建四叉树,并在四叉树的每个节点中存储其对应子区域的实例缓存数据,也即若某一节点有连接的孩子节点时,该节点中可以存储其连接的各孩子节点中所存储的实例缓存数据。在进行对象实例渲染时,遍历该四叉树中每个节点对应的子区域以确定位于视野范围内的目标子区域,基于目标子区域对应节点存储的实例缓存数据,发起一次绘制命令。通过将实例缓存数据进行合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行渲染,减少了绘制命令的次数,避免发生CPU过载的情况,提高了渲染效率。
图7所述的数据处理装置可以执行图1所示实施例所述的数据处理方法,其实现原理和技术效果不再赘述。对于上述实施例中的数据处理装置其中各个模块、单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
如图8所示,为本发明实施例提供的一种渲染装置一个实施例的结构示意图,该装置可以包括以下几个模块:
第一确定模块801,用于确定待渲染区域对应的四叉树。
其中,所述待渲染区域预先按照所述四叉树的树形结构进行网格划分获得多个子区域;所述四叉树基于所述多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据。
第一遍历模块802,用于遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域。
可选地,第一遍历模块802可以包括:
第一遍历单元,用于遍历所述四叉树,若任一个节点对应的子区域与视锥体相交,继续遍历所述任一个节点连接的各孩子节点;
第一确定单元,用于若任一个节点对应的子区域位于视锥体内,确定所述任一个节点对应的子区域为位于视野范围内的目标子区域。
可选地,第一遍历模块802可以包括:
第二遍历单元,用于利用非递归函数采用非递归方式遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域。
第一发送模块803,用于基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
可选地,实例缓存数据具体可以包括子区域中的各个对象实例的静态渲染数据。
第一发送模块803可以包括:
第一发送单元,用于基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,调用GPU生成所述目标子区域中每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
第一发送模块803还可以包括:
第二确定单元,用于从位于视野范围内的目标子区域中确定存在对象实例与动态物体发送碰撞的第一目标子区域;
其中,所述绘制命令中包括目标子区域为第一目标子区域的标识信息;所述标识信息用于GPU确定所述第一目标子区域,并针对所述第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据和摆动参数数据,以及针对所述第一目标子区域中未与动态物体发生碰撞的对象实例生成摆动参数数据。
本实施例中,基于构建的待渲染区域对应的四叉树进行渲染时,只需要遍历四叉树以确定视野范围内的目标子区域,并根据目标子区域的实例缓存数据发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。由于四叉树中存储的实例缓存数据存在合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行遍历,减少了绘制命令的次数,避免发生CPU过载的情况,提高了渲染效率。同时,通过将对象实例的动态渲染数据的生成过程由CPU转移至GPU,解决了现有技术中由CPU计算获得动态渲染数据,导致CPU算力浪费的问题,进一步提高了渲染效率,有利于实现高效地完成大面积待渲染区域的渲染。
图8所述的渲染装置可以执行图2所示实施例所述的渲染方法,其实现原理和技术效果不再赘述。对于上述实施例中的渲染装置其中各个模块、单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
如图9所示,为本发明实施例提供的一种数据处理装置另一个实施例的结构示意图,该装置可以包括以下几个模块:
划分模块601,用于将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域。
构建模块602,用于按照所述多个子区域的嵌套关系,构建所述四叉树。
第二存储模块903,用于在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址。
可选地,第二存储模块903可以包括:
第三存储单元,用于在所述四叉树的任一个叶子节点中,存储其对应子区域的实例缓存数据的缓存地址;
第四存储单元,用于在所述四叉树的任一个非叶子节点中,存储其连接的各孩子节点中所存储的缓存地址。
可选地,第二存储模块903还包括:
第五存储单元,用于将所述四叉树的每个叶子节点对应子区域的实例缓存数据,存储至共享缓存区,其中,连接同一个父节点的叶子节点的缓存地址连续;
第四存储单元可以包括:
存储子单元,用于在所述四叉树的任一个非叶子节点中,基于其连接的各孩子节点中所存储的缓存地址,存储各孩子节点中所存储的缓存地址对应的缓存地址范围。
其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据。
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域以确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
本实施例中,构建四叉树,并在四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址,也即若某一节点有连接的孩子节点时,该节点中可以存储其连接的各孩子节点中所存储的实例缓存数据的缓存地址。在进行对象实例渲染时,遍历该四叉树中每个节点对应的子区域以确定位于视野范围内的目标子区域,基于目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令。通过将实例缓存数据地址进行合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行渲染,减少了绘制命令的次数,避免发生CPU过载的情况。进一步地,在节点中只存储其对应子区域的实例缓存数据的缓存地址,避免了每个节点存储实例数据造成的显存的极大浪费,节省了实例数据的存储空间,提高了渲染效率。
图9所述的数据处理装置可以执行图3所示实施例所述的数据处理方法,其实现原理和技术效果不再赘述。对于上述实施例中的数据处理装置其中各个模块、单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
如图10所示,为本发明实施例提供的一种渲染装置另一个实施例的结构示意图,该装置可以包括以下几个模块:
第二确定模块1001,用于确定待渲染区域对应的四叉树;其中,所述待渲染区域预先按照所述四叉树的树形结构进行网格划分获得多个子区域;所述四叉树基于所述多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据。
第二遍历模块1002,用于遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域。
第二发送模块1003,用于基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
可选地,第二发送模块1003可以包括:
第二发送单元,用于基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,调用GPU生成所述目标子区域中每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
可选地,第二发送模块1003还可以包括:
第三确定单元,用于从位于视野范围内的目标子区域中确定存在对象实例与动态物体发送碰撞的第一目标子区域;
其中,所述绘制命令中包括目标子区域为第一目标子区域的标识信息;所述标识信息用于GPU确定所述第一目标子区域,并针对所述第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据和摆动参数数据,以及针对所述第一目标子区域中未与动态物体发生碰撞的对象实例生成摆动参数数据。
本实施例中,基于构建的待渲染区域对应的四叉树进行渲染时,只需要遍历四叉树以确定视野范围内的目标子区域,并根据目标子区域的缓存地址索引的实例缓存数据发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。由于四叉树中存储的实例缓存数据的索引地址存在合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行遍历,减少了绘制命令的次数,避免发生CPU过载的情况。同时,在节点中只存储其对应子区域的实例缓存数据的缓存地址,避免了每个节点存储实例数据造成的显存的极大浪费,节省了实例数据的存储空间,进一步提高了渲染效率。进一步地,通过将对象实例的动态渲染数据的生成过程由CPU转移至GPU,解决了现有技术中由CPU计算获得动态渲染数据,导致CPU算力浪费的问题,进一步提高了渲染效率,有利于实现高效地完成大面积待渲染区域的渲染。
图10所述的渲染装置可以执行图4所示实施例所述的渲染方法,其实现原理和技术效果不再赘述。对于上述实施例中的渲染装置其中各个模块、单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
如图11所示,为本发明实施例提供的一种渲染装置另一个实施例的结构示意图,该装置可以包括以下几个模块:
第三确定模块1101,用于确定待渲染区域对应的四叉树;其中,所述待渲染区域预先按照所述四叉树的树形结构进行网格划分获得多个子区域;所述四叉树基于所述多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据或者所述缓存数据对应的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
第三遍历模块1102,用于遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
第三发送模块1103,用于基于每个目标子区域对应的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
本实施例中,基于构建的待渲染区域对应的四叉树进行渲染时,只需要遍历四叉树以确定视野范围内的目标子区域,并根据目标子区域对应的实例缓存数据发起一次绘制命令,以调用GPU结合实例缓存数据进行对象实例渲染。由于四叉树中存储的实例缓存数据或实例缓存数据的索引地址存在合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行遍历,减少了绘制命令的次数,避免发生CPU过载的情况,提高了渲染效率。
图11所述的渲染装置可以执行图5所示实施例所述的渲染方法,其实现原理和技术效果不再赘述。对于上述实施例中的渲染装置其中各个模块、单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
如图12所示,为本发明实施例提供的一种渲染装置另一个实施例的结构示意图,该装置可以包括以下几个模块:
接收模块1201,用于接收CPU发送的绘制命令;其中,所述绘制命令为所述CPU基于待渲染区域中的位于视野范围内的目标子区域的实例缓存数据发起;其中,所述实例缓存数据包括所述目标子区域中的各个对象实例的静态渲染数据。
第四确定模块1202,用于确定所述目标子区域的实例缓存数据。
生成模块1203,用于生成所述目标子区域中每个对象实例的动态渲染数据。
渲染模块1204,用于结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
可选地,生成模块1203可以包括:
第一生成单元,用于生成所述目标子区域中每个对象实例的摆动参数数据;
第二生成单元,用于如果所述目标子区域为存在对象实例与动态物体发生碰撞的第一目标子区域,针对所述第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据。
本实施例中,GPU基于CPU发送的绘制命令确定待渲染区域的静态缓存数据,并基于每个对象实例的静态缓存数据生成动态渲染数据,再结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。通过将对象实例动态渲染数据的生成过程由CPU转移至GPU,降低了CPU算力的浪费,同时避免每帧了更新缓存,进一步提高了渲染效率。
在某些实施例中,待渲染区域可以预先按照四叉树的树形结构进行网格划分获得多个子区域,而四叉树可以基于多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据。
绘制命令具体为CPU遍历四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于每个目标子区域对应节点存储的实例缓存数据发起。
通过构建四叉树,在四叉树的每个节点中存储其对应子区域的实例缓存数据,也即若某一节点有连接的孩子节点时,该节点中可以存储其连接的各孩子节点中所存储的实例缓存数据。在进行对象实例渲染时,遍历该四叉树中每个节点对应的子区域以确定位于视野范围内的目标子区域,基于目标子区域对应节点存储的实例缓存数据,发起一次绘制命令。通过将实例缓存数据进行合并存储,若遍历得到的目标子区域对应的节点还连接有孩子节点,则无需再逐一针对该节点下的孩子节点分别对应的子区域进行渲染,减少了绘制命令的次数,避免发生CPU过载的情况,提高了渲染效率。
图12所述的渲染装置可以执行图6所示实施例所述的渲染方法,其实现原理和技术效果不再赘述。对于上述实施例中的渲染装置其中各个模块、单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。
本发明实施例还包括在下列编号条款中规定的这些和其他方面:
1、一种数据处理方法,其特征在于,包括:
将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;按照所述多个子区域的嵌套关系,构建所述四叉树;
在所述四叉树的每个节点中存储其对应子区域的实例缓存数据,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
2、根据条款1所述的方法,其特征在于,所述在所述四叉树的每个节点中存储其对应子区域的实例缓存数据包括:
在所述四叉树的任一个叶子节点中,存储其对应子区域的实例缓存数据;
在所述四叉树的任一个非叶子节点中,存储其连接的各孩子节点中所存储的实例缓存数据。
3、根据条款1所述的方法,其特征在于,所述实例缓存数据具体包括所述子区域中的各个对象实例的静态渲染数据;
所述绘制命令具体用于调用GPU生成每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
4、根据条款1所述的方法,其特征在于,所述在所述四叉树的每个节点中存储其对应子区域的实例缓存数据之后,所述方法还包括:
遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
5、根据条款4所述的方法,其特征在于,所述遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域包括:
遍历所述四叉树,若任一个节点对应的子区域与视锥体相交,继续遍历所述任一个节点连接的各孩子节点;
若任一个节点对应的子区域位于视锥体内,确定所述任一个节点对应的子区域为位于视野范围内的目标子区域。
6、根据条款4所述的方法,其特征在于,所述遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域包括:
利用非递归函数采用非递归方式遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域。
7、根据条款4所述的方法,其特征在于,所述实例缓存数据具体包括所述子区域中的各个对象实例的静态渲染数据;
所述基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染包括:
基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,调用GPU生成所述目标子区域中每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
8、根据条款7所述的方法,其特征在于,所述方法还包括:
从位于视野范围内的目标子区域中确定存在对象实例与动态物体发送碰撞的第一目标子区域;
其中,所述绘制命令中包括目标子区域为第一目标子区域的标识信息;所述标识信息用于GPU确定所述第一目标子区域,并针对所述第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据和摆动参数数据,以及针对所述第一目标子区域中未与动态物体发生碰撞的对象实例生成摆动参数数据。
9、一种数据处理方法,其特征在于,包括:
将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;
按照所述多个子区域的嵌套关系,构建所述四叉树;
在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域以确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
10、根据条款9所述的方法,其特征在于,所述在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址包括:
在所述四叉树的任一个叶子节点中,存储其对应子区域的实例缓存数据的缓存地址;
在所述四叉树的任一个非叶子节点中,存储其连接的各孩子节点中所存储的缓存地址。
11、根据条款10所述的方法,其特征在于,所述方法还包括:
将所述四叉树的每个叶子节点对应子区域的实例缓存数据,存储至共享缓存区,其中,连接同一个父节点的叶子节点的缓存地址连续;
所述在所述四叉树的任一个非叶子节点中,存储其连接的各孩子节点中所存储的缓存地址包括:
在所述四叉树的任一个非叶子节点中,基于其连接的各孩子节点中所存储的缓存地址,存储各孩子节点中所存储的缓存地址对应的缓存地址范围。
12、根据条款9所述的方法,其特征在于,所述实例缓存数据具体包括所述子区域中的各个对象实例的静态渲染数据;
所述绘制命令具体用于调用GPU生成每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
13、根据条款9所述的方法,其特征在于,所述在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址之后,所述方法还包括:
遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
14、根据条款13所述的方法,其特征在于,所述实例缓存数据具体包括所述子区域中的各个对象实例的静态渲染数据;
所述基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染包括:
基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,调用GPU生成所述目标子区域中每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
15、根据条款14所述的方法,其特征在于,所述方法还包括:
从位于视野范围内的目标子区域中确定存在对象实例与动态物体发送碰撞的第一目标子区域;
其中,所述绘制命令中包括目标子区域为第一目标子区域的标识信息;所述标识信息用于GPU确定所述第一目标子区域,并针对所述第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据和摆动参数数据,以及针对所述第一目标子区域中未与动态物体发生碰撞的对象实例生成摆动参数数据。
16、一种渲染方法,其特征在于,包括:
确定待渲染区域对应的四叉树;其中,所述待渲染区域预先按照所述四叉树的树形结构进行网格划分获得多个子区域;所述四叉树基于所述多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据或者所述缓存数据对应的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
基于每个目标子区域对应的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
17、一种数据处理装置,其特征在于,包括:
划分模块,用于将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;
构建模块,用于按照所述多个子区域的嵌套关系,构建所述四叉树;
第一存储模块,用于在所述四叉树的每个节点中存储其对应子区域的实例缓存数据,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
18、根据条款17所述的装置,其特征在于,所述第一存储模块包括:
第一存储单元,用于在所述四叉树的任一个叶子节点中,存储其对应子区域的实例缓存数据;
第二存储单元,用于在所述四叉树的任一个非叶子节点中,存储其连接的各孩子节点中所存储的实例缓存数据。
19、根据条款17所述的装置,其特征在于,所述装置还包括:
第一遍历模块,用于遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
第一发送模块,用于基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
20、根据条款19所述的装置,其特征在于,所述第一遍历模块包括:
第一遍历单元,用于遍历所述四叉树,若任一个节点对应的子区域与视锥体相交,继续遍历所述任一个节点连接的各孩子节点;
第一确定单元,用于若任一个节点对应的子区域位于视锥体内,确定所述任一个节点对应的子区域为位于视野范围内的目标子区域。
21、根据条款19所述的装置,其特征在于,所述第一遍历模块包括:
第二遍历单元,用于利用非递归函数采用非递归方式遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域。
22、根据条款19所述的装置,其特征在于,所述实例缓存数据具体包括所述子区域中的各个对象实例的静态渲染数据;
所述第一发送模块包括:
第一发送单元,用于基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,调用GPU生成所述目标子区域中每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
23、根据条款22所述的装置,其特征在于,所述装置还包括:
第二确定单元,用于从位于视野范围内的目标子区域中确定存在对象实例与动态物体发送碰撞的第一目标子区域;
其中,所述绘制命令中包括目标子区域为第一目标子区域的标识信息;所述标识信息用于GPU确定所述第一目标子区域,并针对所述第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据和摆动参数数据,以及针对所述第一目标子区域中未与动态物体发生碰撞的对象实例生成摆动参数数据。
24、一种数据处理装置,其特征在于,包括:
划分模块,用于将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;
构建模块,用于按照所述多个子区域的嵌套关系,构建所述四叉树;
第二存储模块,用于在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域以确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
25、根据条款24所述的装置,其特征在于,所述第二存储模块包括:
第三存储单元,用于在所述四叉树的任一个叶子节点中,存储其对应子区域的实例缓存数据的缓存地址;
第四存储单元,用于在所述四叉树的任一个非叶子节点中,存储其连接的各孩子节点中所存储的缓存地址。
26、根据条款25所述的装置,其特征在于,所述第二存储模块还包括:
第五存储单元,用于将所述四叉树的每个叶子节点对应子区域的实例缓存数据,存储至共享缓存区,其中,连接同一个父节点的叶子节点的缓存地址连续;
所述第四存储单元包括:
存储子单元,用于在所述四叉树的任一个非叶子节点中,基于其连接的各孩子节点中所存储的缓存地址,存储各孩子节点中所存储的缓存地址对应的缓存地址范围。
27、根据条款24所述的装置,其特征在于,所述装置还包括:
第二遍历模块,用于遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
第二发送模块,用于基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
28、根据条款27所述的装置,其特征在于,所述实例缓存数据具体包括所述子区域中的各个对象实例的静态渲染数据;
所述第二发送模块包括:
第二发送单元,用于基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,调用GPU生成所述目标子区域中每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
29、根据条款28所述的装置,其特征在于,所述装置还包括:
第三确定单元,用于从位于视野范围内的目标子区域中确定存在对象实例与动态物体发送碰撞的第一目标子区域;
其中,所述绘制命令中包括目标子区域为第一目标子区域的标识信息;所述标识信息用于GPU确定所述第一目标子区域,并针对所述第一目标子区域中与动态物体发生碰撞的对象实例生成交互模拟数据和摆动参数数据,以及针对所述第一目标子区域中未与动态物体发生碰撞的对象实例生成摆动参数数据。
30、一种渲染装置,其特征在于,包括:
第三确定模块,用于确定待渲染区域对应的四叉树;其中,所述待渲染区域预先按照所述四叉树的树形结构进行网格划分获得多个子区域;所述四叉树基于所述多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据或者所述缓存数据对应的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
第三遍历模块,用于遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
第三发送模块,用于基于每个目标子区域对应的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。

Claims (10)

1.一种数据处理方法,其特征在于,包括:
将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;按照所述多个子区域的嵌套关系,构建所述四叉树;
在所述四叉树的每个节点中存储其对应子区域的实例缓存数据,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
2.根据权利要求1所述的方法,其特征在于,所述在所述四叉树的每个节点中存储其对应子区域的实例缓存数据之后,所述方法还包括:
遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
3.根据权利要求2所述的方法,其特征在于,所述实例缓存数据具体包括所述子区域中的各个对象实例的静态渲染数据;
所述基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染包括:
基于每个目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,调用GPU生成所述目标子区域中每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
4.一种数据处理方法,其特征在于,包括:
将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;
按照所述多个子区域的嵌套关系,构建所述四叉树;
在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域以确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
5.根据权利要求4所述的方法,其特征在于,所述在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址之后,所述方法还包括:
遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
6.根据权利要求5所述的方法,其特征在于,所述实例缓存数据具体包括所述子区域中的各个对象实例的静态渲染数据;
所述基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染包括:
基于每个目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,调用GPU生成所述目标子区域中每个对象实例的动态渲染数据,并结合每个对象实例的静态渲染数据及动态渲染数据,渲染获得每个对象实例。
7.一种渲染方法,其特征在于,包括:
确定待渲染区域对应的四叉树;其中,所述待渲染区域预先按照所述四叉树的树形结构进行网格划分获得多个子区域;所述四叉树基于所述多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据或者所述缓存数据对应的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
基于每个目标子区域对应的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
8.一种数据处理装置,其特征在于,包括:
划分模块,用于将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;
构建模块,用于按照所述多个子区域的嵌套关系,构建所述四叉树;
第一存储模块,用于在所述四叉树的每个节点中存储其对应子区域的实例缓存数据,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域,确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
9.一种数据处理装置,其特征在于,包括:
划分模块,用于将待渲染区域按照四叉树的树形结构进行网格划分,获得多个子区域;
构建模块,用于按照所述多个子区域的嵌套关系,构建所述四叉树;
第二存储模块,用于在所述四叉树的每个节点中存储其对应子区域的实例缓存数据的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
其中,所述四叉树用于进行对象实例渲染时,遍历每个节点对应的子区域以确定位于视野范围内的目标子区域,并基于所述目标子区域对应节点存储的缓存地址索引的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
10.一种渲染装置,其特征在于,包括:
第三确定模块,用于确定待渲染区域对应的四叉树;其中,所述待渲染区域预先按照所述四叉树的树形结构进行网格划分获得多个子区域;所述四叉树基于所述多个子区域的嵌套关系构建生成,并在每个节点中存储其对应子区域的实例缓存数据或者所述缓存数据对应的缓存地址,其中,所述实例缓存数据包括所述子区域中的各个对象实例的渲染数据;
第三遍历模块,用于遍历所述四叉树中每个节点对应的子区域,确定位于视野范围内的目标子区域;
第三发送模块,用于基于每个目标子区域对应的实例缓存数据,发起一次绘制命令,以调用GPU结合所述实例缓存数据进行对象实例渲染。
CN202010489944.5A 2020-06-02 2020-06-02 数据处理方法及装置 Pending CN111798558A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202010489944.5A CN111798558A (zh) 2020-06-02 2020-06-02 数据处理方法及装置
PCT/CN2020/112547 WO2021243862A1 (zh) 2020-06-02 2020-08-31 数据处理方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010489944.5A CN111798558A (zh) 2020-06-02 2020-06-02 数据处理方法及装置

Publications (1)

Publication Number Publication Date
CN111798558A true CN111798558A (zh) 2020-10-20

Family

ID=72806036

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010489944.5A Pending CN111798558A (zh) 2020-06-02 2020-06-02 数据处理方法及装置

Country Status (2)

Country Link
CN (1) CN111798558A (zh)
WO (1) WO2021243862A1 (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113034657A (zh) * 2021-03-30 2021-06-25 完美世界(北京)软件科技发展有限公司 游戏场景中光照信息的渲染方法、装置及设备
CN113713381A (zh) * 2021-09-09 2021-11-30 腾讯科技(深圳)有限公司 对象管理方法、装置、设备、存储介质及系统

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116912411A (zh) * 2023-07-17 2023-10-20 杭州阳斯信息技术有限公司 数字化电网图形展示智能算法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101281654A (zh) * 2008-05-20 2008-10-08 上海大学 一种基于八叉树的大规模复杂三维场景处理方法
CN103903295A (zh) * 2014-04-04 2014-07-02 四川川大智胜软件股份有限公司 一种基于InfiniBand实时调度海量高精度三维场景数据的方法
CN106997612A (zh) * 2016-01-13 2017-08-01 索尼互动娱乐股份有限公司 图像渲染的装置和方法

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1710607A (zh) * 2005-07-08 2005-12-21 北京航空航天大学 一种面向虚拟现实三维图形引擎的三维场景组织方法
KR101136737B1 (ko) * 2011-10-07 2012-04-19 (주)넥셀 그래픽 처리방법 및 그 장치
CN102867331A (zh) * 2012-08-31 2013-01-09 电子科技大学 面向gpu的大规模地形快速绘制方法
GB2524287B (en) * 2014-03-19 2020-07-01 Advanced Risc Mach Ltd Graphics processing systems
CN105824943A (zh) * 2016-03-21 2016-08-03 立得空间信息技术股份有限公司 一种二维地图引擎海量矢量数据存储方法
CN106055563B (zh) * 2016-05-19 2019-06-25 福建农林大学 一种基于网格划分的并行空间查询方法及其系统

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101281654A (zh) * 2008-05-20 2008-10-08 上海大学 一种基于八叉树的大规模复杂三维场景处理方法
CN103903295A (zh) * 2014-04-04 2014-07-02 四川川大智胜软件股份有限公司 一种基于InfiniBand实时调度海量高精度三维场景数据的方法
CN106997612A (zh) * 2016-01-13 2017-08-01 索尼互动娱乐股份有限公司 图像渲染的装置和方法

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
ROYSTAN: "Unity Grass Shader Tutorial", 《HTTPS://ROYSTAN.NET/ARTICLES/GRASS-SHADER.HTML》 *
唐兵: "GPU优化的3D游戏室外大场景的渲染方法", 《中国优秀硕士学位论文全文数据库-信息科技辑》 *
袁旭公: "基于GPU编程的漫游系统实时优化技术研究", 《中国优秀硕士学位论文全文数据库-信息科技辑》 *
赵前科: "交互式自然场景实时渲染的研究与实现", 《中国优秀硕士学位论文全文数据库-信息科技辑》 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113034657A (zh) * 2021-03-30 2021-06-25 完美世界(北京)软件科技发展有限公司 游戏场景中光照信息的渲染方法、装置及设备
CN113713381A (zh) * 2021-09-09 2021-11-30 腾讯科技(深圳)有限公司 对象管理方法、装置、设备、存储介质及系统
CN113713381B (zh) * 2021-09-09 2023-06-20 腾讯科技(深圳)有限公司 对象管理方法、装置、设备、存储介质及系统

Also Published As

Publication number Publication date
WO2021243862A1 (zh) 2021-12-09

Similar Documents

Publication Publication Date Title
CN106407408B (zh) 一种海量点云数据的空间索引构建方法及装置
US7002571B2 (en) Grid-based loose octree for spatial partitioning
CN111798558A (zh) 数据处理方法及装置
DE102013204062A1 (de) Voll-Parallel-am-Platz-Konstruktion von 3D-Beschleunigungs-Strukturen in einer Grafik-Verarbeitungs-Einheit
CN103460253A (zh) 用于图形处理的像素值精简
KR20090091617A (ko) 이웃 포인트의 탐색이 용이한 3d 영상 처리 방법
CN114627219A (zh) 三维场景数据的渲染方法及装置、存储介质、电子装置
Tikhonova et al. A Preview and Exploratory Technique for Large-Scale Scientific Simulations.
CN113722314B (zh) 一种空间连接查询方法、装置、电子设备及存储介质
KR100903777B1 (ko) 3차원 광선 추적 시스템에서 적응형 다중 계층 케이디-트리구조 알고리즘을 이용한 광선 추적 방법 및 장치
Hastings et al. Optimization of large-scale, real-time simulations by spatial hashing
CN114255160A (zh) 数据处理方法、装置、设备及存储介质
CN115578536A (zh) 一种分层分块三维模型节点合并方法、装置和电子装置
Rivara Lepp-bisection algorithms, applications and mathematical properties
US20230351696A1 (en) Data processing method and apparatus, device, computer-readable storage medium, and computer program product
CN109712242A (zh) 一种支持大规模三维场景虚拟漫游的模型数据组织方法
CN108986210A (zh) 三维场景重建的方法和设备
US20230281251A1 (en) Object management method and apparatus, device, storage medium, and system
Wang et al. An improving algorithm for generating real sense terrain and parameter analysis based on fractal
Wang et al. Orthogonal voronoi diagram and treemap
Akaydın et al. Adaptive grids: an image-based approach to generate navigation meshes
CN110111407B (zh) 一种海量三维网格数据的调度渲染方法及系统
CN109903384B (zh) 一种模型设置的方法及装置、计算设备和存储介质
Dubois et al. Highly Efficient Controlled Hierarchical Data Reduction techniques for Interactive Visualization of Massive Simulation Data.
CN113763240A (zh) 一种点云缩略图生成方法、装置、设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination