一种基于OpenGL的局部刷新方法及系统的制作方法

文档序号:10625223阅读:784来源:国知局
一种基于OpenGL的局部刷新方法及系统的制作方法
【专利摘要】本发明公开一种基于OpenGL的局部刷新方法及系统,其中,包括步骤:A、初始化OpenGL引擎环境,准备渲染数据;B、统计当前帧渲染时状态有改变的节点;C、计算所有状态有改变的节点产生的刷新区域;D、计算刷新区域对应到屏幕上的屏幕区域;E、根据所述屏幕区域设置投影矩阵以及设置视口和裁剪区域;F、将步骤E得到的模型数据和纹理数据提交到渲染器进行渲染。本发明通过采用局部刷新方法,只对状态有改变的节点所在的区域进行刷新,在OpenGL的引擎上实现了屏幕的局部刷新技术,提高了刷新效率,平均帧率比整屏刷新帧率至少提升一倍。
【专利说明】
一种基于OpenGL的局部刷新方法及系统
技术领域
[0001]本发明涉及显示领域,尤其涉及一种基于OpenGL的局部刷新方法及系统。【背景技术】
[0002]OpenGL作为最著名的图形程序接口之一,已被各大平台广泛的支持。几乎所有的图形学引擎(鬼火、cocos2d等)都会实现OpenGL的植染。
[0003]传统引擎的刷新都是屏幕整体刷新。但是在某些产品中,特别是一些非游戏类的应用产品,某个时间阶段,屏幕上大部分区域显示画面是不变的,所以持续整屏刷新就会造成系统资源的浪费,这导致刷新效率变低,且占用系统资源多。
[0004]因此,现有技术还有待于改进和发展。
【发明内容】

[0005]鉴于上述现有技术的不足,本发明的目的在于提供一种基于OpenGL的局部刷新方法及系统,旨在解决现有的图像刷新方法刷新效率低、占用资源多的问题。
[0006]本发明的技术方案如下:一种基于OpenGL的局部刷新方法,其中,包括步骤:A、初始化OpenGL引擎环境,准备渲染数据;B、统计当前帧渲染时状态有改变的节点;C、计算所有状态有改变的节点产生的刷新区域;D、计算刷新区域对应到屏幕上的屏幕区域;E、根据所述屏幕区域设置投影矩阵以及设置视口和裁剪区域;F、将步骤E得到的模型数据和纹理数据提交到渲染器进行渲染。
[0007]所述的基于OpenGL的局部刷新方法,其中,所述步骤A具体包括:A1、解析输入的模型文件和纹理文件,创建渲染节点和渲染纹理;A2、创建OpenGL上下文,设置视口矩阵及投影矩阵;并记录视口矩阵及投影矩阵的初始值;A3、用记录的初始值初始化视口矩阵及投影矩阵。
[0008]所述的基于OpenGL的局部刷新方法,其中,所述步骤B具体包括:B1、创建节点容器;B2、检测当前帧节点的位置、旋转、缩放、纹理或纹理矩阵是否有变化,若有变化则将相应节点放入到节点容器中。
[0009]所述的基于OpenGL的局部刷新方法,其中,所述步骤C具体包括:C1、创建矩形容器;C2、遍历节点容器中所有的节点,获取节点的立方体包围盒;C3、记录节点的xoy面,并保存在矩形容器中。
[0010]所述的基于OpenGL的局部刷新方法,其中,所述步骤D具体包括:D1、遍历矩形容器,根据3D转2D公式,将矩形容器中的所有xoy面转换到正投影坐标系中得到若干矩形对象;D2、用一个大矩形将所有矩形对象包裹在其中;D3、销毁矩形容器;D4、将计算出的大矩形进行视口转换,得到对应屏幕上的屏幕区域。
[0011] 所述的基于OpenGL的局部刷新方法,其中,所述步骤D4中,如果屏幕区域超出屏幕范围,则对屏幕区域进行调整,使之处于屏幕范围之内。
[0012]—种基于OpenGL的局部刷新系统,其中,包括:初始化模块,用于初始化OpenGL引擎环境,准备渲染数据;节点统计模块,用于统计当前帧渲染时状态有改变的节点;刷新区域计算模块,用于计算所有状态有改变的节点产生的刷新区域;屏幕区域计算模块,用于计算刷新区域对应到屏幕上的屏幕区域;设置模块,用于根据所述屏幕区域设置投影矩阵以及设置视口和裁剪区域;渲染模块,用于将得到的模型数据和纹理数据提交到渲染器进行渲染。[〇〇13] 所述的基于OpenGL的局部刷新系统,其中,所述节点统计模块具体包括:节点容器创建单元,用于创建节点容器;变化检测单元,用于检测当前帧节点的位置、旋转、缩放、纹理或纹理矩阵是否有变化, 若有变化则将相应节点放入到节点容器中。
[0014] 所述的基于OpenGL的局部刷新系统,其中,所述刷新区域计算模块具体包括: 矩形容器单元,用于创建矩形容器;立方体包围盒获取单元,用于遍历节点容器中所有的节点,获取节点的立方体包围盒;记录单元,用于记录节点的xoy面,并保存在矩形容器中。
[0015] 所述的基于OpenGL的局部刷新系统,其中,所述屏幕区域计算模块具体包括:转换单元,用于遍历矩形容器,根据3D转2D公式,将矩形容器中的所有xoy面转换到正投影坐标系中得到若干矩形对象;包裹单元,用于用一个大矩形将所有矩形对象包裹在其中;销毁单元,用于销毁矩形容器;屏幕区域获取单元,用于将计算出的大矩形进行视口转换,得到对应屏幕上的屏幕区域。
[0016] 有益效果:本发明通过采用局部刷新方法,只对状态有改变的节点所在的区域进行刷新,在OpenGL的引擎上实现了屏幕的局部刷新技术,提高了刷新效率,平均帧率比整屏刷新帧率至少提升一倍。【附图说明】
[0017]图1为本发明一种基于OpenGL的局部刷新方法较佳实施例的流程图。
[0018]图2为图1所示方法中步骤S101的具体流程图。
[0019]图3为图1所示方法中步骤S102的具体流程图。
[0020]图4为图1所示方法中步骤S103的具体流程图。
[0021]图5为本发明中立方体包围盒的结构示意图。
[0022]图6为图1所示方法中步骤S104的具体流程图。
[0023]图7为本发明中大矩形的结构示意图。
[0024]图8为本发明一种基于OpenGL的局部刷新系统较佳实施例的结构框图。
[0025]图9为图8所示系统中节点统计模块的具体结构框图。
[0026]图10为图8所示系统中刷新区域计算模块的具体结构框图。
[0027]图11为图8所示系统中屏幕区域计算模块的具体结构框图。【具体实施方式】
[0028]本发明提供一种基于OpenGL的局部刷新方法及系统,为使本发明的目的、技术方案及效果更加清楚、明确,以下对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0029]请参阅图1,图1为本发明一种基于OpenGL的局部刷新方法较佳实施例的流程图, 如图所示,其包括步骤:5101、初始化OpenGL引擎环境,准备渲染数据;5102、统计当前帧渲染时,状态有改变的节点;5103、计算所有状态有改变的节点产生的刷新区域;5104、计算刷新区域对应到屏幕上的屏幕区域;5105、根据所述屏幕区域设置投影矩阵以及设置视口和裁剪区域;5106、将步骤S105得到的模型数据和纹理数据提交到渲染器进行渲染。
[0030]相对于屏幕整体刷新技术,本发明所采用的局部刷新方法,通过只对节点状态变化的区域进行刷新,所以节省了系统资源,同时也提高了刷新效率,平均帧率比整屏帧率提升一倍以上。
[0031]具体来说,如图2所示,所述步骤S101具体包括:5201、解析输入的模型文件和纹理文件,创建渲染节点和渲染纹理;5202、创建OpenGL上下文,设置视口矩阵及投影矩阵;并记录视口矩阵及投影矩阵的初始值;具体可根据平台创建OpenGL上下文。
[0032]S203、用记录的初始值初始化视口矩阵及投影矩阵。
[0033]在透视投影的情况下,OpenGL有两个接口可以设置投影矩阵:glPerspective和 glFrustum (均为投影变换函数)。因为glPerspective只能设置对称视景体,所以采用 glFrustum设置投影矩阵。
[0034]进一步,如图3所示,所述步骤S102具体包括:5301、创建节点容器v ;5302、检测当前帧节点的位置、旋转、缩放、纹理、纹理矩阵是否有变化,若有变化则放入到节点容器v中;如果OpenGL的渲染环境,例如视口矩阵、灯光、雾化等影响渲染效果的设置有所变化, 那么会释放所创建的节点容器v,然后直接进行全屏刷新,因为OpenGL的渲染环境发生变化,那么将使整屏都有所变化,所以放弃本发明的局部刷新方法,而采用传统的全屏刷新方式。
[0035]进一步,如图4所示,所述步骤S103具体包括:S401、创建矩形容器r ;其中的矩形容器也称Rect容器,例如存放一个矩形的左上角坐标、宽度和高度。
[0036]S402、遍历节点容器v中所有的节点,获取节点的立方体包围盒;如图5所示,该立方体包围盒也称AABB包围盒,将所有节点包围。
[0037]AABB包围盒为六面体,每一边都平行于一个坐标平面,其目的是用体积稍大且特性简单的几何体来近似地代替复杂的几何对象。
[0038]S403、记录节点的xoy面,将其保存在矩形容器r中。
[0039]获得立方体包围盒后,可记录节点的xoy面,然后保存在所述矩形容器中。
[0040]当然,上述情况是针对节点容器中有节点的情况,若节点容器中的节点数量为0, 那么则销毁矩形容器,然后再返回步骤S203进行初始化,进行下一次渲染。
[0041]进一步,如图6所示,所述步骤S104具体包括:S501、遍历矩形容器,根据3D转2D公式,将矩形容器中的所有xoy面转换到正投影坐标系中得到若干矩形对象;根据3D转2D公式,顶点相对矩阵一〉模型视图矩阵变换一〉投影矩阵变换,将矩形容器r中所有的对象转化到正投影坐标系中。用公式表示如下:P * V * rect,其中,P为投影矩阵,V为视口矩阵,rect即为矩形容器中所保存对象。
[0042]S502、用一个大矩形将所有矩形包裹在其中;如图7所示,采用一个大矩形将得到的所有矩形包裹在其中。
[0043]S503、销毁矩形容器;S504、将计算出的大矩形进行视口转换,得到对应屏幕上的屏幕区域sRect。
[0044]S504中,如果屏幕区域sRect的值超出屏幕范围(sRect左上角X坐标小于0或右上角X坐标大于屏幕宽,或者左上角Y坐标大于屏幕高或左下角Y坐标小于0),则对sRect 进行调整,例如调小sRect的大小,使之处于屏幕范围之内。
[0045]所述步骤S105中,设置投影矩阵的公式包括:float L = sRect.UpperLeftCorner.X / (float)ScreenSize.Width; float R = sRect.LowerRightCorner.X / (float)ScreenSize.Width; float B = sRect.UpperLeftCorner.Y / (float)ScreenSize.Height; float T = sRect.LowerRightCorner.Y / (float)ScreenSize.Height; float rl = Right - Left; float tb = Top - Bottom;Right = R*rl + Left;Left = L*rl + Left;Top = T*tb + Bottom;Bottom = B*tb + Bottom;glFrustumf(Left, Right, Bottom, Top, Near, Far);其中,sRect.UpperLeftCorner.X 为 sRect 左上角 X 坐标; sRect.LowerRightCorner.X 为 sRect 右下角 X 坐标;sRect.UpperLeftCorner.Y 为 sRect 左上角 Y 坐标; sRect.LowerRightCorner.Y 为 sRect 右下角 Y 坐标;ScreenSize.Width 为屏幕的宽;ScreenSize.Height 为屏幕的高;Left、Right、Bottom、Top、Near、Far 为步骤 S101 中用 glFrustumf 初始化时保存的值, 即设置初始化投影矩阵的值。
[0046]设置视口和裁剪区域的公式包括:视口设置:glViewport (sRect.LowerLeftCorner.X, sRect.LowerLeftCorner.Y, sRect.Width, sRect.Height );剪裁区域设置: glEnable(GL_SCISSOR_TEST);glScissor (sRect.LowerLeftCorner.X, sRect.LowerLeftCorner.Y, sRect.Width, sRect.Height );其中:sRect.LowerLeftCorner.X 为 sRect 左下角 X 坐标 sRect.LowerLeftCorner.Y 为 sRect 左下角 Y 坐标 sRect.Width 为 sRect 的宽 sRect.Height 为 sRect 的高最后提交上述的设置,即模型数据和纹理数据到渲染器进行渲染即可。
[0047]本发明所提供的局部刷新方法,特别适合于一些非游戏类的应用产品,即在某个时间段,屏幕上大部分区域的显示画面是不变的,采用本发明的局部刷新方法,可节省大量系统资源,避免频繁全屏刷新,提高了刷新效率,平均帧率相对于整屏刷新帧率至少提升一倍。
[0048]基于上述方法,本发明还提供一种基于OpenGL的局部刷新系统,如图8所示,其包括:初始化模块100,用于初始化OpenGL引擎环境,准备渲染数据;节点统计模块200,用于统计当前帧渲染时状态有改变的节点;刷新区域计算模块300,用于计算所有状态有改变的节点产生的刷新区域;屏幕区域计算模块400,用于计算刷新区域对应到屏幕上的屏幕区域;设置模块500,用于根据所述屏幕区域设置投影矩阵以及设置视口和裁剪区域;渲染模块600,用于将得到的模型数据和纹理数据提交到渲染器进行渲染。
[0049]进一步,如图9所示,所述节点统计模块200具体包括:节点容器创建单元,用于创建节点容器;变化检测单元,用于检测当前帧节点的位置、旋转、缩放、纹理或纹理矩阵是否有变化, 若有变化则将相应节点放入到节点容器中。
[0050]进一步,如图10所示,所述刷新区域计算模块300具体包括:矩形容器单元,用于创建矩形容器;立方体包围盒获取单元,用于遍历节点容器中所有的节点,获取节点的立方体包围盒;记录单元,用于记录节点的xoy面,并保存在矩形容器中。
[0051]进一步,如图11所示,所述屏幕区域计算模块400具体包括:转换单元410,用于遍历矩形容器,根据3D转2D公式,将矩形容器中的所有xoy面转换到正投影坐标系中得到若干矩形对象;包裹单元420,用于用一个大矩形将所有矩形对象包裹在其中;销毁单元430,用于销毁矩形容器;屏幕区域获取单元440,用于将计算出的大矩形进行视口转换,得到对应屏幕上的屏幕区域。
[0052]应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。
【主权项】
1.一种基于OpenGL的局部刷新方法,其特征在于,包括步骤:A、初始化OpenGL引擎环境,准备渲染数据;B、统计当前帧渲染时状态有改变的节点;C、计算所有状态有改变的节点产生的刷新区域;D、计算刷新区域对应到屏幕上的屏幕区域;E、根据所述屏幕区域设置投影矩阵以及设置视口和裁剪区域;F、将步骤E得到的模型数据和纹理数据提交到渲染器进行渲染。2.根据权利要求1所述的基于OpenGL的局部刷新方法,其特征在于,所述步骤A具体 包括:A1、解析输入的模型文件和纹理文件,创建渲染节点和渲染纹理;A2、创建OpenGL上下文,设置视口矩阵及投影矩阵;并记录视口矩阵及投影矩阵的初 始值;A3、用记录的初始值初始化视口矩阵及投影矩阵。3.根据权利要求1所述的基于OpenGL的局部刷新方法,其特征在于,所述步骤B具体 包括:B1、创建节点容器;B2、检测当前帧节点的位置、旋转、缩放、纹理或纹理矩阵是否有变化,若有变化则将相 应节点放入到节点容器中。4.根据权利要求3所述的基于OpenGL的局部刷新方法,其特征在于,所述步骤C具体 包括:C1、创建矩形容器;C2、遍历节点容器中所有的节点,获取节点的立方体包围盒;C3、记录节点的xoy面,并保存在矩形容器中。5.根据权利要求4所述的基于OpenGL的局部刷新方法,其特征在于,所述步骤D具体 包括:D1、遍历矩形容器,根据3D转2D公式,将矩形容器中的所有xoy面转换到正投影坐标 系中得到若干矩形对象;D2、用一个大矩形将所有矩形对象包裹在其中;D3、销毁矩形容器;D4、将计算出的大矩形进行视口转换,得到对应屏幕上的屏幕区域。6.根据权利要求5所述的基于OpenGL的局部刷新方法,其特征在于,所述步骤D4中, 如果屏幕区域超出屏幕范围,则对屏幕区域进行调整,使之处于屏幕范围之内。7.—种基于OpenGL的局部刷新系统,其特征在于,包括:初始化模块,用于初始化OpenGL引擎环境,准备渲染数据;节点统计模块,用于统计当前帧渲染时状态有改变的节点;刷新区域计算模块,用于计算所有状态有改变的节点产生的刷新区域;屏幕区域计算模块,用于计算刷新区域对应到屏幕上的屏幕区域;设置模块,用于根据所述屏幕区域设置投影矩阵以及设置视口和裁剪区域;渲染模块,用于将得到的模型数据和纹理数据提交到渲染器进行渲染。8.根据权利要求7所述的基于OpenGL的局部刷新系统,其特征在于,所述节点统计模 块具体包括:节点容器创建单元,用于创建节点容器;变化检测单元,用于检测当前帧节点的位置、旋转、缩放、纹理或纹理矩阵是否有变化, 若有变化则将相应节点放入到节点容器中。9.根据权利要求8所述的基于OpenGL的局部刷新系统,其特征在于,所述刷新区域计 算模块具体包括:矩形容器单元,用于创建矩形容器;立方体包围盒获取单元,用于遍历节点容器中所有的节点,获取节点的立方体包围 盒;记录单元,用于记录节点的xoy面,并保存在矩形容器中。10.根据权利要求9所述的基于OpenGL的局部刷新系统,其特征在于,所述屏幕区域计 算模块具体包括:转换单元,用于遍历矩形容器,根据3D转2D公式,将矩形容器中的所有xoy面转换到 正投影坐标系中得到若干矩形对象;包裹单元,用于用一个大矩形将所有矩形对象包裹在其中;销毁单元,用于销毁矩形容器;屏幕区域获取单元,用于将计算出的大矩形进行视口转换,得到对应屏幕上的屏幕区 域。
【文档编号】G06T1/00GK105989568SQ201510055198
【公开日】2016年10月5日
【申请日】2015年2月3日
【发明人】秦龙龙, 卢伟超
【申请人】Tcl集团股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1