CN108595284B - 一种纹理共享方法、计算机设备和存储介质 - Google Patents
一种纹理共享方法、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN108595284B CN108595284B CN201810458367.6A CN201810458367A CN108595284B CN 108595284 B CN108595284 B CN 108595284B CN 201810458367 A CN201810458367 A CN 201810458367A CN 108595284 B CN108595284 B CN 108595284B
- Authority
- CN
- China
- Prior art keywords
- texture
- shared
- opengl
- direct3d11
- creating
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/20—Processor architectures; Processor configuration, e.g. pipelining
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/543—Local
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Image Generation (AREA)
- Processing Or Creating Images (AREA)
Abstract
本发明提供了一种纹理共享方法、计算机设备和存储介质,该方法包括:创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;通过所述OpenGL ES绘制所述共享纹理中的图像信息。可以实现OpenGL ES与Direct3D11的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展,在用OpenGL绘制ID3D11Texture2D纹理时,必须先把ID3D11Texture2D纹理中,位于显存中的图像内容拷贝到系统内存中导致的系统开销大,效率低下的问题。
Description
技术领域
本发明属于计算机技术领域,尤其涉及一种纹理共享方法、计算机设备和存储介质。
背景技术
在Windows操作系统的图形渲染API(Application Programming Interface,应用程序编程接口)中,有OpenGL(Open Graphics Library,开放式图形库)与D3D(Direct3D)。其中OpenGL又分为桌面版本与移动嵌入式版本,其中桌面版本在Windows上称之为WGL(Windows OpenGL),而移动嵌入式版本的OpenGL ES(OpenGL for Embedded Systems,嵌入式系统OpenGL)是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。Direct3D根据其主版本的不同,又分为Direct3D9,Direct3D10,Direct3D11以及Direct3D12等。
在大多桌面版本的OpenGL中,不支持NV_DX_Interop这个扩展,在要用OpenGL绘制ID3D11Texture2D纹理时,就必须先把ID3D11Texture2D纹理中,位于显存中的图像内容拷贝到系统内存中,这将是一个非常大的开销,必然会极大的影响程序的运行效率。
发明内容
本申请实施例通过提供一种纹理共享方法、计算机设备和存储介质,解决了现有技术中,由于桌面版本的OpenGL不支持NV_DX_Interop扩展,在用OpenGL绘制ID3D11Texture2D纹理时,必须先把ID3D11Texture2D纹理中,位于显存中的图像内容拷贝到系统内存中导致的系统开销大,效率低的问题。
第一方面,本申请提供了一种纹理共享方法,其特征在于,所述方法包括:
创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;
通过所述OpenGL ES绘制所述共享纹理中的图像信息。
可选的,所述创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,包括:
创建OpenGL ES显示结构,所述显示结构基于Direct3D11实现;
创建OpenGL ES配置结构,并在所述配置结构中设置纹理的类型;
基于所述显示结构和配置结构创建所述纹理结构,并在所述纹理结构中设置纹理的尺寸信息;
通过调用eglQuerySurfacePointerANGLE扩展函数获取所述纹理结构的共享纹理句柄。
可选的,所述基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理包括:
调用打开共享资源函数OpenSharedResource创建Direct3D11资源接口,并在所述打开共享资源函数中写入所述共享纹理句柄;
调用所述资源接口的QueryInterface方法获取Direct3D11共享纹理。
可选的,在所述通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理之后,所述方法还包括:
将所述Direct3D11共享纹理写入到所述纹理结构;
判断是否已完成将所述Direct3D11共享纹理写入到所述纹理结构,若是,执行通过所述OpenGL ES绘制所述共享纹理中的图像信息。
第二方面,本申请还提供了一种纹理共享装置,其特征在于,所述装置包括:
第一初始化单元,用于创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
第二初始化单元,用于基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
获取单元,用于通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理。
绘制单元,用于通过所述OpenGL ES绘制所述共享纹理中的图像信息。
可选的,所述第一初始化单元具体用于:
创建OpenGL ES显示结构,所述显示结构基于Direct3D11实现;
创建OpenGL ES配置结构,并在所述配置结构中设置纹理的类型;
基于所述显示结构和配置结构创建所述纹理结构,并在所述纹理结构中设置纹理的尺寸信息;
通过调用eglQuerySurfacePointerANGLE扩展函数获取所述纹理结构的共享纹理句柄。
可选的,所述第二初始化单元具体用于:
调用打开共享资源函数OpenSharedResource创建Direct3D11资源接口,并在所述打开共享资源函数中写入所述共享纹理句柄;
调用所述资源接口的QueryInterface方法获取Direct3D11共享纹理。
可选的,所述装置还包括:
写入单元,用于将所述Direct3D11共享纹理写入到所述纹理结构;
显存同步单元,判断是否已完成将所述Direct3D11共享纹理写入到所述纹理结构,若是,执行所述绘制单元的步骤。
第三方面,本申请还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;
通过所述OpenGL ES绘制所述共享纹理中的图像信息。
第四方面,本申请还提供了一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;
通过所述OpenGL ES绘制所述共享纹理中的图像信息。
可见,本申请通过创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;通过所述OpenGL ES绘制所述共享纹理中的图像信息。可以实现OpenGL ES与Direct3D11的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展,在用OpenGL绘制ID3D11Texture2D纹理时,必须先把ID3D11Texture2D纹理中,位于显存中的图像内容拷贝到系统内存中导致的系统开销大,效率低下的问题。
附图说明
图1为本申请实施例中提供的纹理共享方法的流程图;
图2为本申请实施例中提供的纹理共享装置的结构示意图;
图3为本申请实施例中提供的计算机可读存储介质的结构示意图;
图4为本申请实施例中提供的计算机设备的结构示意图。
具体实施方式
本申请实施例提供了一种纹理共享方法、计算机设备和存储介质,可以实现OpenGL ES与Direct3D11的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展,在用OpenGL绘制ID3D11Texture2D纹理时,必须先把ID3D11Texture2D纹理中,位于显存中的图像内容拷贝到系统内存中导致的系统开销大,效率低下的问题。
在Windows操作系统的图形渲染API中,有OpenGL与D3D,OpenGL又分为桌面版本与移动嵌入式版本,其中桌面版本在Windows上称之为WGL,而移动嵌入式版本OpenGL ES是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。Direct3DDirect 3D是基于微软的通用对象模式COM(Common Object Mode)的3D图形API。它是由微软(Microsoft)一手树立的3D API规范,微软公司拥有该库版权,它所有的语法定义包含在微软提供的程序开发组件的帮助文件、源代码中。Direct3D是微软公司DirectXSDK集成开发包中的重要部分,适合多媒体、娱乐、即时3D动画等广泛和实用的3D图形计算。根据其主版本的不同,又分为Direct3D9,Direct3D10,Direct3D11以及Direct3D12等。EGL是图形渲染API,是OpenGL ES和底层Native平台视窗系统之间的接口,保证了OpenGL ES的平台独立性。EGL提供了若干功能:创建rendering surface、创建graphics context、同步应用程序和本地平台渲染API、提供对显示设备的访问、提供对渲染配置的管理等。在基于OpenGL ES下,提出了ANGLE(Almost Native Graphic Layer Engine,几乎本地图形层引擎)的概念,也就是利用本地Direct3D的接口,来实现OpenGL的接口函数。那么基于ANGLE的EGL实现,虽然在使用的时候调用的是OpenGL的标准接口,但是其内部实现却是Direct3D。那么基于这一特性,本实施例可以实现EGL与Direct3D9的纹理互操作在不支持WGL_NV_Interop扩展的WGL中进行。可以理解的是,本申请实施例使用的函数名称或变量名称等,并不用于限定本申请,在一些其他可能的实现方式中,也可以使用其他命名方式。
本申请实施例的技术方案为解决上述技术问题,总体思路如下:
创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;禾白
通过所述OpenGL ES绘制所述共享纹理中的图像信息。
可见,本申请通过创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;通过所述OpenGL ES绘制所述共享纹理中的图像信息。可以实现OpenGL ES与Direct3D11的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展,在用OpenGL绘制ID3D11Texture2D纹理时,必须先把ID3D11Texture2D纹理中,位于显存中的图像内容拷贝到系统内存中导致的系统开销大,效率低下的问题。
为了更好的理解上述技术方案,以下结合附图以及具体实施例,对上述技术方案进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本申请,并不用于限定本申请。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
实施例一:
请参阅图1,本实施例提供的一种纹理共享方法包括以下步骤:
S101、创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
本实施例中,使用OpenGL的移动嵌入式版本OpenGL ES进行图像绘制,而EGL是OpenGL ES和底层Native平台视窗系统之间的接口。在EGL的使用中,必须先初始化EGL。具体的,初始化EGL的步骤包括:
(1)创建OpenGL ES显示结构EGLDisplay;
EGLDisplay是一个关联系统物理屏幕的通用数据类型。对于PC来说,Display就是显示器的句柄。不管是嵌入式系统或PC,都可能有多个物理显示设备。为了使用系统的显示设备,EGL提供了EGLDisplay数据类型,以及一组操作设备显示的API。因为本实施例需要与Direct3D11进行互操作,所以创建的EGLDisplay必须是基于Direct3D11实现的。具体的创建步骤如下:
a.获取eglGetPlatformDisplayEXT扩展,通过调用EGL的eglGetProcAddress函数,将eglGetPlatformDisplayEXT字符串传入到该函数中,从而获取到eglGetPlatformDisplayEXT函数的地址;
b.调用eglGetPlatformDisplayEXT函数创建EGLDisplay结构,具体为根据获取到的eglGetPlatformDisplayEXT函数地址,调用该函数创建EGLDisplay结构。其中,在调用该函数时,将EGL_PLATFORM_ANGLE_ANGLE传入到该函数的第一个参数中,EGL_PLATFORM_ANGLE_ANGLE为该EGL的硬件平台,将EGL_DEFAULT_DISPLAY传入到该函数的第二个参数中,EGL_DEFAULT_DISPLAY为默认的显示器,将该函数的第三个参数中设置为一个以EGL_NONE结尾的整型数组,并且在该数组中包含以EGL_PLATFORM_ANGLE_TYPE_ANGLE为键,以EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE为值的键值对。如果该函数调用成功,那么将返回一个EGLDisplay显示结构。
(2)创建OpenGL ES配置结构EGLConfig;
EGLConfig是一个用来描述EGL surface配置信息的数据类型。要获取正确的渲染结果,Surface的格式是非常重要的。
基于上述步骤创建的EGLDisplay显示结构,可以创建一个EGLConfig配置结构,具体的,可以通过调用eglChooseConfig函数创建EGLConfig配置结构。由于在EGL中存在三种不同类型的EGLSurface,一是Window Surface,即前台纹理,跟具体的物理显示设备绑定,例如Windows系统上的窗口句柄;二是PBuffer Surface,即位于显存中的后台纹理;三是Pixmap Surface,即位于系统内存中的位图纹理,本实施例中所需要的纹理,是位于显存中的后台纹理,所以在调用eglChooseConfig创建EGLConfig时,必须同样提供一个以EGL_NONE结束的整型数组,并且该数组中必须包含以EGL_SURFACE_TYPE为键,以EGL_PBUFFER_BIT为值的键值对。调用完成之后,如果该函数调用成功,将获取到一个类型为EGLConfig配置结构。
(3)创建OpenGL ES纹理结构EGLSurface;
Surface实际上就是一个FrameBuffer(帧缓冲),获取到EGLConfig配置结构之后,可以调用eglCreatePbufferSurface接口来创建一个EGLSurface后台纹理。其中在调用eglCreatePbufferSurface接口时,将所述EGLDisplay显示结构传入到该函数的第一个参数中,将所述EGLConfig配置结构传入到该函数的第二个参数中,并且在该函数的第三个参数中,同样提供一个以EGL_NONE结尾的整型数组,该数组中必须包含以EGL_WIDTH纹理宽度为键,具体纹理宽度值为值;以EGL_HEIGHT纹理高度为键,具体纹理高度为值;以EGL_TEXTURE_FORMAT为键,以EGL_TEXTURE_RGB为值;以EGL_TEXTURE_TARGET为键,以EGL_TEXTURE_2D为值的键值对信息。该函数调用成功之后,将获取到EGLSurface纹理结构。
(4)获取纹理结构EGLSurface的共享纹理句柄。
句柄是整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows大量使用了句柄来标识对象。具体的,获取所述EGLSurface纹理结构的共享纹理句柄,具体的步骤如下:
a.获取eglQuerySurfacePointerANGLE扩展函数;
具体的,通过调用eglGetProcAddress,将eglQuerySurfacePointerANGLE字符串传入到该函数中,获取到eglQuerySurfacePointerANGLE扩展函数的地址。
b.调用eglQuerySurfacePointerANGLE获取共享纹理句柄。
根据获取到的eglQuerySurfacePointerANGLE扩展函数地址,调用该函数,并将创建的EGLDisplay传入到该函数第一个参数中,将创建的EGLSurface传入到第二个参数中,将EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE传入到第三个参数中,将第四个参数设置为用于接收纹理句柄值。该函数调用成功之后,将获取到所述EGLSurface纹理结构的共享纹理句柄。
(5)初始化WindowSurface;
因为在OpenGL ES中,要最终显示图像,所以必须创建显示设备,在EGL中对应的就是要创建Window Surface(窗口表面),在Windows操作系统中,就是根据指定窗口的窗口句柄,创建EGL的Window Surface。具体的,可以调用eglCreateWindowSurface函数,分别将EGLDisplay显示结构,EGLConfig配置结构,窗口句柄传入到该函数的参数中,从而返回一个EGLSurface类型的WindowsSurface。
(6)初始化EGLContext;
在OpenGL中,有一个设备上下文的概念,要在某个线程中调用OpenGLAPI进行绘制,那么该线程中必须绑定一个OpenGL的上下文。在EGL中,EGLContext结构用来表示一个EGL上下文。具体的,初始化EGLContext的步骤包括:
a.创建EGLContext上下文,具体的,通过调用eglCreateContext函数,将EGLDisplay显示结构,EGLConfig配置结构,EGL_NO_CONTEXT以及一个以EGL_NONE结尾的整型数组传入到该函数的参数中,并且该数组中必须包含以EGL_CONTEXT_CLIENT_VERSION为键,以数字为值的键值对,其中数字可以取1、2或3中的任何一个,表示EGL的版本。如果该函数调用成功,则返回一个EGLContext的上下文环境结构。
b.绑定EGLContext,具体的,创建EGLContext之后,还需要调用eglMakeCurrent函数,将该EGLContext与之前创建的WindowSurface绑定到当前线程中。从而完成EGLContext上下文的绑定。
S102、基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理;
使用Direct3D11之前,必须先初始化Direct3D11,具体的过程如下:
(1)创建设备接口ID3D11Device;
要初始化Direct3D11,首先需要创建ID3D11Device设备接口和ID3D11DeviceContext(Direct3D 11设备上下文)。它们是最重要的Direct3D接口,可以被看成是物理图形设备硬件的软控制器;也就是说,我们可以通过该接口与硬件进行交互,命令硬件完成一些工作,比如:在显存中分配资源、清空后台缓冲区、将资源绑定到各种管线阶段、绘制几何体等。具体而言,ID3D11Device接口用于检测显示适配器功能和分配资源,ID3D11DeviceContext接口用于设置管线状态、将资源绑定到图形管线和生成渲染命令。
具体的,通过调用操作系统的D3D11CreateDeviceAndSwapchain创建一个类型为ID3D11Device的设备接口,以及一个类型为ID3D11DeviceContext的设备上下文环境接口。
(2)创建资源接口ID3D11Resouce;
具体的,通过调用创建的ID3D11Device接口的OpenSharedResource方法,将所述EGLSurface纹理结构的共享纹理句柄设置为所述OpenSharedResource方法的第一个参数,将IID_ID3D11Resource值设置为所述OpenSharedResource方法的第二个参数,所述OpenSharedResource方法的第三个参数设置用来接收类型为ID3D11Resource的接口。这样便可以根据EGLSurface结构的共享纹理句柄,在Direct3D11中将该共享纹理句柄所代表的资源打开。
(3)获取Direct3D11共享纹理ID3D11Texture2D。
具体的,根据获取到的ID3D11Resource接口,调用该接口的QueryInterface方法,将IID_ID3D11Texture2D值设置为所述QueryInterface方法的第一个参数,所述QueryInterface方法的第二个参数设置用来接收ID3D11Texture2D的接口值。从而获取到Direct3D11共享纹理ID3D11Texture2D。
S103、通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;
通过资源接口ID3D11Resouce可以获取ID3D11Texture2D,而共享纹理句柄为资源接口ID3D11Resouce的参数,所以通过所述OpenGL ES根据所述共享纹理句柄可以获取到所述Direct3D11共享纹理。
由于对EGLSurface纹理结构和共享纹理ID3D11Texture2D之间的读写访问是异步的,在所述通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理之后,通过所述OpenGL ES绘制所述共享纹理中的图像信息之前,需要等待ID3D11Texture2D共享纹理的写完成操作,所以进一步的,本实施例还可以包括显存同步的步骤,即判断是否已完成将所述Direct3D11共享纹理写入到所述纹理结构,以解决EGLSurface纹理结构和共享纹理ID3D11Texture2D之间的读写访问异步可能造成的画面闪烁。具体的,在Direct3D11中,为了检测某一个GPU异步操作是否完成,可以发起一个query事件请求,如果这个时间请求被响应,并执行完成,那么它前面的GPU异步操作就肯定完成了,具体的,本实施例中显存同步的步骤如下:
(1)创建ID3D11Query,具体的,调用ID3D11Device接口的CreateQuery方法,创建一个类型为D3D11_QUERY_EVENT的ID3D11Query接口。
(2)发起query查询请求,具体的,调用之前创建的ID3D11DeviceContext的End方法,将创建的ID3D11Query接口设置到该方法的第一个参数中,从而发起查询请求事件。
(3)检测查询请求是否完成
发起查询请求后,调用ID3D11DeviceContext接口的GetData方法,并判断该方法的返回值是否等于S_OK,若是,代表查询请求事件执行完成,即已完成将所述Direct3D11共享纹理写入到所述纹理结构,则执行通过所述OpenGLES绘制所述共享纹理中的图像信息,若否,则继续调用GetData方法,直到返回值等于S_OK为止。
S104、通过所述OpenGL ES绘制所述共享纹理中的图像信息。
进一步的,若所述ID3D11Texture2D纹理的写操作已完成,则通过所述OpenGL ES绘制所述共享纹理中的图像信息,具体步骤如下:
(1)将EGLSurface纹理结构设置为后台缓冲纹理,具体的,通过调用eglBindTexImage将图像信息提交到后台缓冲区中准备显示,调用该函数时,分别将EGLDisplay结构,EGLSurface,以及EGL_BACK_BUFFER分别提供给该函数的三个参数。
(2)将EGLSurface纹理结构提交到前台表面,具体的,调用eglSwapBuffers函数,将后台缓冲区中的图像信息提交到创建的WindowsSurface上,从而最终完成图像的绘制。
可见,本实施例中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;通过所述OpenGLES根据所述共享纹理句柄获取所述Direct3D11共享纹理;通过所述OpenGL ES绘制所述共享纹理中的图像信息。可以实现OpenGL ES与Direct3D11的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展,在用OpenGL绘制ID3D11Texture2D纹理时,必须先把ID3D11Texture2D纹理中,位于显存中的图像内容拷贝到系统内存中导致的系统开销大,效率低下的问题。
基于同一发明构思,本申请提供了一种纹理共享装置,详见图2,下面将结合图2对实施例二进行介绍。
实施例二:
请参阅图2,本实施例提供的纹理共享装置包括:
第一初始化单元201,用于创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
第二初始化单元202,用于基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
获取单元203,用于通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理。
绘制单元204,用于通过所述OpenGL ES绘制所述共享纹理中的图像信息。
可见,本实施例中,第一初始化单元201创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;第二初始化单元202基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;获取单元203通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;绘制单元204通过所述OpenGL ES绘制所述共享纹理中的图像信息。可以实现OpenGL ES与Direct3D11的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展,在用OpenGL绘制ID3D11Texture2D纹理时,必须先把ID3D11Texture2D纹理中,位于显存中的图像内容拷贝到系统内存中导致的系统开销大,效率低下的问题。
本申请实施例二提供的纹理共享装置及本申请实施例一提供的纹理共享方法属于同一构思,其具体实现过程详见说明书全文,此处不再赘述。
基于同一发明构思,本申请提供了一种计算机可读存储介质,详见图3,下面将结合图3对实施例三进行介绍。
实施例三:
本实施例提供了一种计算机可读存储介质300,所述计算机可读存储介质300存储有计算机程序311,所述计算机程序311被处理器执行时实现以下步骤:
创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;
通过所述OpenGL ES绘制所述共享纹理中的图像信息。
在具体实施过程中,该计算机程序311被处理器执行时,可以实现实施例一中任一实施方式。
基于同一发明构思,本申请还提供了一种计算机设备,详见图4,下面将结合图4对实施例四进行介绍。
实施例四:
本申请提供了一种计算机设备400,包括处理器420、存储器410以及存储在存储器410上并可在处理器420上运行的计算机程序411,所述处理器420执行所述计算机程序411时实现以下步骤:
创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;
通过所述OpenGL ES绘制所述共享纹理中的图像信息。
由于本实施例所介绍的计算机设备400为实施本申请实施例一中纹理共享方法所采用的设备,故而基于本申请实施例一中所介绍的方法,本领域所属技术人员能够了解本实施例的计算机设备400的具体实施方式以及其各种变化形式,所以在此对于该计算机设备400如何实现本申请实施例中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (6)
1.一种纹理共享方法,其特征在于,所述方法包括:
创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;
通过所述OpenGL ES绘制所述共享纹理中的图像信息;
其中,所述基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理包括:
调用打开共享资源函数OpenSharedResource创建Direct3D11资源接口,并在所述打开共享资源函数中写入所述共享纹理句柄;
调用所述资源接口的QueryInterface方法获取Direct3D11共享纹理;
其中,所述创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,包括:
创建OpenGL ES显示结构,所述显示结构基于Direct3D11实现;
创建OpenGL ES配置结构,并在所述配置结构中设置纹理的类型;
基于所述显示结构和配置结构创建所述纹理结构,并在所述纹理结构中设置纹理的尺寸信息;
通过调用eglQuerySurfacePointerANGLE扩展函数获取所述纹理结构的共享纹理句柄;
其中,创建OpenGL ES显示结构的创建步骤包括:
获取eglGetPlatformDisplayEXT扩展,通过调用EGL的eglGetProcAddress函数,将eglGetPlatformDisplayEXT字符串传入到该函数中,从而获取到eglGetPlatformDisplayEXT函数的地址;
根据获取到的eglGetPlatformDisplayEXT函数地址,调用该函数创建EGLDisplay结构。
2.如权利要求1所述的方法,其特征在于,在所述通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理之后,所述方法还包括:
将所述Direct3D11共享纹理写入到所述纹理结构;
判断是否已完成将所述Direct3D11共享纹理写入到所述纹理结构,若是,执行通过所述OpenGL ES绘制所述共享纹理中的图像信息。
3.一种纹理共享装置,其特征在于,所述装置包括:
第一初始化单元,用于创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
第二初始化单元,用于基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
获取单元,用于通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;
绘制单元,用于通过所述OpenGL ES绘制所述共享纹理中的图像信息;
其中,所述第二初始化单元具体用于:
调用打开共享资源函数OpenSharedResource创建Direct3D11资源接口,并在所述打开共享资源函数中写入所述共享纹理句柄;
调用所述资源接口的QueryInterface方法获取Direct3D11共享纹理;
其中,所述第一初始化单元具体用于:
创建OpenGL ES显示结构,所述显示结构基于Direct3D11实现;
创建OpenGL ES配置结构,并在所述配置结构中设置纹理的类型;
基于所述显示结构和配置结构创建所述纹理结构,并在所述纹理结构中设置纹理的尺寸信息;
通过调用eglQuerySurfacePointerANGLE扩展函数获取所述纹理结构的共享纹理句柄;
其中,创建OpenGL ES显示结构的创建步骤包括:
获取eglGetPlatformDisplayEXT扩展,通过调用EGL的eglGetProcAddress函数,将eglGetPlatformDisplayEXT字符串传入到该函数中,从而获取到eglGetPlatformDisplayEXT函数的地址;
根据获取到的eglGetPlatformDisplayEXT函数地址,调用该函数创建EGLDisplay结构。
4.如权利要求3所述的装置,其特征在于,所述装置还包括:
写入单元,用于将所述Direct3D11共享纹理写入到所述纹理结构;
显存同步单元,判断是否已完成将所述Direct3D11共享纹理写入到所述纹理结构,若是,执行所述绘制单元的步骤。
5.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;
通过所述OpenGL ES绘制所述共享纹理中的图像信息;
其中,所述基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理包括:
调用打开共享资源函数OpenSharedResource创建Direct3D11资源接口,并在所述打开共享资源函数中写入所述共享纹理句柄;
调用所述资源接口的QueryInterface方法获取Direct3D11共享纹理;
其中,所述创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,包括:
创建OpenGL ES显示结构,所述显示结构基于Direct3D11实现;
创建OpenGL ES配置结构,并在所述配置结构中设置纹理的类型;
基于所述显示结构和配置结构创建所述纹理结构,并在所述纹理结构中设置纹理的尺寸信息;
通过调用eglQuerySurfacePointerANGLE扩展函数获取所述纹理结构的共享纹理句柄;
其中,创建OpenGL ES显示结构的创建步骤包括:
获取eglGetPlatformDisplayEXT扩展,通过调用EGL的eglGetProcAddress函数,将eglGetPlatformDisplayEXT字符串传入到该函数中,从而获取到eglGetPlatformDisplayEXT函数的地址;
根据获取到的eglGetPlatformDisplayEXT函数地址,调用该函数创建EGLDisplay结构。
6.一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄;
基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理,所述共享纹理包括图像信息;
通过所述OpenGL ES根据所述共享纹理句柄获取所述Direct3D11共享纹理;
通过所述OpenGL ES绘制所述共享纹理中的图像信息;
其中,所述基于所述共享纹理句柄创建Direct3D11资源接口,并基于所述资源接口获取Direct3D11共享纹理包括:
调用打开共享资源函数OpenSharedResource创建Direct3D11资源接口,并在所述打开共享资源函数中写入所述共享纹理句柄;
调用所述资源接口的QueryInterface方法获取Direct3D11共享纹理;
其中,所述创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,包括:
创建OpenGL ES显示结构,所述显示结构基于Direct3D11实现;
创建OpenGL ES配置结构,并在所述配置结构中设置纹理的类型;
基于所述显示结构和配置结构创建所述纹理结构,并在所述纹理结构中设置纹理的尺寸信息;
通过调用eglQuerySurfacePointerANGLE扩展函数获取所述纹理结构的共享纹理句柄;
其中,创建OpenGL ES显示结构的创建步骤包括:
获取eglGetPlatformDisplayEXT扩展,通过调用EGL的eglGetProcAddress函数,将eglGetPlatformDisplayEXT字符串传入到该函数中,从而获取到eglGetPlatformDisplayEXT函数的地址;
根据获取到的eglGetPlatformDisplayEXT函数地址,调用该函数创建EGLDisplay结构。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810458367.6A CN108595284B (zh) | 2018-05-14 | 2018-05-14 | 一种纹理共享方法、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810458367.6A CN108595284B (zh) | 2018-05-14 | 2018-05-14 | 一种纹理共享方法、计算机设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108595284A CN108595284A (zh) | 2018-09-28 |
CN108595284B true CN108595284B (zh) | 2021-11-26 |
Family
ID=63637438
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810458367.6A Active CN108595284B (zh) | 2018-05-14 | 2018-05-14 | 一种纹理共享方法、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108595284B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110321193B (zh) * | 2019-05-05 | 2022-03-18 | 四川盛趣时代网络科技有限公司 | 一种基于Direct3D共享纹理的交互方法及系统 |
CN110751592A (zh) * | 2019-08-21 | 2020-02-04 | 北京达佳互联信息技术有限公司 | 图形资源转换方法、装置、电子设备及存储介质 |
CN116055540B (zh) * | 2023-01-13 | 2023-12-19 | 北京曼恒数字技术有限公司 | 虚拟内容的显示系统、方法、设备及计算机可读介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102169596A (zh) * | 2011-03-09 | 2011-08-31 | 深圳市酷开网络科技有限公司 | 一种在嵌入式设备上实现3d渲染的方法及装置 |
CN105302580A (zh) * | 2015-11-28 | 2016-02-03 | 武汉斗鱼网络科技有限公司 | 一种通过gpu纹理共享实现快速获取游戏图像的方法和系统 |
WO2016206087A1 (zh) * | 2015-06-26 | 2016-12-29 | 北京大学深圳研究生院 | 一种低照度图像处理方法和装置 |
CN106327563A (zh) * | 2016-08-24 | 2017-01-11 | 武汉斗鱼网络科技有限公司 | 一种Directx纹理资源互操作系统及方法 |
CN106528303A (zh) * | 2016-10-20 | 2017-03-22 | 武汉斗鱼网络科技有限公司 | 一种基于gpu纹理共享来获取d3d12游戏源图像的方法及系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107943548A (zh) * | 2017-11-09 | 2018-04-20 | 西安电子工程研究所 | vxWorks下利用tilcon&openGL ES实现雷达终端显控方法 |
-
2018
- 2018-05-14 CN CN201810458367.6A patent/CN108595284B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102169596A (zh) * | 2011-03-09 | 2011-08-31 | 深圳市酷开网络科技有限公司 | 一种在嵌入式设备上实现3d渲染的方法及装置 |
WO2016206087A1 (zh) * | 2015-06-26 | 2016-12-29 | 北京大学深圳研究生院 | 一种低照度图像处理方法和装置 |
CN105302580A (zh) * | 2015-11-28 | 2016-02-03 | 武汉斗鱼网络科技有限公司 | 一种通过gpu纹理共享实现快速获取游戏图像的方法和系统 |
CN106327563A (zh) * | 2016-08-24 | 2017-01-11 | 武汉斗鱼网络科技有限公司 | 一种Directx纹理资源互操作系统及方法 |
CN106528303A (zh) * | 2016-10-20 | 2017-03-22 | 武汉斗鱼网络科技有限公司 | 一种基于gpu纹理共享来获取d3d12游戏源图像的方法及系统 |
Non-Patent Citations (2)
Title |
---|
opengl es学习笔记3(EGL使用流程,EGL命令);沉沦风帆;《https://blog.csdn.net/u014605728/article/details/49126193》;20151014;第1-11页 * |
在DirectX 11中渲染共享纹理仅显示黑色;Thinbug;《https://www.thinbug.com/q/21245652》;20140120;第1-2页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108595284A (zh) | 2018-09-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10074206B1 (en) | Network-optimized graphics library for virtualized graphics processing | |
EP2622463B1 (en) | Instant remote rendering | |
US9715750B2 (en) | System and method for layering using tile-based renderers | |
US20140143305A1 (en) | Apparatus and system for providing software service using software virtualization and method thereof | |
CN108595284B (zh) | 一种纹理共享方法、计算机设备和存储介质 | |
CN102239483B (zh) | 命令遥控 | |
CN108733356B (zh) | 一种纹理共享方法、计算机设备和存储介质 | |
CN111488196A (zh) | 渲染方法及装置、存储介质、处理器 | |
JP2013542515A (ja) | 異環境間リダイレクション | |
US10268336B2 (en) | User interface displaying and processing method and user interface displaying and processing device | |
JP5805864B2 (ja) | グラフィックスレンダリングエンジンおよびその実施方法 | |
WO2012044829A2 (en) | User interaction across cross-environment applications through an extended graphics context | |
CN112614202A (zh) | Gui渲染显示的方法、终端、服务器、电子设备及存储介质 | |
CN102915232A (zh) | 一种3d控件的交互方法及通信终端 | |
WO2016053916A1 (en) | Low latency ink rendering pipeline | |
CN112799801A (zh) | 一种模拟鼠标指针绘制方法、装置、设备和介质 | |
US8203567B2 (en) | Graphics processing method and apparatus implementing window system | |
JP2021522721A (ja) | 画面キャプチャ方法、端末および記憶媒体 | |
CN110489083B (zh) | 一种纹理共享的方法、计算机设备和存储介质 | |
CN112416605B (zh) | 一种基于互联网的分布式显卡调用方法及装置 | |
CN111243069B (zh) | 一种Unity3D引擎的场景切换方法和系统 | |
CN117234655B (zh) | 基于安卓系统运行Linux桌面程序的方法、装置、设备及介质 | |
WO2024037166A1 (zh) | 界面处理方法和装置、存储介质及电子设备 | |
CN101599182B (zh) | 三维物件旋转方法和与其对应的计算机系统 | |
Chen et al. | MSA: A Novel App Development Framework for Transparent Multi-Screen Support on Android Apps |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |