跨平台调用OpenGLES的渲染方法、装置及计算机存储介质与流程

文档序号:17474465发布日期:2019-04-20 06:02阅读:291来源:国知局
跨平台调用OpenGL ES的渲染方法、装置及计算机存储介质与流程

本发明涉及移动设备视频渲染领域,更具体地,涉及一种跨平台调用opengles的渲染方法、跨平台调用opengles的渲染装置及计算机存储介质。



背景技术:

在当前针对移动设备视频播放功能中,opengles(openglforembeddedsystems)作为一项跨平台且功能完善的图像应用程序接口,是最适合用于移动设备视频渲染备选方案。为保证opengles的跨平台性,opengles仅提供图像渲染能力,并不提供与具体平台展现窗口交互的能力,而是提供了与原生平台窗口交互的接口egl,该接口提供了让opengles与windows,linux,android等操作系统下的原生窗口间建立联系的能力。但在ios端,苹果公司使用了另外一套自定义的接口eagl,eagl不提供直接访问原生窗口的能力,而是需要通过使用fbo+rbo的方式,并调用原生api:eaglcontext将rbo的内容填充到目标窗口上。这种差异为视频跨平台开发造成一定的困扰,针对这种情况,当前有以下两种解决方案:

1、各个平台各自使用rendertexture代替renderbufferobjects(rbo,渲染缓冲对象)在自定义的fragmentbufferobjects(fbo,帧缓冲对象)上进行渲染并最终将这张texture绘制到默认的fbo上,然后进行swap操作。

2、各个平台使用与ioseagl一致的fragmentbufferobjects(fbo)和renderbufferobjects进行离屏渲染操作。

目前常用的两种解决方案存在以下缺点:

1、方案1需要各个平台分别维护一套texture绘制代码,增加后期维护工作量,同时需要额外的内存开销,进行多余的绘制和纹理采样操作。

2、方案2在android平台的gles2.0下,使用fbo+rbo,没有任何copy和swap/present接口可以将rboswap到surface窗口,这意味着android平台需要放弃这种方案使用默认的fbo直接渲染,同样需要单独维护一份代码逻辑。



技术实现要素:

有鉴于此,本发明提供一种跨平台调用opengles的渲染方法、跨平台调用opengles的渲染装置及计算机存储介质,能够绕过eagl限制,让ios应用支持类似egl直接渲染的调用方式。

为解决上述技术问题,一方面,本发明提供一种跨平台调用opengles的渲染方法,所述方法包括:创建glrendercontext来捕获展示窗口的上下文;调用cdisplay接口并将图像rendertexture渲染逻辑传入cdisplay接口中,实现opengles的视频渲染。

根据本发明的一些实施例,所述创建glrendercontext来捕获展示窗口的上下文,包括:编写基于eagllayer系统类的渲染环境glkview;eagllayer系统类提供实现渲染图像功能的cdisplay接口,所述cdisplay接口提供一个block参数作为将绘制图像前数据处理的代码块传入接口;将所述cdisplay接口暴露在头文件以由外部方法进行调用。

根据本发明的一些实施例,使用objective-c++语言编写所述渲染环境glkview。

根据本发明的一些实施例,所述cdisplay接口通过调用eaglcontext的presentrenderbuffer方法实现渲染图像功能。

根据本发明的一些实施例,图像rendertexture渲染逻辑通过lambda函数或方法指针传入所述cdisplay接口。

第二方面,本发明实施例提供一种跨平台调用opengles的渲染装置,包括:获取模块,所述获取模块用于捕获展示窗口的上下文,所述获取模块具有cdisplay接口;调用模块,所述调用模块调用所述cdisplay接口并将图像rendertexture渲染逻辑传入所述cdisplay接口中,实现opengles的视频渲染。

根据本发明的一些实施例,所述获取模块包括:编写模块,所述编写模块编写基于eagllayer系统类的渲染环境glkview,eagllayer系统类提供实现渲染图像功能的cdisplay接口。

根据本发明的一些实施例,使用objective-c++语言编写所述渲染环境glkview。

根据本发明的一些实施例,图像rendertexture渲染逻辑通过lambda函数或方法指针传入所述cdisplay接口。

第三方面,本发明实施例提供一种计算机存储介质,包括一条或多条计算机指令,所述一条或多条计算机指令在执行时实现如上述实施例所述的方法。

本发明的上述技术方案至少具有如下有益效果之一:

根据本发明实施例的跨平台调用opengles的渲染方法、跨平台调用opengles的渲染装置及计算机存储介质,通过将ios渲染接口抛出由外部调用,可以将视频缓冲及播放速率控制功能交由统一控件控制,而不需要在内部独立维护一套缓冲算法;由于glkview类仅提供基础的渲染窗口环境及按照opengl接口规范实现了渲染功能,同时glrendercontext类则提供了glkview渲染接口的由objective-c++语言转换为c++语言接口的功能,这两个类功能单一且标准,无需额外进行维护,同时完全与crender模块解耦,不影响crender模块功能实现并且模拟了egl接口协议中的直接渲染流程,使得crender可以不改变渲染处理逻辑,实现跨平台使用。

附图说明

图1为本发明实施例的跨平台调用opengles的渲染方法的流程图;

图2为本发明实施例的跨平台调用opengles的渲染装置的示意图;

图3为本发明实施例的电子设备的示意图。

附图标记:

跨平台调用opengles的渲染方法100;

跨平台调用opengles的渲染装置200;

获取模块210;调用模块220;

电子设备300;

存储器310;操作系统311;应用程序312;

处理器320;网络接口330;输入设备340;硬盘350;显示设备360。

具体实施方式

下面将结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。

下面首先结合附图具体描述根据本发明实施例的跨平台调用opengles的渲染方法100。

如图1所示,根据本发明实施例的跨平台调用opengles的渲染方法100包括:

创建glrendercontext来捕获展示窗口的上下文。

调用cdisplay接口并将图像rendertexture渲染逻辑传入cdisplay接口中,实现opengles的视频渲染。

换言之,根据本发明实施例的跨平台调用opengles的渲染方法100,在c++逻辑代码层,通过创建glrendercontext替代egl接口中的eglgetdisplay()及eglcreatecontext()函数来捕获展示窗口的上下文context,通过调用cdisplay()接口并将图像rendertexture渲染逻辑传入cdisplay()接口中,即可实现egl的eglswapbuffers()视频渲染功能。

由此,根据本发明实施例的跨平台调用opengles的渲染方法100,可以绕过苹果公司提供的eagl限制,让ios应用支持类似egl直接渲染的调用方式。

由于eagl接口限制,无法直接获取界面窗口上下文(context)。为此,根据本发明的一个实施例,所述创建glrendercontext来捕获展示窗口的上下文的方法包括:

编写基于eagllayer系统类的渲染环境glkview。

eagllayer系统类提供实现渲染图像功能的cdisplay接口,所述cdisplay接口提供一个block参数作为将绘制图像前数据处理的代码块传入接口。

将所述cdisplay接口暴露在头文件以由外部方法进行调用。

进一步地,图像rendertexture渲染逻辑通过lambda函数或方法指针传入所述cdisplay接口。

具体地,先使用objective-c++语言编写一个基于eagllayer系统类的渲染环境glkview,该类主要实现opengles的渲染上下文eaglcontext的创建,缓冲区绑定等环境设定的操作。同时该类提供一个通过调用eaglcontext的presentrenderbuffer方法实现渲染图像功能的display接口,该接口提供一个block参数作为将绘制图像前数据处理的代码块传入接口,最后将该接口暴露在头文件以实现由外部方法进行调用。

为保证代码间的解耦,及代码的跨平台作用,需要避免直接在图像数据处理模块代码中使用c++及objective-c++语言的直接混编,故而在glkview与c++逻辑代码层间,实现一个由c++与objective-c++语言混编的,将glkview的objective-c++接口转换为纯c++接口的glrendercontext类。该类实现了glkview的创建及初始化方法,同时提供一个支持lambda函数接口cdisplay(),该接口实现了glkview的display接口,同时将lambda匿名函数传入display接口的block中,至此,实现使用c++语言调用objective-c++方法,同时将c++函数代码块传入objective-c++方法体中并执行的功能。

其中需要说明的是,根据本发明实施例的跨平台调用opengles的渲染方法100中使用objective-c++及c++两种语言进行开发。objective-c++是苹果公司提供的用于开发ios软件应用的一门语言,它具有兼容c语言及c++语言的特性,它支持在同一份代码文件中编写并使用c及c++代码。

另外,根据本发明实施例的跨平台调用opengles的渲染方法100中使用c++11标准提供的lambda表达式及objctive-c++提供的block语法,这两种语法起到了向外提供内部代码块接口的作用。若无法使用c++11标准,可以使用方法指针传递的方式替代lambda表达式实现相同功能。

总而言之,根据本发明实施例的跨平台调用opengles的渲染方法100,通过将ios渲染接口抛出由外部调用,可以将视频缓冲及播放速率控制功能交由统一控件控制,而不需要在内部独立维护一套缓冲算法;由于glkview类仅提供基础的渲染窗口环境及按照opengl接口规范实现了渲染功能,同时glrendercontext类则提供了glkview渲染接口的由objective-c++语言转换为c++语言接口的功能,这两个类功能单一且标准,无需额外进行维护,同时完全与crender模块解耦,不影响crender模块功能实现并且模拟了egl接口协议中的直接渲染流程,使得crender可以不改变渲染处理逻辑,实现跨平台使用。

如图2所示,根据本发明实施例的跨平台调用opengles的渲染装置200包括:获取模块210和调用模块220。

具体地,所述获取模块210用于捕获展示窗口的上下文,所述获取模块210具有cdisplay接口,所述调用模块220调用所述cdisplay接口并将图像rendertexture渲染逻辑传入所述cdisplay接口中,实现opengles的视频渲染。

也就是说,根据本发明实施例的跨平台调用opengles的渲染装置200,在c++逻辑代码层,由获取模块210通过创建glrendercontext替代egl接口中的eglgetdisplay()及eglcreatecontext()函数来捕获展示窗口的上下文context,调用模块220通过调用cdisplay()接口并将图像rendertexture渲染逻辑传入cdisplay()接口中,即可实现egl的eglswapbuffers()视频渲染功能。

由此,根据本发明实施例的跨平台调用opengles的渲染装置200,可以绕过苹果公司提供的eagl限制,让ios应用支持类似egl直接渲染的调用方式。

根据本发明的一个实施例,所述获取模块210还包括:编写模块,所述编写模块编写基于eagllayer系统类的渲染环境glkview,eagllayer系统类提供实现渲染图像功能的cdisplay接口。优选地,使用objective-c++语言编写所述渲染环境glkview。进一步地,图像rendertexture渲染逻辑通过lambda函数或方法指针传入所述cdisplay接口。

换句话说,获取模块210还包括编写模块,编写模块编写基于eagllayer系统类的渲染环境glkview。同时,eagllayer系统类提供实现渲染图像功能的cdisplay接口,所述cdisplay接口提供一个block参数作为将绘制图像前数据处理的代码块传入接口,最后,将所述cdisplay接口暴露在头文件以由外部方法进行调用。

具体地,先使用objective-c++语言编写一个基于eagllayer系统类的渲染环境glkview,该类主要实现opengles的渲染上下文eaglcontext的创建,缓冲区绑定等环境设定的操作。同时该类提供一个通过调用eaglcontext的presentrenderbuffer方法实现渲染图像功能的display接口,该接口提供一个block参数作为将绘制图像前数据处理的代码块传入接口,最后将该接口暴露在头文件以实现由外部方法进行调用。

为保证代码间的解耦,及代码的跨平台作用,需要避免直接在图像数据处理模块代码中使用c++及objective-c++语言的直接混编,故而在glkview与c++逻辑代码层间,实现一个由c++与objective-c++语言混编的,将glkview的objective-c++接口转换为纯c++接口的glrendercontext类。该类实现了glkview的创建及初始化方法,同时提供一个支持lambda函数接口cdisplay(),该接口实现了glkview的display接口,同时将lambda匿名函数传入display接口的block中,至此,实现使用c++语言调用objective-c++方法,同时将c++函数代码块传入objective-c++方法体中并执行的功能。

其中需要说明的是,根据本发明实施例的跨平台调用opengles的渲染装置200中使用objective-c++及c++两种语言进行开发。objective-c++是苹果公司提供的用于开发ios软件应用的一门语言,它具有兼容c语言及c++语言的特性,它支持在同一份代码文件中编写并使用c及c++代码。

另外,根据本发明实施例的跨平台调用opengles的渲染装置200中使用c++11标准提供的lambda表达式及objctive-c++提供的block语法,这两种语法起到了向外提供内部代码块接口的作用。若无法使用c++11标准,可以使用方法指针传递的方式替代lambda表达式实现相同功能。

总而言之,根据本发明实施例的跨平台调用opengles的渲染装置200,通过将ios渲染接口抛出由外部调用,可以将视频缓冲及播放速率控制功能交由统一控件控制,而不需要在内部独立维护一套缓冲算法;由于glkview类仅提供基础的渲染窗口环境及按照opengl接口规范实现了渲染功能,同时glrendercontext类则提供了glkview渲染接口的由objective-c++语言转换为c++语言接口的功能,这两个类功能单一且标准,无需额外进行维护,同时完全与crender模块解耦,不影响crender模块功能实现并且模拟了egl接口协议中的直接渲染流程,使得crender可以不改变渲染处理逻辑,实现跨平台使用。

此外,本发明还提供一种计算机存储介质,所述计算机存储介质包括一条或多条计算机指令,所述一条或多条计算机指令在执行时实现上述任一所述的跨平台调用opengles的渲染方法100。

也就是说,所述计算机存储介质存储有计算机程序,所述计算机程序被处理器运行时,使得所述处理器执行上述任一所述的跨平台调用opengles的渲染方法100。

如图3所示,本发明实施例提供了一种电子设备300,包括存储器310和处理器320,所述存储器310用于存储一条或多条计算机指令,所述处理器320用于调用并执行所述一条或多条计算机指令,从而实现上述任一所述的方法。

也就是说,电子设备300包括:处理器320和存储器310,在所述存储器310中存储有计算机程序指令,其中,在所述计算机程序指令被所述处理器运行时,使得所述处理器320执行上述任一所述的方法100。

进一步地,如图3所示,电子设备300还包括网络接口330、输入设备340、硬盘350、和显示设备360。

上述各个接口和设备之间可以通过总线架构互连。总线架构可以是可以包括任意数量的互联的总线和桥。具体由处理器320代表的一个或者多个中央处理器(cpu),以及由存储器310代表的一个或者多个存储器的各种电路连接在一起。总线架构还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其它电路连接在一起。可以理解,总线架构用于实现这些组件之间的连接通信。总线架构除包括数据总线之外,还包括电源总线、控制总线和状态信号总线,这些都是本领域所公知的,因此本文不再对其进行详细描述。

所述网络接口330,可以连接至网络(如因特网、局域网等),从网络中获取相关数据,并可以保存在硬盘350中。

所述输入设备340,可以接收操作人员输入的各种指令,并发送给处理器320以供执行。所述输入设备340可以包括键盘或者点击设备(例如,鼠标,轨迹球(trackball)、触感板或者触摸屏等。

所述显示设备360,可以将处理器320执行指令获得的结果进行显示。

所述存储器310,用于存储操作系统运行所必须的程序和数据,以及处理器320计算过程中的中间结果等数据。

可以理解,本发明实施例中的存储器310可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(rom)、可编程只读存储器(prom)、可擦除可编程只读存储器(eprom)、电可擦除可编程只读存储器(eeprom)或闪存。易失性存储器可以是随机存取存储器(ram),其用作外部高速缓存。本文描述的装置和方法的存储器310旨在包括但不限于这些和任意其它适合类型的存储器。

在一些实施方式中,存储器310存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:操作系统311和应用程序312。

其中,操作系统311,包含各种系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务。应用程序312,包含各种应用程序,例如浏览器(browser)等,用于实现各种应用业务。实现本发明实施例方法的程序可以包含在应用程序312中。

本发明上述实施例揭示的方法可以应用于处理器320中,或者由处理器320实现。处理器320可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器320中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器320可以是通用处理器、数字信号处理器(dsp)、专用集成电路(asic)、现成可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器310,处理器320读取存储器310中的信息,结合其硬件完成上述方法的步骤。

可以理解的是,本文描述的这些实施例可以用硬件、软件、固件、中间件、微码或其组合来实现。对于硬件实现,处理单元可以实现在一个或多个专用集成电路(asic)、数字信号处理器dsp)、数字信号处理设备(dspd)、可编程逻辑设备(pld)、现场可编程门阵列(fpga)、通用处理器、控制器、微控制器、微处理器、用于执行本申请所述功能的其它电子单元或其组合中。

对于软件实现,可通过执行本文所述功能的模块(例如过程、函数等)来实现本文所述的技术。软件代码可存储在存储器中并通过处理器执行。存储器可以在处理器中或在处理器外部实现。

具体地,处理器320还用于读取所述计算机程序,执行上述任一所述的方法。

在本申请所提供的几个实施例中,应该理解到,所揭露方法和装置,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理包括,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述收发方法的部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-onlymemory,简称rom)、随机存取存储器(randomaccessmemory,简称ram)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1