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

一种基于OSG的并发渲染方法及装置

文献发布时间:2024-04-18 19:58:26


一种基于OSG的并发渲染方法及装置

技术领域

本文件涉及OSG渲染技术领域,尤其涉及一种基于OSG的并发渲染方法及装置。

背景技术

在渲染技术领域中,传统渲染方法通过底层渲染API实现,空间结构组织能力较差;OSG是一个高性能开源三位图形引擎,基于修改的LGPL协议发布,能够广泛应用于飞机仿真、虚拟显示以及科学工程等领域,空间数据结构特性相比于传统渲染方法具有提升。

相关技术中,OSG中间件封装了OpenGL,即包含影响渲染方式所有内容的复杂状态机,当状态发生变化时GPU上的所有渲染必须停止,因为OpenGL包含的复杂结构可能会占用图形处理器成百上千字节的内存,现有的OSG技术无法一起渲染具有相同状态的对象,状态发生变化次数较多时,将导致更改着色器或纹理的设置时间变长。

综合以上该技术领域发展状况分析,现有的技术中能够渲染具有相同状态对象的方案。

发明内容

本发明的目的在于提供一种基于OSG的并发渲染方法及装置,旨在解决现有技术中的上述问题。

根据本公开实施例的第一方面,提供一种基于OSG的并发渲染方法,包括:

根据场景图中节点关联的状态集,构建场景图对应的状态图,使用包含指针的对象确定状态图对应的渲染顺序,使用筛选器追踪状态图,即遍历场景图,删除不合规范的节点,生成用于渲染的渲染集合;

在用户阶段更新所有的用户数据,在拣选预阶段读取用户数据和渲染集合,生成内部数据,在拣选阶段根据内部数据得到渲染顺序的显示列表,在绘制阶段根据显示列表遍历内部数据,得到相应的OpenGL调用数据,将OpenGL调用数据传输给并行处理器进行处理,得到渲染加载数据,其中,拣选阶段和绘制阶段在每个通道中独立并行运行;

通过纹理压缩方式处理渲染加载数据,得到优化渲染数据,使用优化渲染数据进行渲染,得到渲染结果,将渲染结果包含的多个几何体存放在一个几何体对象中。

根据本公开实施例的第二方面,提供一种基于OSG的并发渲染装置,包括:

图形状态管理模块,用于根据场景图中节点关联的状态集,构建场景图对应的状态图,使用包含指针的对象确定状态图对应的渲染顺序,使用筛选器追踪状态图,即遍历场景图,筛选不合规范的节点,生成用于渲染的渲染集合;

多线程并发处理模块,用于在用户阶段更新所有的用户数据,在拣选预阶段读取用户数据和渲染集合,生成内部数据,在拣选阶段根据内部数据得到渲染顺序的显示列表,在绘制阶段根据显示列表遍历内部数据,得到相应的OpenGL调用数据,将OpenGL调用数据传输给并行处理器进行处理,得到渲染加载数据,其中,拣选阶段和绘制阶段在每个通道中独立并行运行;

加载性能优化模块,用于通过纹理压缩方式处理渲染加载数据,得到优化渲染数据,使用优化渲染数据进行渲染,得到渲染结果,将渲染结果包含的多个几何体存放在一个几何体对象中。

本发明实施例提供的技术方案包括以下有益效果:使用状态图保存状态的应用顺序,减少因状态发生变化次数较多带来的更改着色器或纹理的设置时间边长的问题;使用多线程并发渲染的方式降低了图形渲染引擎的负荷,能够对复杂场景进行实时渲染;使用纹理压缩和合并几何体方式优化OSG数据加载性能,提升了渲染效率。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。

附图说明

为了更清楚地说明本说明书一个或多个实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例的基于OSG的并发渲染方法的流程图;

图2是本发明实施例的场景图的示意图;

图3是本发明实施例的状态图的示意图;

图4是本发明实施例的多线程并发渲染数据管理的示意图;

图5是本发明实施例的纹理压缩性能的示意图;

图6是本发明实施例的多线程并发渲染运行的示意图;

图7是本发明实施例的基于OSG的并发渲染装置的示意图。

具体实施方式

为了使本技术领域的人员更好地理解本说明书一个或多个实施例中的技术方案,下面将结合本说明书一个或多个实施例中的附图,对本说明书一个或多个实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部的实施例。基于本说明书一个或多个实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本文件的保护范围。

方法实施例

根据本发明实施例,提供了一种基于OSG的并发渲染方法,图1是本发明实施例的基于OSG的并发渲染方法的流程图,如图1所示,根据本发明实施例的基于OSG的并发渲染方法具体包括:

在步骤S110中,根据场景图中节点关联的状态集StateSet,构建场景图对应的状态图StateGraph,使用包含指针的对象RenderBin确定状态图对应的渲染顺序,使用筛选器CullVisitor追踪状态图,即遍历场景图,删除不合规范的节点,生成用于渲染的渲染集合。具体包括:

遍历场景图的节点,如果节点有关联的状态集StateSet,在状态图StateGraph中添加相应节点,如果节点没有关联的状态集StateSet,不更改状态图StateGraph的形态,其中,状态图的每个节点都有关联的OpenGL状态。图2是本发明实施例的场景图的示意图,如图2所示,场景图的每个节点可能有与该节点对应的状态集StateSet,图3是本发明实施例的状态图的示意图,如图3所示,是与本实施例场景图对应的状态图,要达到状态图中某节点的状态,需要从状态集StateSet对象的根节点向下推送该节点,如果需要到达另一个节点的状态,将父节点的状态集对象弹出到两个节点的共同祖先,再从根节点向下推送。

使用包含指向场景图中叶节点几何图形、状态图以及投影和模型视图矩阵的指针,确定渲染顺序,其中,包含指针的对象还包含场景图中可见的叶节点几何图形。即场景图中可见的叶节点集合图形Drawable对象在渲染前被收集到指针对象RenderBin中,该对象包含一个指向Drawable的指针、一个指向StateGraph节点中叶节点集合图形Drawable的指针,以及指向投影和模型视图矩阵的指针,指向状态图StateGraph的指针是图形状态的紧凑表示。

通过筛选器CullVisitor跟踪状态图StateGraph上的节点,删除状态图StateGraph中不合规范的点,当筛选器CullVisitor找到状态集StateSet时,检测该状态集StateSet是否与状态图子节点的几何图形匹配,如果存在几何图形与状态集相匹配,将该状态集的节点作为当前渲染节点,如果不存在几何图形与状态集相匹配,当新的状态图的子节点被创建后,将新的子节点作为当前渲染节点;执行当前渲染节点,使用筛选器CullVisitor以堆栈方式跟踪对象指向的内容,当跟踪到场景图中的叶节点几何图形时,构造渲染叶RenderLeaf并生成渲染集合,即RenderBin集合。

在步骤S120中,在用户阶段更新所有的用户数据;在拣选预阶段更新场景图中的动态数据;在拣选阶段读取动态数据并结合渲染集合,生成内部数据;在绘制阶段遍历内部数据,得到相应的OpenGL调用数据,将OpenGL调用数据传输给并行处理器进行处理,得到渲染加载数据,其中,拣选阶段和绘制阶段在每个通道中独立并行运行。具体包括:

为每个通道设置拣选线程和绘制线程,并使用单独GPU处理各通道对应的拣选阶段和绘制阶段的任务组;通过遍历内部数据,得到以数据和信息流方式封装OpenGL协议的OpenGL调用数据,将OpenGL调用数据传输给并行处理器进行矩阵变换,得到渲染加载数据。

步骤S120拣选预阶段更新的动态数据包括摄像机位置、场景中移动物体的位置、时间戳、帧数、消耗时间以及其它参量,即应用程序可以访问的公共量,当拣选预阶段结束将给拣选阶段发送一个信号,使拣选阶段进入运行状态。将拣选阶段和绘制阶段分离成独立并行的任务,即集成并行化,当绘制阶段运行于主机上某个专有CPU时,绘制阶段同时与GPU上的另一个并行处理器产生交互,即遍历内部数据,得到以数据和信息流方式封装OpenGL协议的OpenGL调用数据,将OpenGL调用数据传输给并行处理器进行矩阵变换,得到渲染加载数据,且数据的处理是串行进行的。图4是本发明实施例的多线程并发渲染数据管理的示意图,展示了拣选预阶段结合并行化拣选绘制的过程。

在步骤S130中,通过纹理压缩方式处理渲染加载数据,得到优化渲染数据,使用优化渲染数据进行渲染,得到渲染结果,将渲染结果包含的多个几何体存放在一个几何体对象中,即一个Geometry对象对应N个几何体。具体包括:使用S3TC纹理压缩格式对渲染加载数据进行压缩。

纹理存储通过像素RGBA实现,如果不经压缩,一个GPU显存只能存储1024张1024×1024的图片,图5是本发明实施例的纹理压缩性能的示意图,即分配了20x20=400个512x512的RGB的压缩前后的CPU/GPU使用率与显存内存占用率的对比图,如图5所示,证明S3TC纹理压缩格式性能较好。

在本实施例中,使用的S3TC纹理压缩格式以4×4的纹理块基本单位存储,每各纹理块包含64bit或128bit的纹理单元数据,因此要求每张贴图长度或宽度是4的倍数,每个纹理块被看作一个“像素”,长度或宽度不为4倍数的贴图,在压缩的时候舍弃多余部分、补充空位或按4处理。对于一个长度为w,宽度为h,纹理块大小为blocksize的图像,字节大小为ceil(w/4)*ceil(h/4)*blocksize,在解码一个S3TC图像时,使用公式1计算纹理单元(x,y)位于块的地址:

blocksize*(ceil(w/4)*floor(y/3)+floor(x/4))公式1;

其中,ceil表示向上取整,floor表示向下取整,通过纹理单元(x,y)获取其所在块的下标(x%4,y%4)。

综上所述,本发明实施例的上述技术方案提出了一种基于OSG的并发渲染方法,使用状态图机制对不同状态的几何图形进行分组,能够快速唯一地确定要渲染的图形状态;在多通道渲染场景中为每个通道设置拣选线程和绘制线程,为每个拣选阶段/绘制阶段组合任务添加GPU以实现并行集成化,并设置拣选预阶段预先更新公共量,以提升渲染效率;使用S3TC纹理压缩有效优化了内存和显卡的使用情况,合并几何体能够实现几何体的一次性绘制。

结合以下附图,对本发明实施例的上述技术方案进行举例说明。

图6是本发明实施例的多线程并发渲染运行的示意图,如图6所示,在主机上完成拣选预阶段和拣选阶段,并向下传递由主机绘制阶段生成的OpenGL协议,完整工作的起始时间的GPU帧边界尽量贴近,由于拣选阶段和绘制阶段位于同一线程中执行串行处理,原本用于等待垂直回描信号而浪费的主机时间得到了节约。

装置实施例

根据本发明实施例,提供了一种基于OSG的并发渲染装置,图7是本发明实施例的基于OSG的并发渲染装置的示意图,如图7所示,根据本发明实施例的基于OSG的并发渲染装置的示意图,具体包括:

图形状态管理模块70,用于根据场景图中节点关联的状态集,构建场景图对应的状态图,使用包含指针的对象确定状态图对应的渲染顺序,使用筛选器追踪状态图,即遍历场景图,筛选不合规范的节点,生成用于渲染的渲染集合。

具体用于:

遍历场景图的节点,如果节点有关联的状态集,在状态图中添加相应节点,如果节点没有关联的状态集,不更改状态图的形态,其中,状态图的每个节点都有关联的OpenGL状态;

使用包含指向场景图中叶节点几何图形、状态图以及投影和模型视图矩阵的指针,确定渲染顺序,其中,包含指针的对象还包含场景图中可见的叶节点几何图形;

通过筛选器跟踪状态图上的节点,删除状态图中不合规范的点,当筛选器找到状态集时,检测该状态集是否与状态图子节点的几何图形匹配,如果存在几何图形与状态集相匹配,将该状态集的节点作为当前渲染节点,如果不存在几何图形与状态集相匹配,当新的状态图的子节点被创建后,将新的子节点作为当前渲染节点;执行当前渲染节点,使用筛选器以堆栈方式跟踪对象指向的内容,当跟踪到场景图中的叶节点几何图形时,构造渲染叶并生成渲染集合。

多线程并发处理模块72,用于在用户阶段更新所有的用户数据;在拣选预阶段更新场景图中的动态数据;在拣选阶段读取动态数据并结合渲染集合,生成内部数据;在绘制阶段遍历内部数据,得到相应的OpenGL调用数据,将OpenGL调用数据传输给并行处理器进行处理,得到渲染加载数据,其中,拣选阶段和绘制阶段在每个通道中独立并行运行。具体用于:

为每个通道设置拣选线程和绘制线程,并使用单独GPU处理各通道对应的拣选阶段和绘制阶段的任务组;通过遍历内部数据,得到以数据和信息流方式封装OpenGL协议的OpenGL调用数据,将OpenGL调用数据传输给并行处理器进行矩阵变换,得到渲染加载数据。

加载性能优化模块74,用于通过纹理压缩方式处理渲染加载数据,得到优化渲染数据,使用优化渲染数据进行渲染,得到渲染结果,将渲染结果包含的多个几何体存放在一个几何体对象中。具体用于:使用S3TC纹理压缩格式对渲染加载数据进行压缩。

综上所述,本发明实施例的上述技术方案提出了一种基于OSG的并发渲染装置,使用状态图机制对不同状态的几何图形进行分组,能够快速唯一地确定要渲染的图形状态;在多通道渲染场景中为每个通道设置拣选线程和绘制线程,为每个拣选阶段/绘制阶段组合任务添加GPU以实现并行集成化,并设置拣选预阶段预先更新公共量,以提升渲染效率;使用S3TC纹理压缩有效优化了内存和显卡的使用情况,合并几何体能够实现几何体的一次性绘制。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

相关技术
  • 一种基于OSG的大批量文字渲染方法
  • 一种多线程渲染的方法和装置
  • 基于OSG三维渲染引擎预处理的三维场景生成方法及装置
  • 基于OSG三维渲染引擎预处理的三维场景生成方法及装置
技术分类

06120116492219