一种三维场景渲染方法

文档序号:6623426阅读:308来源:国知局
一种三维场景渲染方法
【专利摘要】本发明实施例公开了一种三维场景渲染方法,实现了在渲染三维场景时减少材质应用的次数,同时,相应地减少了程序和显卡的交互次数,减少了状态的变化数量,从而提高三维场景的渲染效率。本发明实施例方法包括:S1:遍历分类容器,并从中提取与三维场景的材质相对应的记录;S2:根据记录对与材质相对应的所有三角面进行绘制;S3:对所有类别的材质的三角面进行一一渲染。
【专利说明】一种三维场景渲染方法

【技术领域】
[0001] 本发明涉及计算机显示【技术领域】,尤其涉及一种三维场景渲染方法。

【背景技术】
[0002] 三维是指在平面二维系中又加入了一个方向向量构成的空间系,随着科技的发 展,基于电脑/互联网的数字化的三维立体3D技术日趋成熟。在经过多年的快速发展与广 泛应用,当前3D技术得到了显著的成熟与普及,一个以3D取代2D、"立体"取代"平面"、"虚 拟"模拟"现实"的3D浪潮正在各个领域迅猛掀起。3D应用程序通过加载和渲染较庞大的 数据,达到显示的场景更贴近现实的效果。这些数据主要包括模型、地形、纹理、光照等等。 在渲染场景时,通常以物体为单位,先使用物体的顶点建立物体的轮廓,这些轮廓一般表现 为3角网(三角面集合),之后在三角网的每一个三角面中应用材质来显示一个物体,逐个 物体渲染直至把整个场景中的物体都显示完,通过这样构造出仿真的效果。
[0003] 这种传统的以渲染物体为单位方式,比较符合较常规的仿真思维。比如要显示 一个房间,一般的方法是先把房间的墙和天花板显示出来,之后再把房间中的物体一件一 件的显示。类似素描,把物体逐个绘制出来。传统的方法给每个三角面都应用材质的过 程是非常耗时的,因为计算机需要分别把每个面的的顶点数据以及材质数据发送给计算 机的显卡,并为每个面处理纹理的融合和光照,每一次的应用材质都需要渲染引擎,例如 OpenGL(Open Graphics Library)或者DX(DirectX),进行一次状态的改变,这些操作耗 CPU(中央处理器,Central Processing Unit)和 GPU(图形处理器,Graphic Processing Unit)资源,虽然在小场景应用中,需要渲染的物体数量不多,因此程序的显示速度并不低。 但在大场景中,渲染物体数量较多,而每个物体可能包含成千上万,甚至更多数量的三角 面,意味着需要大数据量的改变渲染状态,因此采用传统的每个物体逐个渲染的是比较耗 费CPU和GPU的处理资源,导致处理时间是非常耗费的。
[0004] 基于上述提及的渲染物体多数据量时,耗费CPU和GPU的处理资源,导致处理时间 是非常耗费的技术问题,本发明提出了减少材质应用的次数,则能减少程序和显卡的交互 次数,减少了状态的变化数量,从而提高三维场景的渲染效率。


【发明内容】

[0005] 本发明实施例提供了一种三维场景渲染方法,实现了在渲染三维场景时减少材质 应用的次数,同时,相应地减少了程序和显卡的交互次数,减少了状态的变化数量,从而提 高三维场景的渲染效率。
[0006] 本发明实施例提供了一种三维场景渲染方法,步骤包括:
[0007] S1 :遍历分类容器,并从中提取与三维场景的材质相对应的记录;
[0008] S2 :根据所述记录对与所述材质相对应的所有三角面进行绘制;
[0009] S3 :重复步骤S1对所有类别的材质的三角面进行一一渲染。
[0010] 优选地,
[0011] 所述步骤S1之前还包括:
[0012] 创建用于存储所述材质和与之相对应的所述记录的所述分类容器,所述记录包含 有物体信息和三角面信息。
[0013] 优选地,
[0014] 所述步骤S1之前还包括:
[0015] 按照递增遍历的方式将所述三维场景的所有物体一一遍历,并一一遍历每个所述 物体对应的三角面;
[0016] 对所述所有物体的所述三角面以所述材质进行分类。
[0017] 优选地,
[0018] 按照递增遍历的方式将所述三维场景的所有物体一一遍历,及每个所述物体对应 的三角面具体包括:
[0019] 按照递增遍历的方式将所述三维场景的所有物体一一遍历,并获取与每个所述物 体相对应的模型数据;
[0020] 遍历每个所述物体对应的所述三角面,并获取与所述三角面相对应的所述材质。
[0021] 优选地,
[0022] 对所述所有物体的所述三角面以材质进行分类具体包括:
[0023] 检索所述分类容器中是否存在所述材质和与之相对应的所述记录,若是,则触发 进阶判断模式,若否,则添加所述材质和与之相对应的所述记录。
[0024] 优选地,
[0025] 所述进阶判断模式具体包括:
[0026] 判断所述记录中是否存在有与所述物体相对应的物体信息,若是,则在所述记录 中添加与所述材质相对应的三角面信息,若否,则基于所述材质创建与之相对应的所述记 录。
[0027] 优选地,
[0028] 所述步骤S2具体包括:
[0029] 通过所述记录获取相应的模型数据;
[0030] 根据所述模型数据对与所述材质相对应的所有三角面进行绘制,并应用所述材 质。
[0031] 优选地,
[0032] 所述物体信息为物体游标编号;
[0033] 所述三角面信息为三角面游标编号。
[0034] 优选地,
[0035] 所述模型数据包括三角面的顶点数据和材质数据。
[0036] 优选地,
[0037] 所述材质为材质编号信息。
[0038] 从以上技术方案可以看出,本发明实施例具有以下优点:
[0039] 本发明实施例提供了一种三维场景渲染方法,方法包括:S1 :遍历分类容器,并从 中提取与三维场景的材质相对应的记录;S2 :根据记录对与材质相对应的所有三角面进行 绘制;S3 :对所有类别的材质的三角面进行一一渲染。本发明实施例中,通过先提取与材质 相对应的记录,并根据记录对与材质相对应的所有三角面进行绘制,最后就不同的材质的 所有三角面一一进行绘制,实现了在渲染三维场景时减少材质应用的次数,同时,相应地减 少了程序和显卡的交互次数,减少了状态的变化数量,从而提高三维场景的渲染效率。

【专利附图】

【附图说明】
[0040] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本 发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可 以根据这些附图获得其它的附图。
[0041] 图1为本发明实施例提供的一种三维场景渲染方法的一个实施例的流程示意图;
[0042] 图2为本发明实施例提供的一种三维场景渲染方法的另一个实施例的流程示意 图;
[0043] 图3为本发明实施例提供的一种三维场景渲染方法的另一个实施例的流程示意 图;
[0044] 图4为本发明实施例提供的一种三维场景渲染方法的另一个实施例的流程示意 图。

【具体实施方式】
[0045] 本发明实施例提供了一种三维场景渲染方法,实现了在渲染三维场景时减少材质 应用的次数,同时,相应地减少了程序和显卡的交互次数,减少了状态的变化数量,从而提 高三维场景的渲染效率。
[0046] 为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明 实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述 的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域 普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护 的范围。
[0047] 请参阅图1,本发明实施例提供的一种三维场景渲染方法的一个实施例包括:
[0048] S1 :遍历分类容器,并从中提取与三维场景的材质相对应的记录;
[0049] 本发明实施例中,当需要对一个三维场景进行渲染并显示的时候,首先需要遍历 分类容器,并从中提取与三维场景的材质相对应的记录。
[0050] 需要说明的是,前述的相对应的记录可以是与三维场景的某一材质所有相关联的 记录,该记录包含有具备某一材质的所有物体的物体信息和在该物体中应用前述的材质的 所有三角面信息。
[0051] 可以理解的是,前述的分类容器包含有该三维场景所有的材质,物体和三角面的 相关信息或数据内容。
[0052] S2 :根据记录对与材质相对应的所有三角面进行绘制;
[0053] 当从分类容器中提取与三维场景的材质相对应的记录之后,需要根据记录对与材 质相对应的所有三角面进行绘制,需要说明的是,根据记录对与材质相对应的所有三角面 进行绘制将在后续实施例中进行详细的描述,此处便不再赘述。
[0054] S3 :重复步骤S1对所有类别的材质的三角面进行一一渲染。
[0055] 本实施例中,当根据记录对与材质相对应的所有三角面进行绘制之后,需要重复 步骤S1对所有类别的剩下的材质的三角面进行一一渲染,最终仅依靠材质进行所有材质 的一次性渲染。
[0056] 本发明实施例中,通过先提取与材质相对应的记录,并根据记录对与材质相对应 的所有三角面进行绘制,最后就不同的材质的所有三角面一一进行绘制,实现了在渲染三 维场景时减少材质应用的次数,同时,相应地减少了程序和显卡的交互次数,减少了状态的 变化数量,从而提高三维场景的渲染效率。
[0057] 上面是对三维场景渲染方法的过程进行详细的描述,下面将对遍历分类容器之前 的创建分类容器的过程进行详细的描述,请参阅图2,本发明实施例提供的一种三维场景渲 染方法的另一个实施例包括:
[0058] 201、创建用于存储材质和与之相对应的记录的分类容器;
[0059] 本发明实施例中,当需要对一个三维场景进行渲染并显示之前,需要创建用于存 储材质和与之相对应的记录的分类容器,需要说明的是,前述的记录包含有物体信息和三 角面信息,前述的物体信息可以是物体游标编号Oindex,前述的三角面信息可以是三角面 游标编号Tindex。
[0060] 例如分类容器中设定为〈材质编号信息,〈物体信息,物体内使用该材质三角面 集合vec〉〉,在vec中记录的是三角面的三角面信息,例如集合vec: {0,6, ···,]!},其中,0,6 表示物体中三角面的游标编号Tindex为0, 6,可以理解的是,〈3,〈5, {100,200}〉〉表示为 第5个物体中的第100,第200个三角面使用了材质3。
[0061] 202、按照递增遍历的方式将三维场景的所有物体一一遍历,并一一遍历每个物体 对应的三角面;
[0062] 当创建了分类容器之后,需要按照递增遍历的方式将三维场景的所有物体一一遍 历,并一一遍历每个物体对应的三角面,需要说明的是,前述的三维场景有若干个物体,每 个物体有若干个三角面,其对应若干种材质类别。
[0063] 可以理解的是,前述的递增遍历的方式将在后续实施例中进行详细的描述,此处 不再具体赘述。
[0064] 203、对所有物体的三角面以材质进行分类;
[0065] 当按照递增遍历的方式将三维场景的所有物体--遍历,并--遍历每个物体对 应的三角面之后,需要对所有物体的三角面以材质进行分类,可以理解的是,前述的所有物 体对应的所有三角面关联有若干个材质类别,需要基于不同的材质类别对所有物体及其对 应的所有三角面进行编号分类。
[0066] 204、遍历分类容器,并从中提取与三维场景的材质相对应的记录;
[0067] 本发明实施例中,当需要对一个三维场景进行渲染并显示的时候,首先需要遍历 分类容器,并从中提取与三维场景的材质相对应的记录。
[0068] 需要说明的是,前述的相对应的记录可以是与三维场景的某一材质所有相关联的 记录,该记录包含有具备某一材质的所有物体的物体信息和在该物体中应用前述的材质的 所有三角面信息。
[0069] 可以理解的是,前述的分类容器包含有该三维场景所有的材质,物体和三角面的 相关信息或数据内容。
[0070] 205、根据记录对与材质相对应的所有三角面进行绘制;
[0071] 当从分类容器中提取与三维场景的材质相对应的记录之后,需要根据记录对与材 质相对应的所有三角面进行绘制,需要说明的是,根据记录对与材质相对应的所有三角面 进行绘制将在后续实施例中进行详细的描述,此处便不再赘述。
[0072] 206、重复步骤204对所有类别的材质的三角面进行一一渲染。
[0073] 本实施例中,当根据记录对与材质相对应的所有三角面进行绘制之后,需要重复 步骤204对所有类别的剩下的材质的三角面进行一一渲染,最终仅依靠材质进行所有三角 面的一次性渲染。
[0074] 本发明实施例中,通过先创建用于存储材质和与之相对应的记录的分类容器,再 基于材质对三维场景中的物体及其相关三角面进行分类,通过提取与材质相对应的记录, 并根据记录对与材质相对应的所有三角面进行绘制,最后就不同的材质的所有三角面一一 进行绘制,可以认为是直接提取与材质相对应的记录并进行批量显示,因而一种材质只渲 染一次,从而减少材质应用的次数,同时,相应地减少了程序和显卡的交互次数,减少了状 态的变化数量,相应地提高了 CPU和GPU的性能。
[0075] 上面是对遍历分类容器之前的过程进行详细的描述,下面将对三维场景的材质的 分类进行详细的描述,请参阅图3,本发明实施例提供的一种三维场景渲染方法的另一个实 施例包括:
[0076] 301、创建用于存储材质和与之相对应的记录的分类容器;
[0077] 本发明实施例中,当需要对一个三维场景进行渲染并显示之前,需要创建用于存 储材质和与之相对应的记录的分类容器,需要说明的是,前述的记录包含有物体信息和三 角面信息,前述的物体信息可以是物体游标编号Oindex,前述的三角面信息可以是三角面 游标编号Tindex。
[0078] 例如分类容器中设定为〈材质编号信息,〈物体信息,物体内使用该材质三角面 集合vec〉〉,在vec中记录的是三角面的三角面信息,例如vec: {0, 6,…,n},其中,0,6表示 物体中三角面的游标编号Tindex为0, 6,可以理解的是,〈3,〈5, {100,200}〉〉表示为第5个 物体中的第100,第200个三角面使用了材质3。
[0079] 202、按照递增遍历的方式将三维场景的所有物体一一遍历,并获取与每个物体相 对应的模型数据;
[0080] 当创建了分类容器之后,需要按照递增遍历的方式将三维场景的所有物体一一遍 历,并获取与每个物体相对应的模型数据,需要说明的是,前述的三维场景有若干个物体, 每个物体有若干个三角面,其对应若干种材质类别,例如设置物体游标编号Oindex为1,当 获取Oindex为1的物体的所有对应的模型数据之后,再递增1个物体游标编号,如Oindex 为2的物体的所有对应的模型数据,以此类推进行递增获取。
[0081] 可以理解的是,前述的模型数据包括三角面的顶点数据和材质数据。
[0082] 303、遍历每个物体对应的三角面,并获取与三角面相对应的材质;
[0083] 当获取到一个物体相对应的模型数据之后,需要遍历该物体对应的三角面,并获 取与三角面相对应的材质,例如设置三角面游标编号Tindex为1,当获取Tindex为1的三 角面的所有对应的材质信息编号之后,再递增1个三角面游标编号,如Tindex为2的物体 的所有对应的材质信息编号,以此类推进行递增获取。
[0084] 可以理解的是,前述的所有物体对应的所有三角面关联有若干个材质类别,需要 基于不同的材质类别对所有物体及其对应的所有三角面进行编号分类。
[0085] 304、检索分类容器中是否存在材质和与之相对应的记录,若是,则执行步骤305, 若否则执行步骤308 ;
[0086] 当遍历每个物体对应的三角面,并获取与三角面相对应的材质之后,需要检索分 类容器中是否存在材质信息编号和与之相对应的记录,若是,则执行步骤305,若否,则执 行步骤308,需要说明的是,前述的记录包含有物体游标编号和三角面游标编号,例如步骤 301中的记录为〈材质信息编号〈物体游标编号Oindex,{:三角面游标编号Tindex} >〉,若存 在与材质信息编号一致的记录,则执行步骤305,若不存在与材质信息编号一致的记录,则 执行步骤308。
[0087] 305、判断记录中是否存在有与物体相对应的物体信息,若是,则执行步骤306,若 否,则执行步骤307;
[0088] 当判断存在与材质信息编号一致的记录之后,则需要再判断记录中是否存在有与 物体相对应的物体信息,例如记录为〈材质信息编号〈物体游标编号Oindex, {三角面游标 编号Tindex} >〉,存在与物体游标编号Oindex -致的物体信息,则执行步骤306,若不存在 与物体游标编号Oindex -致的物体信息,则执行步骤307。
[0089] 306、在记录中添加与材质相对应的三角面信息;
[0090] 当判断记录中存在有与物体相对应的物体信息之后,则在记录中添加与材质相对 应的二角面?目息,例如记录为〈材质?目息编号〈物体游标编号Oindex, {二角面游标编号 Tindex} >〉,添加与材质相对应的三角面游标编号Tindexl,则为〈材质信息编号〈物体游标 编号Oindex, {三角面游标编号Tindex,三角面游标编号Tindexl} >〉。
[0091] 需要说明的是,当在记录中添加与材质相对应的三角面信息之后需要重复步骤 303对该物体相对应的所有三角面进行递增式地一一遍历,当对所有三角面的三角面游标 编号Tindex进行递增式地一一遍历完成步骤306之后,则需要重复步骤302对三维场景中 的所有物体的物体游标编号Oindex进行递增式地一一遍历完成步骤306。
[0092] 307、基于材质创建与之相对应的记录;
[0093] 当判断记录中不存在有与物体相对应的物体信息之后,则基于材质创建与之 相对应的记录,例如记录为〈材质?目息编号〈物体游标编号Oindex, {二角面游标编号 Tindex} >〉,则创建与材质信息编号相对应的记录〈物体游标编号Oindexl,{三角面游标编 号Tindex} >,则为材质信息编号〈物体游标编号Oindex,{:三角面游标编号Tindex} >,〈物 体游标编号Oindexl, {三角面游标编号Tindex} >〉。
[0094] 需要说明的是,当基于材质创建与之相对应的记录之后需要重复步骤303对该物 体相对应的所有三角面进行递增式地一一遍历,当对所有三角面的三角面游标编号Tindex 进行递增式地一一遍历完成步骤307之后,则需要重复步骤302对三维场景中的所有物体 的物体游标编号Oindex进行递增式地一一遍历完成步骤307。
[0095] 308、添加材质和与之相对应的记录;
[0096] 当判断不存在与材质信息编号一致的记录之后,则添加材质和与之相对应的记 录,例如在记录中没有与材质信息编号一致的记录时,该材质信息编号和预置相对应的记 录为〈材质信息编号〈物体游标编号Oindex, {:三角面游标编号Tindex} >〉,将该记录添加 进分类容器中。
[0097] 需要说明的是,当添加材质和与之相对应的记录之后需要重复步骤303对该物体 相对应的所有三角面进行递增式地一一遍历,当对所有三角面的三角面游标编号Tindex 进行递增式地一一遍历完成步骤308之后,则需要重复步骤302对三维场景中的所有物体 的物体游标编号Oindex进行递增式地一一遍历完成步骤308。
[0098] 309、遍历分类容器,并从中提取与三维场景的材质相对应的记录;
[0099] 本发明实施例中,此时当需要对一个三维场景进行渲染并显示的时候,首先需要 遍历分类容器,并从中提取与三维场景的材质相对应的记录。
[0100] 需要说明的是,前述的相对应的记录可以是与三维场景的某一材质所有相关联的 记录,该记录包含有具备某一材质的所有物体的物体信息和在该物体中应用前述的材质的 所有三角面信息。
[0101] 可以理解的是,前述的分类容器包含有该三维场景所有的材质,物体和三角面的 相关信息或数据内容。
[0102] 310、根据记录对与材质相对应的所有三角面进行绘制;
[0103] 当从分类容器中提取与三维场景的材质相对应的记录之后,需要根据记录对与材 质相对应的所有三角面进行绘制,需要说明的是,根据记录对与材质相对应的所有三角面 进行绘制将在后续实施例中进行详细的描述,此处便不再赘述。
[0104] 311、重复步骤309对所有类别的材质的三角面进行一一渲染。
[0105] 本实施例中,当根据记录对与材质相对应的所有三角面进行绘制之后,需要重复 步骤309对所有类别的剩下的材质的三角面进行一一渲染,最终仅依靠材质进行所有三角 面的一次性渲染。
[0106] 本发明实施例中,通过先创建用于存储材质和与之相对应的记录的分类容器,再 基于材质对三维场景中的物体一一遍历及其相关三角面一一遍历之后进行分类,通过提取 与材质相对应的记录,并根据记录对与材质相对应的所有三角面进行绘制,最后就不同的 材质的所有三角面一一进行绘制,可以是直接提取与材质相对应的记录便实现了渲染三维 场景,因而一种材质只渲染一次,从而减少材质应用的次数,同时,相应地减少了程序和显 卡的交互次数,减少了状态的变化数量,相应地提高了 CPU和GPU的性能。
[0107] 上面是对三维场景的材质的分类进行详细的描述,下面将对根据记录对与材质相 对应的所有三角面进行绘制的过程进行详细的描述,请参阅图4,本发明实施例提供的一种 三维场景渲染方法的另一个实施例包括:
[0108] 401、创建用于存储材质和与之相对应的记录的分类容器;
[0109] 本发明实施例中,当需要对一个三维场景进行渲染并显示之前,需要创建用于存 储材质和与之相对应的记录的分类容器,需要说明的是,前述的记录包含有物体信息和三 角面信息,前述的物体信息可以是物体游标编号Oindex,前述的三角面信息可以是三角面 游标编号Tindex。
[oho] 例如分类容器中设定为〈材质编号信息,〈物体信息,物体内使用该材质三角面 集合vec〉〉,在vec中记录的是三角面的三角面信息,例如vec: {0,6, ···,]!},其中,0,6表示 物体中三角面的游标编号Tindex为0, 6,可以理解的是,〈3,〈5, {100,200}〉〉表示为第5个 物体中的第100,第200个三角面使用了材质3。
[0111] 402、按照递增遍历的方式将三维场景的所有物体一一遍历,并获取与每个物体相 对应的模型数据;
[0112] 当创建了分类容器之后,需要按照递增遍历的方式将三维场景的所有物体一一遍 历,并获取与每个物体相对应的模型数据,需要说明的是,前述的三维场景有若干个物体, 每个物体有若干个三角面,其对应若干种材质类别,例如设置物体游标编号Oindex为1,当 获取Oindex为1的物体的所有对应的模型数据之后,再递增1个物体游标编号,如Oindex 为2的物体的所有对应的模型数据,以此类推进行递增获取。
[0113] 可以理解的是,前述的模型数据包括三角面的顶点数据和材质数据。
[0114] 403、遍历每个物体对应的三角面,并获取与三角面相对应的材质;
[0115] 当获取到一个物体相对应的模型数据之后,需要遍历该物体对应的三角面,并获 取与三角面相对应的材质,例如设置三角面游标编号Tindex为1,当获取Tindex为1的三 角面的所有对应的材质信息编号之后,再递增1个三角面游标编号,如Tindex为2的物体 的所有对应的材质信息编号,以此类推进行递增获取。
[0116] 可以理解的是,前述的所有物体对应的所有三角面关联有若干个材质类别,需要 基于不同的材质类别对所有物体及其对应的所有三角面进行编号分类。
[0117] 404、检索分类容器中是否存在材质和与之相对应的记录,若是,则执行步骤405, 若否则执行步骤408 ;
[0118] 当遍历每个物体对应的三角面,并获取与三角面相对应的材质之后,需要检索分 类容器中是否存在材质信息编号和与之相对应的记录,若是,则执行步骤405,若否,则执 行步骤408,需要说明的是,前述的记录包含有物体游标编号和三角面游标编号,例如步骤 301中的记录为〈材质信息编号〈物体游标编号Oindex,{:三角面游标编号Tindex} >〉,若存 在与材质信息编号一致的记录,则执行步骤405,若不存在与材质信息编号一致的记录,则 执行步骤408。
[0119] 405、判断记录中是否存在有与物体相对应的物体信息,若是,则执行步骤406,若 否,则执行步骤407;
[0120] 当判断存在与材质信息编号一致的记录之后,则需要再判断记录中是否存在有与 物体相对应的物体信息,例如记录为〈材质信息编号〈物体游标编号Oindex, {三角面游标 编号Tindex} >〉,存在与物体游标编号Oindex -致的物体信息,则执行步骤406,若不存在 与物体游标编号Oindex -致的物体信息,则执行步骤407。
[0121] 406、在记录中添加与材质相对应的三角面信息;
[0122] 当判断记录中存在有与物体相对应的物体信息之后,则在记录中添加与材质相对 应的二角面?目息,例如记录为〈材质?目息编号〈物体游标编号Oindex, {二角面游标编号 Tindex} >〉,添加与材质相对应的三角面游标编号Tindexl,则为〈材质信息编号〈物体游标 编号Oindex, {三角面游标编号Tindex,三角面游标编号Tindexl} >〉。
[0123] 需要说明的是,当在记录中添加与材质相对应的三角面信息之后需要重复步骤 403对该物体相对应的所有三角面进行递增式地一一遍历,当对所有三角面的三角面游标 编号Tindex进行递增式地一一遍历完成步骤406之后,则需要重复步骤402对三维场景中 的所有物体的物体游标编号Oindex进行递增式地一一遍历完成步骤406。
[0124] 407、基于材质创建与之相对应的记录;
[0125] 当判断记录中不存在有与物体相对应的物体信息之后,则基于材质创建与之 相对应的记录,例如记录为〈材质?目息编号〈物体游标编号Oindex, {二角面游标编号 Tindex} >〉,则创建与材质信息编号相对应的记录〈物体游标编号Oindexl,{三角面游标编 号Tindex} >,则为材质信息编号〈物体游标编号Oindex,{:三角面游标编号Tindex} >,〈物 体游标编号Oindexl, {三角面游标编号Tindex} >〉。
[0126] 需要说明的是,当基于材质创建与之相对应的记录之后需要重复步骤403对该物 体相对应的所有三角面进行递增式地一一遍历,当对所有三角面的三角面游标编号Tindex 进行递增式地一一遍历完成步骤407之后,则需要重复步骤402对三维场景中的所有物体 的物体游标编号Oindex进行递增式地一一遍历完成步骤407。
[0127] 408、添加材质和与之相对应的记录;
[0128] 当判断不存在与材质信息编号一致的记录之后,则添加材质和与之相对应的记 录,例如在记录中没有与材质信息编号一致的记录时,该材质信息编号和预置相对应的记 录为〈材质信息编号〈物体游标编号Oindex, {:三角面游标编号Tindex}〉〉,将该记录添加 进分类容器中。
[0129] 需要说明的是,当添加材质和与之相对应的记录之后需要重复步骤403对该物体 相对应的所有三角面进行递增式地一一遍历,当对所有三角面的三角面游标编号Tindex 进行递增式地一一遍历完成步骤408之后,则需要重复步骤402对三维场景中的所有物体 的物体游标编号Oindex进行递增式地一一遍历完成步骤408。
[0130] 409、遍历分类容器,并从中提取与三维场景的材质相对应的记录;
[0131] 本发明实施例中,此时当需要对一个三维场景进行渲染并显示的时候,首先需要 遍历分类容器,并从中提取与三维场景的材质相对应的记录。
[0132] 需要说明的是,前述的相对应的记录可以是与三维场景的某一材质所有相关联的 记录,该记录包含有具备某一材质的所有物体的物体信息和在该物体中应用前述的材质的 所有三角面信息。
[0133] 可以理解的是,前述的分类容器包含有该三维场景所有的材质,物体和三角面的 相关信息或数据内容。
[0134] 410、通过记录获取相应的模型数据;
[0135] 当从分类容器中提取与三维场景的材质相对应的记录之后,需要通过记录获取相 应的模型数据,例如通过该记录的物体的物体游标编号Oindex和三角面的三角面游标编 号Tindex的集合,解析与前述的物体游标编号Oindex和三角面的三角面游标编号Tindex 相对应的模型数据,需要说明的是,前述的模型数据包括三角面的顶点数据和材质数据。
[0136] 411、根据模型数据对与材质相对应的所有三角面进行绘制,并应用材质;
[0137] 当通过记录获取相应的模型数据之后,需要根据模型数据中的所有三角面的顶点 数据对与材质相对应的所有三角面进行绘制,并应用材质,可以理解的是,当获取到所有三 角面的顶点数据之后可以是先对所有的顶点数据应用与之对应的材质数据再对相对应的 所有三角面进行绘制。
[0138] 412、重复步骤409对所有类别的材质的三角面进行--渲染。
[0139] 本实施例中,当根据记录对与材质相对应的所有三角面进行绘制之后,需要重复 步骤409对所有类别的剩下的材质的三角面进行一一渲染,最终仅依靠材质进行所有三角 面的一次性渲染。
[0140] 本发明实施例中,通过先创建用于存储材质和与之相对应的记录的分类容器,再 基于材质对三维场景中的物体一一遍历及其相关三角面一一遍历之后进行分类,通过提取 与材质相对应的记录,并根据模型数据对与材质相对应的所有三角面进行绘制,并应用材 质,最后就不同的材质的所有三角面一一进行绘制,可以是直接提取与材质相对应的记录 便实现了渲染三维场景,因而一种材质只渲染一次,从而减少材质应用的次数,同时,相应 地减少了程序和显卡的交互次数,减少了状态的变化数量,相应地提高了 CPU和GPU的性 能。
[0141] 以上所述,以上实施例仅用以说明本发明实施例提供的一种三维场景渲染方法的 技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通 技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中 部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发 明各实施例技术方案的精神和范围。
【权利要求】
1. 一种三维场景渲染方法,其特征在于,包括: 51 :遍历分类容器,并从中提取与三维场景的材质相对应的记录; 52 :根据所述记录对与所述材质相对应的所有三角面进行绘制; 53 :重复步骤S1对所有类别的材质的三角面进行一一渲染。
2. 根据权利要求1所述的方法,其特征在于,所述步骤S1之前还包括: 创建用于存储所述材质和与之相对应的所述记录的所述分类容器,所述记录包含有物 体息和二角面息。
3. 根据权利要求1所述的方法,其特征在于,所述步骤S1之前还包括: 按照递增遍历的方式将所述三维场景的所有物体,及每个所述物体对应的三角面一一 遍历; 对所述所有物体的所述三角面以所述材质进行分类。
4. 根据权利要求3所述的方法,其特征在于,按照递增遍历的方式将所述三维场景的 所有物体,及每个所述物体对应的三角面 遍历具体包括: 按照递增遍历的方式将所述三维场景的所有物体一一遍历,并获取与每个所述物体相 对应的模型数据; 遍历每个所述物体对应的所述三角面,并获取与所述三角面相对应的所述材质。
5. 根据权利要求3所述的方法,其特征在于,对所述所有物体的所述三角面以材质进 行分类具体包括: 检索所述分类容器中是否存在所述材质和与之相对应的所述记录,若是,则触发进阶 判断模式,若否,则添加所述材质和与之相对应的所述记录。
6. 根据权利要求5所述的方法,其特征在于,所述进阶判断模式具体包括: 判断所述记录中是否存在有与所述物体相对应的物体信息,若是,则在所述记录中添 加与所述材质相对应的三角面信息,若否,则基于所述材质创建与之相对应的所述记录。
7. 根据权利要求1所述的方法,其特征在于,所述步骤S2具体包括: 通过所述记录获取相应的模型数据; 根据所述模型数据对与所述材质相对应的所有三角面进行绘制,并应用所述材质。
8. 根据权利要求2所述的方法,其特征在于, 所述物体信息为物体游标编号; 所述三角面信息为三角面游标编号。
9. 根据权利要求4或7所述的方法,其特征在于,所述模型数据包括三角面的顶点数据 和材质数据。
10. 根据权利要求1或3所述的方法,其特征在于,所述材质为材质编号信息。
【文档编号】G06T15/00GK104156999SQ201410398934
【公开日】2014年11月19日 申请日期:2014年8月13日 优先权日:2014年8月13日
【发明者】潘桂聪, 陈泓坤 申请人:广东威创视讯科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1