CN115167949A - 高版本OpenGL函数适配低版本应用程序的方法、装置及介质 - Google Patents
高版本OpenGL函数适配低版本应用程序的方法、装置及介质 Download PDFInfo
- Publication number
- CN115167949A CN115167949A CN202211095506.6A CN202211095506A CN115167949A CN 115167949 A CN115167949 A CN 115167949A CN 202211095506 A CN202211095506 A CN 202211095506A CN 115167949 A CN115167949 A CN 115167949A
- Authority
- CN
- China
- Prior art keywords
- version
- function
- opengl
- opengl function
- low
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 65
- 230000008569 process Effects 0.000 claims abstract description 35
- 230000006870 function Effects 0.000 claims description 384
- 230000015654 memory Effects 0.000 claims description 38
- 238000004088 simulation Methods 0.000 claims description 22
- 239000012634 fragment Substances 0.000 claims description 12
- 230000036316 preload Effects 0.000 claims description 9
- 238000004806 packaging method and process Methods 0.000 claims description 8
- 238000012216 screening Methods 0.000 claims description 8
- 238000004891 communication Methods 0.000 claims description 6
- 238000004590 computer program Methods 0.000 claims description 5
- 238000009877 rendering Methods 0.000 description 33
- 238000011161 development Methods 0.000 description 11
- 239000011159 matrix material Substances 0.000 description 11
- 238000012545 processing Methods 0.000 description 10
- 238000010586 diagram Methods 0.000 description 8
- 239000000463 material Substances 0.000 description 6
- 230000003213 activating effect Effects 0.000 description 4
- 230000000694 effects Effects 0.000 description 4
- 239000011800 void material Substances 0.000 description 4
- 238000013459 approach Methods 0.000 description 2
- 230000006399 behavior Effects 0.000 description 2
- 238000004422 calculation algorithm Methods 0.000 description 2
- 238000005286 illumination Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000006467 substitution reaction Methods 0.000 description 2
- 230000009466 transformation Effects 0.000 description 2
- 101100495270 Caenorhabditis elegans cdc-26 gene Proteins 0.000 description 1
- 241000699670 Mus sp. Species 0.000 description 1
- 230000006978 adaptation Effects 0.000 description 1
- 230000015572 biosynthetic process Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 238000001914 filtration Methods 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000002156 mixing Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000003786 synthesis reaction Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 238000012800 visualization Methods 0.000 description 1
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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44536—Selecting among different versions
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例公开了一种高版本OpenGL函数适配低版本应用程序的方法、装置及介质,该方法可以包括:在应用程序启动前预加载动态库文件;其中,所述动态库文件包括由高版本OpenGL函数模拟所得到的在高版本OpenGL函数中已被摒弃的低版本OpenGL函数;在所述应用程序运行过程中,相应于被执行的OpenGL函数在高版本OpenGL函数库中不存在,则调用所述动态库文件中所模拟的且与所述被执行的OpenGL函数同名的低版本OpenGL函数;相应于所述被执行的OpenGL函数在所述高版本OpenGL函数库中存在,则直接调用高版本OpenGL函数库中与所述被执行的OpenGL函数同名的OpenGL函数。
Description
技术领域
本发明实施例涉及计算机图形编程技术领域,尤其涉及一种高版本OpenGL函数适配低版本应用程序的方法、装置及介质。
背景技术
开放图形库或者开放式图形库(Open Graphics Library,OpenGL)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(Application ProgrammingInterface,API)。所述应用程序编程接口由近350个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维图像,OpenGL常用于CAD、虚拟实境、科学可视化程序和电子游戏开发,作为独立于操作***的开放的三维图形的软件开发包,在其基础上开发的应用程序能够简单方便的移植于各种平台。
随着OpenGL版本的升级,当前图形开发中使用的OpenGL版本越来越高,从最初的1.0已经演进到最新的4.6版本。开发方式也从最初的纯C/C++编程转变为C/C++混合着色器Shader编程。在OpenGL 3.3版本后,OpenGL图形管线已由固定管线转变为可编程管线。固定管线编程方式相对比较简单,可编程管线编程复杂很多,但是后者可以实现前者实现不了的一些渲染效果,而且在性能上相对前者也有一定提升。但是目前基于OpenGL开发的应用程序规模相当庞大,小部分使用的是OpenGL 3.3以后的高版本开发的,大部分使用的还是OpenGL 3.3之前版本开发的,因此对于在OpenGL 3.3之前版本开发的应用程序,无法在仅支持OpenGL 3.3及之后的环境上运行。如果在使用OpenGL 3.3之后版本的接口上重写目标应用程序,需要修改大量的低版本OpenGL应用程序源码,并且若有很多低版本OpenGL应用程序源码,但是修改方式又不能通用的情况下,不能批量处理,则需要对低版本OpenGL应用程序源码一一单独处理,费时费力并且适配效率低下。
发明内容
有鉴于此,本发明实施例期望提供一种高版本OpenGL函数适配低版本应用程序的方法,通过使用高版本OpenGL函数模拟OpenGL 3.3之前被摒弃的低版本OpenGL函数的方式,能够支持所有基于低版本OpenGL开发的应用程序可以在高版本OpenGL平台运行,并且不需要在高版本OpenGL中重写接口以及修改大量的低版本OpenGL应用程序源码,从而节省开发时间,提高开发效率。
本发明实施例的技术方案是这样实现的:
第一方面,本发明实施例提供了一种高版本OpenGL函数适配低版本应用程序的方法,包括:
在应用程序启动前预加载动态库文件;其中,所述动态库文件包括由高版本OpenGL函数模拟所得到的在高版本OpenGL函数中已被摒弃的低版本OpenGL函数;
在所述应用程序运行过程中,相应于被执行的OpenGL函数在高版本OpenGL函数库中不存在,则调用所述动态库文件中所模拟的且与所述被执行的OpenGL函数同名的低版本OpenGL函数;
相应于所述被执行的OpenGL函数在所述高版本OpenGL函数库中存在,则直接调用高版本OpenGL函数库中与所述被执行的OpenGL函数同名的OpenGL函数。
第二方面,本发明实施例提供了一种高版本OpenGL函数适配低版本应用程序的装置,所述装置包括:预加载部分、第一调用部分和第二调用部分;其中,
所述预加载部分,经配置为在应用程序启动前预加载动态库文件;其中,所述动态库文件包括由高版本OpenGL函数模拟所得到的在高版本OpenGL函数中已被摒弃的低版本OpenGL函数;
所述第一调用部分,经配置为在所述应用程序运行过程中,相应于被执行的OpenGL函数在高版本OpenGL函数库中不存在,则调用所述动态库文件中所模拟的且与所述被执行的OpenGL函数同名的低版本OpenGL函数;
所述第二调用部分,经配置为相应于所述被执行的OpenGL函数在所述高版本OpenGL函数库中存在,则直接调用高版本OpenGL函数库中与所述被执行的OpenGL函数同名的OpenGL函数。
第三方面,本发明实施例提供了一种计算设备,所述计算设备包括:通信接口,存储器和处理器;各个组件通过总线***耦合在一起;其中,
所述通信接口,用于在与其他外部网元之间进行收发信息过程中,信号的接收和发送;
所述存储器,用于存储能够在所述处理器上运行的计算机程序;
所述处理器,用于在运行所述计算机程序时,执行第一方面所述高版本OpenGL函数适配低版本应用程序的方法的步骤。
第四方面,本发明实施例提供一种计算机存储介质,所述计算机存储介质存储有高版本OpenGL函数适配低版本应用程序的程序,所述程序被至少一个处理器执行时实现第一方面所述高版本OpenGL函数适配低版本应用程序的方法的步骤。
本发明实施例提供了一种高版本OpenGL函数适配低版本应用程序的方法;通过增加一个动态库文件,使得每个在高版本OpenGL函数库中被摒弃的低版本OpenGL函数都通过高版本OpenGL函数进行模拟实现,从而在应用程序运行至需要执行被摒弃的低版本OpenGL函数时,调用动态库文件中的同名函数完成执行,无需对应用程序源码中的被摒弃的低版本OpenGL函数进行改写,并且当动态库文件加载完成后可使得本地的高版本OpenGL函数库能够适配运行各种由低版本OpenGL函数所产生的应用程序,节省了开发时间,提高了应用程序的开发效率和兼容性。
附图说明
图1为本发明实施例提供的计算机***组成示意图。
图2为说明图1中的CPU、GPU和存储器的实例实施方案的框图。
图3为本发明实施例提供的固定管线流程示意图。
图4为本发明实施例提供的可编程管线流程示意图。
图5为本发明实施例提供的一种高版本OpenGL函数适配低版本应用程序的方法流程示意图。
图6为本发明实施例提供的一种详细的应用程序调度流程示意图。
图7为本发明实施例提供的一种高版本OpenGL函数适配低版本应用程序的装置组成示意图。
图8为本发明实施例提供的另一种高版本OpenGL函数适配低版本应用程序的装置组成示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。
参见图1,其示出了能够实现本发明实施例技术方案的计算机***组成100,需注意,图示的***是可能的***的仅一个示例,并且可根据需要在各种***中的任一***中实现本发明的实施方案。该计算机***组成100具体可以为任意类型的计算装置,包括且不限于台式计算机、服务器、工作站、膝上计算机、基于计算机的仿真器、无线装置、移动或蜂窝电话(包含所谓的智能电话)、个人数字助理(PDA)、视频游戏控制台(包含视频显示器、移动视频游戏装置、移动视频会议单元)、膝上型计算机、桌上型计算机、电视机顶盒、平板计算装置、电子书阅读器、固定或移动媒体播放器等。如图1所示,计算机***组成100可以包括中央处理器(Central Processing Unit,CPU)10、图形处理器(Graphic ProcessingUnit,GPU)20、存储器30,还包括显示处理器40、显示器41以及通信接口50。显示处理器40可为与GPU 20相同的集成电路(Integrated Circuit,IC)的部分,也可在包含GPU 20的一或多个IC的外部,或可形成于在包含GPU 20的IC外部的IC中。
具体来说,CPU 10可包括控制计算机***组成100运算的通用或专用处理器,其经配置以处理供执行的计算机程序的指令。用户可经由通信接口50与耦合到计算机***组成100的另一输入装置(未图示)例如:轨迹球、键盘、鼠标、麦克风、触摸垫、触摸屏以及其他类型的装置将输入提供给计算机***组成100中的CPU 10,以使得CPU 10执行一或多个软件应用程序的指令。在CPU 10上执行的应用程序可包括图形用户接口(Graphic UserInterface,GUI)应用程序、操作***、便携式制图应用程序、用于工程或艺术应用的计算机辅助设计程序、视频游戏应用程序、文字处理器应用程序、电子邮件应用程序、电子表格应用程序、媒体播放器应用程序或使用2D、3D图形的渲染应用程序等,本发明实施例以执行图形渲染应用程序为例。此外,CPU 10上执行的渲染应用程序可包含一或多个图形渲染指令(也可以理解为待渲染的画面帧中包含一或多个所述图形),所述图形渲染指令可符合图形应用程序编程接口(Application Programming Interface,API),例如,开放式图形库API(OpenGL API)、开放式图形库嵌入***(OpenGL ES)API、Direct3D API、X3D API、RenderMan API、WebGL API、开放式计算语言(OpenCLTM)、RenderScript或任何其它异构计算API,或任何其它公用或专有标准图形或计算API,本发明下面的描述中将以OpenGL API为例进行说明。
GPU 20可经配置以执行图形运算,从而将一或多个图形图元渲染到显示器41进行展示。可以理解为,CPU 10通过控制GPU驱动程序14,将OpenGL定义的图形渲染指令翻译为GPU 20可读的图形渲染命令,然后GPU 20根据收到的一或多个图形渲染命令,包括但不限于图形命令和图形数据(例如绘制命令、状态信息、图元信息、纹理信息等),以使得GPU 20执行所述图形渲染命令中的一些或者全部,从而将一或多个图形图元进行渲染并在显示器41上展示出来。存储器30,经配置用于存储能够在CPU 10上运行的应用程序指令、GPU 20执行需要的图形数据以及其运行结果数据。例如,GPU 20可将完全形成的图像存储在存储器30中。存储器30可包含一或多个易失性或非易失性存储器或存储装置,例如,随机存取存储器(RAM)、静态RAM(SRAM)、动态RAM(DRAM)、可擦除可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)、快闪存储器、磁性数据媒体或光学存储媒体。显示处理器40可从存储器30检索图像且输出使显示器41的像素照亮以显示所述图像的值。显示器41可为计算机***100的显示器,其显示由GPU 20产生的图形图像内容。显示器41可为液晶显示器(LCD)、有机发光二极管显示器(OLED)、阴极射线管(CRT)显示器、等离子显示器或另一类型的显示装置。
结合图1所示,图2进一步阐述计算机***组成100中的关键部件CPU10、GPU 20和存储器30的实施方案的框图200,如图2所示,本发明实施例的实施方案的框图200主要包括但不限于CPU 10、GPU 20、存储器30及其对应内部构成。其中,CPU 10包含应用程序11、OpenGL API 13、GPU驱动程序14,其中OpenGL API 13和GPU驱动程序14两者中的每一个,可以为一或多个应用程序服务,在一些示例中,OpenGL API 13和GPU驱动程序14可实施为CPU10的硬件单元,而GPU驱动程序14可以将CPU 10的一或多个图形渲染指令编译成GPU 20可执行的应用程序命令。GPU 20内部结构包括但不限于图形存储器21、处理器集群22、纹理内存23。在本发明实施例中,图形存储器21可为GPU 20的一部分。因此,GPU 20可在不使用总线的情况下从图形存储器21读取数据且将数据写入到图形存储器21。换句话说,GPU 20可使用本地存储装置而不是芯片外存储器在本地处理数据,此类图形存储器21可被称作芯片上存储器。这允许GPU 20通过消除GPU 20经由总线读取和写入数据的需要来以更高效的方式操作,其中经由总线操作可经历繁重的总线业务。在一些示例中,GPU 20可不包含单独的存储器,而是经由总线利用外置的存储器30。图形存储器21的类型参见前述存储器30的类型,此处不再赘述。处理器集群22,用于执行图形处理管线,以便对图形渲染命令进行解码,并对图形处理管线进行配置以执行图形渲染命令中所指定的操作。纹理内存23是指用于存放纹理的内存。在渲染过程中,GPU的内存,也可称之为显存,可能被分配为很多不同的用途,比如作为顶点缓存、索引缓存、纹理缓存、模板缓存等,那么纹理内存23就是指纹理缓存。存储器30可包含输出缓冲器31和***存储器32。其中,输出缓冲器31可为***存储器32的部分或可与***存储器32分离。输出缓冲器31可存储经渲染图像数据,例如像素数据,其具体存储的数据为每个像素的红色、绿色、蓝色、α(RGBA)分量,其中“RGB”分量对应于色彩值,并且“A”分量对应于目的地α值(例如,用于图像合成的不透明度值)。其还可被称为帧缓冲器(Frame buffer)或显存,用于预览所述画面帧的渲染效果,也可以理解为预览所述画面帧的渲染效果可以通过Frame buffer机制实现,帧缓冲器是内核空间中的一种驱动程序接口,它本身不具备任何运算数据的能力,中间不会对数据做处理,但其需要真的显卡驱动的支持。
基于现有技术中OpenGL的应用程序调用方式,CPU 10通过应用程序11经由图形OpenGL API 13向GPU驱动程序14发出指令,GPU驱动程序14可调配指定供GPU 20执行的一或多个运算以便渲染图元的一或多个命令,以用于将一或多个图形图元渲染到可显示的图形图像中。当GPU 20接收到来自CPU 10的图形渲染命令时,GPU 20可使用处理器集群22执行图形处理管线,以便对命令进行解码,并对图形处理管线进行配置以执行图形渲染命令中所指定的操作。具体来说,GPU 20在实现或运行应用程序的过程中,需要借助于图形渲染管线以实现对图形的渲染操作,而图形渲染管线包括固定管线300和可编程管线400,分别如图3和图4所示,图形渲染管线属于一种通过级联形成的逻辑结构,各级也可称为各渲染阶段。一般分为顶点处理、图元装配、光栅化、片段着色以及测试与混合五个步骤,具体每个步骤对应的模块及操作详见图3和图4。对比图3和图4所示的图形渲染管线示意图,可知固定管线和可编程管线的区别在于,可编程管线增加了可编程的着色器Shader,如图4中圆角框所示的顶点处理器和片元处理器,其中,顶点处理器也可称之为顶点着色器,片元处理器也可称之为片段着色器。用户需要在应用程序中编写这两个模块对应的代码。
需要说明的是,对于OpenGL中存在的应用程序Program和着色器Shader的关系为,Program相当于当前渲染管线所使用的应用程序,是Shader的容器,可以挂载多个Shader;而每个Shader相当于一个应用程序部分,用来替代固定渲染管线的可编辑应用程序。对着色器Shader的处理流程为,首先需要对Shader脚本进行编译,然后将编译好的Shader挂载到Program上,在OpenGL的渲染中使用Program来使Shader生效。也就是说,Shader是专门用来实现不同渲染工序的应用程序,通过Shader可以自定义GPU的Shader渲染算法,以使得GPU根据所述Shader渲染算法处理所述图形数据中的每一个顶点以及每一个像素点,从而将该画面帧渲染到显示器。另外,由于固定管线的应用程序运行在低版本OpenGL平台,可编程管线的应用程序运行在高版本OpenGL平台,但是在固定管线中没有具备编程能力的模块,而且其运行的应用程序的部分低版本OpenGL函数在高版本OpenGL函数库中已不存在,因此在高版本OpenGL中对于在固定管线中基于低版本OpenGL开发的应用程序将无法运行。如果在高版本OpenGL的接口重写低版本OpenGL应用程序源码,需要修改大量的低版本OpenGL应用程序源码,并且若有很多应用程序源码修改方式不能通用,不能批量处理时,则需要对应用程序源码一一单独处理,费时费力。
基于上述内容的阐述,本发明实施例期望在应用程序执行前,将低版本OpenGL函数在高版本OpenGL中进行模拟,并封装成动态库文件。其中所述动态库文件在其他一些示例中,也可被称之为“动态链接库”或“动态链接文件”等,从而使得在应用程序执行至低版本OpenGL函数时,通过调用动态库文件中由高版本OpenGL函数模拟的与被执行的低版本OpenGL函数的同名函数,以完成对低版本OpenGL函数的执行,从而无需对应用程序源码中的低版本OpenGL函数进行重写,节省了开发时间,提高了开发效率。基于此,参见图5,其示出了本发明实施例提供的一种高版本OpenGL函数适配低版本应用程序的方法,该方法包括:
S501:在应用程序启动前预加载动态库文件;其中,所述动态库文件包括由高版本OpenGL函数模拟所得到的在高版本OpenGL函数中已被摒弃的低版本OpenGL函数;
S502:在所述应用程序运行过程中,相应于被执行的OpenGL函数在高版本OpenGL函数库中不存在,则调用所述动态库文件中所模拟的且与所述被执行的OpenGL函数同名的低版本OpenGL函数;
S503:相应于所述被执行的OpenGL函数在所述高版本OpenGL函数库中存在,则直接调用高版本OpenGL函数库中与所述被执行的OpenGL函数同名的OpenGL函数。
在一些示例中,结合图2,动态库文件具体可以表现为图2中虚线框所示的动态库模块12,高版本OpenGL函数库则可以表现为图2中的OpenGL API 13;那么在图5所示的技术方案中,S502所示的步骤参见图2中应用程序11与动态库模块12之间的虚线箭头,S503所示的步骤参见图2中应用程序11与OpenGL API 13之间的实线箭头。
根据上述方案的描述,本发明实施例通过增加一个动态库文件,使得每个在高版本OpenGL函数库中被摒弃的低版本OpenGL函数都通过高版本OpenGL函数进行模拟实现,从而在应用程序运行至需要执行被摒弃的低版本OpenGL函数时,调用动态库文件中的同名函数完成执行,无需对应用程序源码中的被摒弃的低版本OpenGL函数进行改写,并且当动态库文件加载完成后可使得本地的高版本OpenGL函数库能够适配运行各种由低版本OpenGL函数所产生的应用程序,节省了开发时间,提高了应用程序的开发效率和兼容性。
对于图5所示的技术方案,动态库文件中所包括的低版本OpenGL函数可以通过对应用程序进行预执行的方式进行收集,在一些示例中,所述方法还包括:
根据应用程序与本地的高版本OpenGL函数库筛选获得需要由高版本OpenGL函数模拟的低版本OpenGL函数列表;
利用高版本OpenGL函数库中的函数,对所述函数列表中的每个低版本OpenGL函数进行模拟,并将模拟得到的低版本OpenGL函数封装为动态库文件。
对于上述示例,具体来说,所述根据应用程序与本地的高版本OpenGL函数库筛选获得需要由高版本OpenGL函数模拟的低版本OpenGL函数列表,包括:
对比应用程序与高版本OpenGL函数库中的函数,将处于应用程序中且高版本OpenGL函数库中不存在的低版本OpenGL函数添加至所述函数列表;或者,
预先执行应用程序以通过图形API接口调用高版本OpenGL函数库,将报错信息中的低版本OpenGL函数添加至所述函数列表。
对于上述具体示例,详细来说,由于OpenGL是一个关于图形API的详述规范,规定了很多函数和其参数返回类型以及要实现的行为和管线操作。基于OpenGL开发的应用程序使用到的函数在OpenGL函数库文件中都有对应的原型。举例来说,基于低版本OpenGL开发的应用程序中的函数包括glBegin函数、glEnd函数以及glVertex3f函数,这些函数在其对应的低版本OpenGL函数库中都有对应的代码和相关的数据;假定高版本OpenGL函数库的版本为4.6,以glBegin函数为例,由于glBegin函数属于低版本OpenGL函数,不会在高版本OpenGL函数库中出现,可选地,将应用程序中的函数与高版本OpenGL函数库中的函数进行比较,就会发现glBegin函数不存在于高版本OpenGL函数库中,也就是说,glBegin函数即是需要由高版本OpenGL模拟的函数,并添加至需要由高版本OpenGL函数模拟的低版本OpenGL函数列表。可选地,通过图形API接口调用高版本OpenGL函数库的方式预执行应用程序的过程中,由于glBegin函数属于低版本OpenGL,不会在高版本OpenGL函数库中出现,因此在预执行过程中会产生报错信息以指示glBegin函数在高版本OpenGL函数库中出现,同样也能够说明glBegin函数即是需要由高版本OpenGL函数模拟的,并添加至需要由高版本OpenGL函数模拟的低版本OpenGL函数列表。
对于图5所示的技术方案,在一些示例中,对于所述利用高版本OpenGL函数库中的函数,对所述函数列表中的每个低版本OpenGL函数进行模拟,并将模拟得到的低版本OpenGL函数封装为动态库文件,包括:
使用高版本OpenGL函数模拟低版本OpenGL函数前引入默认的顶点着色器和片段着色器的Shader以及其对应的输入、输出参数;
根据OpenGL函数所定义的功能,利用高版本OpenGL函数库中的一或多个函数,对所述函数列表中的每个低版本OpenGL函数进行模拟并使用全局上下文记录模拟过程中高版本OpenGL函数所使用的函数信息;所述函数信息至少包括:函数调用次序、函数调用参数次序;
将使用高版本OpenGL函数模拟完成的低版本OpenGL函数列表封装为动态库文件。
具体实施过程,详细来说,需要由高版本OpenGL函数模拟的低版本OpenGL函数列表中通常包括绘制基本几何图元的函数、矩阵操作及几何变换函数、状态设置函数以及光照、材质、颜色类型的函数等类型。其中,绘制基本几何图元的函数包括glVertex3f、glBegin、glEnd、glNorma3f、glVertexPointer;矩阵操作及几何变换函数包括glMatrixMode、glLoadMatrixf、glPushMatrix、glPopMatrix、glTranslatef、glRotatef、glScalef;状态设置函数例如glEnable;光照、材质、颜色类型的函数例如glLightfv、glMaterialfv、glColor3f、glColorPointer等。由于在OpenGL 3.3之后的版本,图形渲染管线已由固定管线转变为可编程管线,可编程管线中增加了顶点着色器和片段着色器,因此在高版本OpenGL中需要输出对这两个模块的代码并且基于顶点着色器和片段着色器的功能,使用低版本OpenGL开发的应用程序中的部分函数已被摒弃,所以在高版本OpenGL模拟函数过程中需要引入默认的顶点和片段的Shader,其必须的输入和输出信息为:顶点着色器相关的变量或参数有顶点的位置及颜色position、color、视图矩阵及投影矩阵的变量modelview_matrix、projection_matrix、是否开启光照变量enable_light、光源相关的变量light_position、light_ambient、light_diffuse、light_specular、材质相关的变量material_ambient、material_diffuse、material_specular以及片段着色器的变量fragColor。
需要说明的是,在一些示例中,根据OpenGL函数所定义的功能,单个低版本OpenGL函数需要使用多个高版本OpenGL函数来模拟完成,两者是一对多的关系。所述在高版本OpenGL中模拟的低版本OpenGL函数和前述引入的默认的顶点和片段的Shader的输入和输出信息没有任何直接关系,当在高版本OpenGL模拟过程中函数调用参数(或称之为函数调用变量)有缺失或者参数变更以及在高版本OpenGL中引入了着色器程序等情况时,会引入一个全局上下文,例如OpenGL适配器上下文,用于记录在高版本OpenGL模拟过程中函数调用次序、函数调用参数次序、高版本OpenGL引入的模拟着色器程序、顶点缓冲对象VBO(Vertex Buffer Object)、顶点数组对象VAO(Vertex Array Object)等相关数据。在高版本OpenGL中模拟的低版本OpenGL函数可以引用到所述OpenGL适配器上下文中的多个参数,具体执行过程中会按照参数的调用次序依次执行。使用高版本OpenGL函数完成所有需要模拟的低版本OpenGL函数列表后统一封装为动态库文件,以便后续的执行调用。
高版本OpenGL函数模拟低版本OpenGL函数的过程,需要在OpenGL适配器上下文中定义需要的参数,此部分参数可以对应前述引入的默认的顶点和片段的Shader的输入和输出信息,OpenGL适配器上下文中定义的参数代码实现如下所示:
struct GLContext{
public:
GLuint program;
MatrixType currentMatrix = Project_Matrix;
uint32_t projectMatrixUniform;
uint32_t modeviewMatrixUniform;
vmath::mat4 currentMatrixData;
vmath::vec4 currentColor;
std::vector<Vertex> vertexes;
vmath::vec4 lightPosition,lightAmbient,lightDiffuse,lightSpecular;
vmath::vec4 materialAmbient[2],materialDiffuse[2],materialSpecular[2];
bool enableLight;
}
结合图5所示的技术方案,本发明以绘制基本几何图元的函数glBegin、glEnd为实施例,根据函数定义的功能,阐述使用高版本OpenGL函数模拟低版本OpenGL函数的操作过程。其他需要模拟的低版本OpenGL函数的模拟方法及具体代码实现与此类似,不再详细赘述。
实施例一:glBegin函数是在高版本OpenGL函数库已不存在的函数,仅存在于低版本OpenGL函数库中,其在低版本OpenGL中的原型是glBegin(GLenum mode),其中mode是要绘制图元的类型,可以是绘制点GL_POINTS、绘制线段GL_LINES、绘制首尾相连线GL_LINE_LOOP、绘制三角形GL_TRIANGLES、绘制四边形GL_QUADS等。在高版本OpenGL中模拟此函数需要完成如下步骤:1.glBegin函数内记录传入的mode类型;2.使用适配器中默认的渲染程序(program);3.更新当前渲染的着色器模型矩阵、投影矩阵的数据并写入渲染程序;4.创建当前glBegin渲染对象并设置其图元类型为传入的mode。在本发明实施例中,glBegin函数在高版本OpenGL中实现模拟,具体实现的示例性代码如下:
Void _glBegin(uint32_t flag)
{
glUseProgram(glContext.program);
glUniformMatrix4fv(glContext.projection_matrix_uniform,1,GL_TRUE,
&glContext.projection_matrix[0][0]);
glUniformMatrix4fv(glContext.model_matrix_uniform,1,GL_TRUE,
&glContext.model_matrix[0][0]);
glContext.vertexDrawMode = flag;
}
参考在低版本OpenGL中glBegin函数的代码实现,即可称之为glBegin函数的源码,在低版本OpenGL实现glBegin函数的代码如下所示:
void GLAPIENTRY
_mesa_Begin(GLenum mode)
{
GET_CURRENT_CONTEXT(ctx);
struct vbo_context*vbo = vbo_context(ctx);
struct vbo_exec_context*exec = &vbo->exec;
int i;
//检查之前是否调用过glBegin且未调用glEnd
if(_mesa_inside_begin_end(ctx)){
_mesa_error(ctx,GL_INVALID_OPERATION,"glBegin");
return;
}
if(ctx->NewState)
_mesa_update_state(ctx);
//判断输入参数mode的合法性
GLenum error = _mesa_valid_prim_mode(ctx,mode);
if(error!= GL_NO_ERROR){
_mesa_error(ctx,error,"glBegin");
return;
}
if(exec->vtx.vertex_size&&!exec->vtx.attr[VBO_ATTRIB_POS].size){
vbo_exec_FlushVertices_internal(exec,FLUSH_STORED_VERTICES);
//当前绘制图元+1
i = exec->vtx.prim_count++;
exec->vtx.mode[i] = mode;
exec->vtx.draw[i].start = exec->vtx.vert_count;
exec->vtx.markers[i].begin = 1;
ctx->Driver.CurrentExecPrimitive = mode;
//标记当前调用函数为glBegin已结束
ctx->Exec = ctx->BeginEnd;
}
if(ctx->GLThread.enabled){
ctx->CurrentServerDispatch = ctx->Exec;
}elseif(ctx->CurrentClientDispatch == ctx->OutsideBeginEnd){
ctx->CurrentClientDispatch = ctx->Exec;
_glapi_set_dispatch(ctx->CurrentClientDispatch);
}else{
assert(ctx->CurrentClientDispatch == ctx->Save);
}
}
对比glBegin函数在高版本OpenGL中模拟的代码实现和在低版本OpenGL中的源码实现,可知两种代码实现方式均是基于glBegin函数定义的功能,但在高版本OpenGL中glBegin函数是基于高版本OpenGL函数库模拟出来的同名函数,而在低版本OpenGL中glBegin函数是通过调用驱动内部OpenGL上下文来实现的,因此两者在glBegin函数的代码实现方式上没有可对比性,在高版本OpenGL中模拟低版本OpenGL函数的过程中也不需要参考和修改glBegin函数的源码,即可实现glBegin函数的功能。
实施例二:glEnd函数是在高版本OpenGL函数库中已不存在的函数,仅存在于低版本OpenGL函数库中,其原型是glEnd,此函数的出现意味着一次绘制的结束并且glEnd函数与glBegin函数相匹配,可以理解为,出现一个glBegin意味着后面就需要一个对应的glEnd。在高版本OpenGL中模拟glEnd函数,则需要做以下工作:1.创建一个VBO对象(VBO对象仅高版本OpenGL存在),例如命名为vbo;2.绑定VBO对象;3.加载顶点数据对象到vbo;4.指定vbo数据布局中0号位置是一个三元float的数据并激活,布局中0号位置即为顶点位置;5.指定vbo数据布局中1号位置是一个四元float的数据并激活,布局中1号位置即为顶点颜色位置;6.指定vbo数据布局中2号位置是一个三元float的数据并激活,布局中2号位置即为法线信息;7.调用glDrawAray函数绘制;8.调用glDeleteBuffers清理绑定的vbo。在高版本OpenGL中模拟glEnd函数具体实现的示例性代码如下:
void_glEnd()
{
GLuint vbo;//创建一个对象vbo
glGenBuffers(1,&vbo);//给vbo分配显存空间
glBindBuffer(GL_ARRAY_BUFFER,vbo);//绑定类型为GL_ARRAY_BUFFER的VBO对象
//加载顶点数据对象到vbo
glBufferData(GL_ARRAY_BUFFER,glContext.vertexData.size()*sizeof(Vertex),
glContext.vertexData.data(),GL_STATIC_DRAW);
//指定vbo数据布局中0号位置是一个三元float的数据并激活,0号位置即为顶点位置
glVertexAttribPointer(0,3,GL_FLOAT,GL_TRUE,0,nullptr);
glEnableVertexAttribArray(0);
//指定vbo数据布局中1号位置是一个四元float的数据并激活,1号位置即为顶点颜色位置
glVertexAttribPointer(1,4,GL_FLOAT,GL_TRUE,0,(void*)(3*sizeof(float)));
glEnableVertexAttribArray(1);
//指定vbo数据布局中2号位置是一个三元float的数据并激活,2号位置即为法线信息
glVertexAttribPointer(2,3,GL_FLOAT,GL_TRUE,0,(void*)(7*sizeof(float)));
glEnableVertexAttribArray(2);
//调用glDrawAray函数绘制
glDrawArrays(glContext.vertexDrawMode,0,glContext.vertexData.size());
//调用glDeleteBuffers清理绑定的vbo
glDeleteBuffers(1,&vbo);
}
以实施例一和实施例二所示出的关于glBegin和glEnd函数通过高版本OpenGL函数进行模拟实现的示例,可以利用高版本OpenGL函数库中的函数模拟完成低版本OpenGL函数列表中的每个低版本OpenGL函数,并将完成模拟后的所有低版本OpenGL函数封装为动态库文件,在高版本OpenGL应用程序执行至所述低版本OpenGL中的glBegin和glEnd函数时,优先执行动态库文件中已模拟过的同名函数。
对于图5所示的技术方案,在一些示例中,动态库文件在被调用之前需要被指定为预加载库,因此,所述在应用程序启动前预加载动态库文件,包括:
在应用程序启动前采用LD_PRELOAD方式预加载所述动态库文件;或者,
在应用程序启动前采用ELF PLT HOOK方式预加载所述动态库文件;或者,
在应用程序启动前采用MHOOK方式预加载所述动态库文件。
对于上述示例,具体来说,上述三种方式均可称之为HOOK方式,所述HOOK直译就是“钩子”的意思,是指截获进程对某个API函数的调用,使得API的执行流程转向实现的代码片段,从而实现所需要的功能,所述功能可以是监控、修复***漏洞,也可以是劫持或者其他恶意行为。关于LD_PRELOAD是适用于Linux***的一个环境变量,它可以影响应用程序的运行时的链接,它允许调试或者开发人员自定义在应用程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,调试或者开发人员可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。因此,可以以此功能在无需源码的基础上来使用更好的函数,还可以向已开发完成的应用程序注入特定的目的其他程序,例如调试所需的程序;关于ELF PLTHOOK方式,其最常用的实现机制是GOT/PLT HOOK,GOT/PLT HOOK主要是通过修改可执行和链接格式(Executable and Linking Format,ELF)文件结构中的全局偏移表(GlobalOffset Table,GOT)和程序链接表(Procedure Link Table,PLT)段的地址来实现的。ELF文件格式除了作为可执行文件,还可以作为共享库格式,也就是我们常见的SO(SharedObject)文件(.so)、object文件(.o)、coredumps文件等,GOT/PLT HOOK主要用于实现替换某个SO文件的外部调用,其适用于Linux系列平台;关于MHOOK方式,MHOOK采用的是HOOK住其它进程中的套接字SOCKET接收和发送方法,所以要写成动态链接库,用于Windows系列平台。
本发明实施例以采用LD_PRELOAD方式预加载所述动态库文件为例,具体实施方式为,例如上述的低版本OpenGL中的glBegin函数,其在高版本OpenGL中模拟完成后封装的动态库文件假定命名为myGL.so,高版本OpenGL的函数库命名为GL.so,可以在Linux命令行输入如下命令进行加载动态库文件myGL.so:
export LD_PRELOAD="./myGL.so"
对于图5所示的技术方案,在一些示例中,对于S502所述的在所述应用程序运行过程中,相应于被执行的OpenGL函数在高版本OpenGL函数库中不存在,则调用所述动态库文件中所模拟的且与所述被执行的OpenGL函数同名的低版本OpenGL函数,在具体实施过程中,仍然结合上述作为示例的glBegin函数为例,结合前述采用LD_PRELOAD方式预加载所述动态库文件的实施方式,假定在高版本OpenGL上要执行的应用程序命名为myApp,可以在Linux命令行输入如下命令调用要执行的应用程序myApp:
./myApp
应用程序myApp执行过程中,当执行到glBegin函数时,如图6所示,首先判断在高版本OpenGL函数库中是否存在glBegin函数,若不存在,则调用动态库myGL.so中模拟的低版本OpenGL的同名glBegin函数而不是高版本OpenGL函数库GL.so中的函数。对于动态库文件myGL.so来说,在高版本OpenGL中模拟glBegin函数的过程中需要通过调用高版本OpenGL函数库GL.so中的函数来模拟完成,因此动态库文件myGL.so需要连接到高版本OpenGL函数库GL.so。
对于图5所示的技术方案,在一些示例中,对于S503所述相应于所述被执行的OpenGL函数在所述高版本OpenGL函数库中存在,则直接调用高版本OpenGL函数库中与所述被执行的OpenGL函数同名的OpenGL函数,在具体实施过程中,仍参见图6,具体来说,如果应用程序myApp要执行的OpenGL函数在高版本OpenGL函数库GL.so中存在,则直接调用其对应的高版本OpenGL函数库GL.so中的函数。
基于前述技术方案相同的发明构思,参见图7,其示出了本发明实施例提供的一种高版本OpenGL适配低版本应用程序的装置700,所述装置700包括:预加载部分701、第一调用部分702和第二调用部分703;其中,
所述预加载部分701,经配置为在应用程序启动前预加载动态库文件;其中,所述动态库文件包括由高版本OpenGL函数模拟所得到的在高版本OpenGL函数中已被摒弃的低版本OpenGL函数;
所述第一调用部分702,经配置为在所述应用程序运行过程中,相应于被执行的OpenGL函数在高版本OpenGL函数库中不存在,则调用所述动态库文件中所模拟的且与所述被执行的OpenGL函数同名的低版本OpenGL函数;
所述第二调用部分703,经配置为相应于所述被执行的OpenGL函数在所述高版本OpenGL函数库中存在,则直接调用高版本OpenGL函数库中与所述被执行的OpenGL函数同名的OpenGL函数。
在一些示例中,参见图8,所述装置700还包括:筛选部分704和模拟部分705;其中,
所述筛选部分704,经配置为根据应用程序与本地的高版本OpenGL函数库筛选获得需要由高版本OpenGL函数模拟的低版本OpenGL函数列表;
所述模拟部分705,经配置为利用高版本OpenGL函数库中的函数,对所述函数列表中的每个低版本OpenGL函数进行模拟,并将模拟得到的低版本OpenGL函数封装为动态库文件。
在一些示例中,所述筛选部分704,经配置为:
对比应用程序与高版本OpenGL函数库中的函数,将处于应用程序中且高版本OpenGL函数库中不存在的低版本OpenGL函数添加至所述函数列表;或者,
预先执行应用程序以通过图形API接口调用高版本OpenGL函数库,将报错信息中的低版本OpenGL函数添加至所述函数列表。
在一些示例中,所述模拟部分705,经配置为:
使用高版本OpenGL函数模拟低版本OpenGL函数前引入默认的顶点着色器和片段着色器的Shader以及其对应的输入、输出参数;
根据OpenGL函数所定义的功能,利用高版本OpenGL函数库中的一个或多个函数,对所述函数列表中的每个低版本OpenGL函数进行模拟并使用全局上下文记录模拟过程中高版本OpenGL函数所使用的函数信息;所述函数信息至少包括:函数调用次序、函数调用参数次序;
将使用高版本OpenGL函数模拟完成的低版本OpenGL函数列表封装为动态库文件。
在一些示例中,所述预加载部分701,经配置为:
在应用程序启动前采用LD_PRELOAD方式预加载所述动态库文件;或者,
在应用程序启动前采用ELF PLT HOOK方式预加载所述动态库文件;或者,
在应用程序启动前采用MHOOK方式预加载所述动态库文件。
可以理解地,在本实施例中,“部分”可以是部分电路、部分处理器、部分程序或软件等等,当然也可以是单元,还可以是模块也可以是非模块化的。
另外,在本实施例中的各组成部分可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
所述集成的单元如果以软件功能模块的形式实现并非作为独立的产品进行销售或使用时,可以存储在一个计算机可读取存储介质中,基于这样的理解,本实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或processor(处理器)执行本实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储应用程序代码的介质。
因此,本实施例提供了一种计算机存储介质,所述计算机存储介质存储有高版本OpenGL函数适配低版本应用程序的程序,所述应用程序被至少一个处理器执行时实现上述技术方案中所述高版本OpenGL函数模拟低版本应用程序方法的步骤。
可以理解地,上述高版本OpenGL适配低版本应用程序的装置700的示例性技术方案,与前述高版本OpenGL适配低版本应用程序的方法的技术方案属于同一构思,因此,上述对于高版本OpenGL适配低版本应用程序的装置700的技术方案未详细描述的细节内容,均可以参见前述高版本OpenGL适配低版本应用程序的方法的技术方案的描述。本发明实施例对此不做赘述。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
Claims (10)
1.一种高版本OpenGL函数适配低版本应用程序的方法,其特征在于,所述方法包括:
在应用程序启动前预加载动态库文件;其中,所述动态库文件包括由高版本OpenGL函数模拟所得到的在高版本OpenGL函数中已被摒弃的低版本OpenGL函数;
在所述应用程序运行过程中,相应于被执行的OpenGL函数在高版本OpenGL函数库中不存在,则调用所述动态库文件中所模拟的且与所述被执行的OpenGL函数同名的低版本OpenGL函数;
相应于所述被执行的OpenGL函数在所述高版本OpenGL函数库中存在,则直接调用高版本OpenGL函数库中与所述被执行的OpenGL函数同名的OpenGL函数。
2.根据权利要求1所述方法,其特征在于,所述方法还包括:
根据应用程序与本地的高版本OpenGL函数库筛选获得需要由高版本OpenGL函数模拟的低版本OpenGL函数列表;
利用高版本OpenGL函数库中的函数,对所述函数列表中的每个低版本OpenGL函数进行模拟,并将模拟得到的低版本OpenGL函数封装为动态库文件。
3.根据权利要求2所述方法,其特征在于,所述根据应用程序与本地的高版本OpenGL函数库筛选获得需要由高版本OpenGL函数模拟的低版本OpenGL函数列表,包括:
对比应用程序与高版本OpenGL函数库中的函数,将处于应用程序中且高版本OpenGL函数库中不存在的低版本OpenGL函数添加至所述函数列表;或者,
预先执行应用程序以通过图形API接口调用高版本OpenGL函数库,将报错信息中的低版本OpenGL函数添加至所述函数列表。
4.根据权利要求2所述的方法,其特征在于,所述利用高版本OpenGL函数库中的函数,对所述函数列表中的每个低版本OpenGL函数进行模拟,并将模拟得到的低版本OpenGL函数封装为动态库文件,包括:
使用高版本OpenGL函数模拟低版本OpenGL函数前引入默认的顶点着色器和片段着色器的Shader以及其对应的输入、输出参数;
根据OpenGL函数所定义的功能,利用高版本OpenGL函数库中的一个或多个函数,对所述函数列表中的每个低版本OpenGL函数进行模拟并使用全局上下文记录模拟过程中高版本OpenGL函数所使用的函数信息;所述函数信息至少包括:函数调用次序、函数调用参数次序;
将使用高版本OpenGL函数模拟完成的低版本OpenGL函数列表封装为动态库文件。
5.根据权利要求1所述方法,其特征在于,所述在应用程序启动前预加载动态库文件,包括:
在应用程序启动前采用LD_PRELOAD方式预加载所述动态库文件;或者,
在应用程序启动前采用ELF PLT HOOK方式预加载所述动态库文件;或者,
在应用程序启动前采用MHOOK方式预加载所述动态库文件。
6.一种高版本OpenGL函数适配低版本应用程序的装置,其特征在于,所述装置包括:预加载部分、第一调用部分和第二调用部分;其中,
所述预加载部分,经配置为在应用程序启动前预加载动态库文件;其中,所述动态库文件包括由高版本OpenGL函数模拟所得到的在高版本OpenGL函数中已被摒弃的低版本OpenGL函数;
所述第一调用部分,经配置为在所述应用程序运行过程中,相应于被执行的OpenGL函数在高版本OpenGL函数库中不存在,则调用所述动态库文件中所模拟的且与所述被执行的OpenGL函数同名的低版本OpenGL函数;
所述第二调用部分,经配置为相应于所述被执行的OpenGL函数在所述高版本OpenGL函数库中存在,则直接调用高版本OpenGL函数库中与所述被执行的OpenGL函数同名的OpenGL函数。
7.根据权利要求6所述的装置,其特征在于,所述装置还包括:筛选部分和模拟部分;其中,
所述筛选部分,经配置为根据应用程序与本地的高版本OpenGL函数库筛选获得需要由高版本OpenGL函数模拟的低版本OpenGL函数列表;
所述模拟部分,经配置为利用高版本OpenGL函数库中的函数,对所述函数列表中的每个低版本OpenGL函数进行模拟,并将模拟得到的低版本OpenGL函数封装为动态库文件。
8.根据权利要求6所述的装置,其特征在于,所述预加载部分,经配置为:
在应用程序启动前采用LD_PRELOAD方式预加载所述动态库文件;或者,
在应用程序启动前采用ELF PLT HOOK方式预加载所述动态库文件;或者,
在应用程序启动前采用MHOOK方式预加载所述动态库文件。
9.一种计算设备,其特征在于,所述计算设备包括:通信接口,处理器,存储器;各个组件通过总线***耦合在一起;其中,
所述通信接口,用于在与其他外部网元之间进行收发信息过程中,信号的接收和发送;
所述存储器,用于存储能够在所述处理器上运行的计算机程序;
所述处理器,用于在运行所述计算机程序时,执行权利要求1至5任一项所述高版本OpenGL函数适配低版本应用程序的方法的步骤。
10.一种计算机存储介质,其特征在于,所述计算机存储介质存储有高版本OpenGL函数适配低版本应用程序的程序,所述程序被至少一个处理器执行时实现权利要求1-5任一项所述高版本OpenGL函数适配低版本应用程序的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211095506.6A CN115167949B (zh) | 2022-09-08 | 2022-09-08 | 高版本OpenGL函数适配低版本应用程序的方法、装置及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211095506.6A CN115167949B (zh) | 2022-09-08 | 2022-09-08 | 高版本OpenGL函数适配低版本应用程序的方法、装置及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115167949A true CN115167949A (zh) | 2022-10-11 |
CN115167949B CN115167949B (zh) | 2022-12-06 |
Family
ID=83482362
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211095506.6A Active CN115167949B (zh) | 2022-09-08 | 2022-09-08 | 高版本OpenGL函数适配低版本应用程序的方法、装置及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115167949B (zh) |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2418576A1 (en) * | 2010-08-11 | 2012-02-15 | Sony Computer Entertainment Europe Ltd. | Multi-platform development tool and method |
US20160011890A1 (en) * | 2013-03-19 | 2016-01-14 | Huawei Technologies Co., Ltd. | Compatibility method and apparatus |
CN108509240A (zh) * | 2018-03-09 | 2018-09-07 | 广东欧珀移动通信有限公司 | 图片绘制方法及相关产品 |
US10074206B1 (en) * | 2017-05-23 | 2018-09-11 | Amazon Technologies, Inc. | Network-optimized graphics library for virtualized graphics processing |
CN110659024A (zh) * | 2019-08-21 | 2020-01-07 | 北京达佳互联信息技术有限公司 | 图形资源转换方法、装置、电子设备及存储介质 |
CN112764797A (zh) * | 2021-01-06 | 2021-05-07 | 浙江大华技术股份有限公司 | 软件兼容性检测方法、装置、电子装置和存储介质 |
CN113485773A (zh) * | 2021-06-24 | 2021-10-08 | 锐捷网络(苏州)有限公司 | 数据处理方法、装置及*** |
CN113838180A (zh) * | 2020-06-24 | 2021-12-24 | 华为技术有限公司 | 一种渲染指令处理方法及其相关设备 |
CN114661324A (zh) * | 2022-03-14 | 2022-06-24 | 稿定(厦门)科技有限公司 | 特效插件的编译、渲染方法、装置及存储介质 |
-
2022
- 2022-09-08 CN CN202211095506.6A patent/CN115167949B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2418576A1 (en) * | 2010-08-11 | 2012-02-15 | Sony Computer Entertainment Europe Ltd. | Multi-platform development tool and method |
US20160011890A1 (en) * | 2013-03-19 | 2016-01-14 | Huawei Technologies Co., Ltd. | Compatibility method and apparatus |
US10074206B1 (en) * | 2017-05-23 | 2018-09-11 | Amazon Technologies, Inc. | Network-optimized graphics library for virtualized graphics processing |
CN108509240A (zh) * | 2018-03-09 | 2018-09-07 | 广东欧珀移动通信有限公司 | 图片绘制方法及相关产品 |
CN110659024A (zh) * | 2019-08-21 | 2020-01-07 | 北京达佳互联信息技术有限公司 | 图形资源转换方法、装置、电子设备及存储介质 |
CN113838180A (zh) * | 2020-06-24 | 2021-12-24 | 华为技术有限公司 | 一种渲染指令处理方法及其相关设备 |
CN112764797A (zh) * | 2021-01-06 | 2021-05-07 | 浙江大华技术股份有限公司 | 软件兼容性检测方法、装置、电子装置和存储介质 |
CN113485773A (zh) * | 2021-06-24 | 2021-10-08 | 锐捷网络(苏州)有限公司 | 数据处理方法、装置及*** |
CN114661324A (zh) * | 2022-03-14 | 2022-06-24 | 稿定(厦门)科技有限公司 | 特效插件的编译、渲染方法、装置及存储介质 |
Non-Patent Citations (1)
Title |
---|
王有禄等: "Android***下基于NDK方式的图形开发", 《计算机***应用》 * |
Also Published As
Publication number | Publication date |
---|---|
CN115167949B (zh) | 2022-12-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10949944B2 (en) | System and method for unified application programming interface and model | |
CN107209923B (zh) | 图形处理中的混合渲染 | |
US9117302B2 (en) | Switching between direct rendering and binning in graphics processing using an overdraw tracker | |
CN108027955B (zh) | 经带宽压缩的图形数据的存储技术 | |
EP3420536A1 (en) | Start node determination for tree traversal for shadow rays in graphics processing | |
US20150348224A1 (en) | Graphics Pipeline State Object And Model | |
CN113342703B (zh) | 一种渲染效果实时调试方法、装置、开发设备及存储介质 | |
US10417791B2 (en) | Multi-step texture processing with feedback in texture unit | |
CN115357516B (zh) | 一种渲染问题的调试方法、装置、设备及存储介质 | |
EP3178061A1 (en) | High order filtering in a graphics processing unit | |
CN113256764A (zh) | 一种光栅化装置、方法及计算机存储介质 | |
US20160180548A1 (en) | Indefinite texture filter size for graphics processing | |
CN114972607A (zh) | 加速图像显示的数据传输方法、装置及介质 | |
CN106575428B (zh) | 图形处理单元中的高阶滤波 | |
CN113393585A (zh) | 一种渲染问题定位方法、装置、定位设备及存储介质 | |
CN116909511A (zh) | 提升gpu双缓冲显示效率的方法、装置及存储介质 | |
CN115167949B (zh) | 高版本OpenGL函数适配低版本应用程序的方法、装置及介质 | |
US10157443B1 (en) | Deferred batching of incremental constant loads | |
CN117472336B (zh) | 基于程序api的代码生成装置及其方法、设备及介质 | |
Wang | XNA-like 3D Graphics Programming on the Raspberry Pi |
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 | ||
CP03 | Change of name, title or address | ||
CP03 | Change of name, title or address |
Address after: Room 301, Building D, Yeda Science and Technology Park, No. 300 Changjiang Road, Yantai Area, China (Shandong) Pilot Free Trade Zone, Yantai City, Shandong Province, 265503 Patentee after: Xi'an Xintong Semiconductor Technology Co.,Ltd. Address before: Room T1 301, Taiwei intelligent chain center, No. 8, Tangyan South Road, high tech Zone, Xi'an, Shaanxi 710065 Patentee before: Xi'an Xintong Semiconductor Technology Co.,Ltd. |