一种图像渲染方法、装置及电子设备与流程

文档序号:11627973阅读:173来源:国知局
一种图像渲染方法、装置及电子设备与流程

本申请涉及图像处理技术领域,具体涉及一种图像渲染方法、装置及电子设备。



背景技术:

随着图形硬件的发展,渲染管线由固定不可更改向着可编程和更平滑的方向不断发展。通过gpu(graphicsprocessingunit,图形处理单元)对图像进行渲染处理,能够显著增加渲染的速度,同时可以在一些复杂的大程序中释放cpu空间而提高效率。

着色器(shader)是在图形卡的gpu上执行的自定义程序,是一个描述顶点或像素特性的简单程序。着色器代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程型,例如:视图转换、投影转换等。着色器可分为三种类型:vertexshader(顶点着色器)、fragmentshader(片断着色器)和geometryshader(几何着色器)。其中,顶点着色器的功能是将每个顶点在虚拟空间中的三维坐标变换为可以在屏幕上显示的二维坐标,并带有用于z-buffer的深度信息。对于发送给gpu的每一个顶点,都要通过顶点着色器对该顶点进行处理。顶点着色器可操作的属性包括位置、颜色及纹理坐标。片断着色器用于计算每个像素的颜色和其它属性。通过应用光照值、凹凸贴图、阴影、镜面高光、半透明等处理来计算像素的颜色并输出,也可改变像素的深度(z-buffering)或在多个渲染目标被激活的状态下输出多种颜色。一个片断着色器不能产生复杂的效果,因为它只在一个像素上进行操作,而不知道场景的几何形状。

着色器的编写语言包括glsl(openglshadinglanguage,opengl着色语言)或hlsl(highlevelshaderlanguage,高阶着色器语言)等语言。其中,glsl是用来在opengl中进行着色编程的语言;而hlsl是由微软开发的一种语言,hlsl独立的工作在windows平台上,通常供微软的direct3d使用。下面以opengl+glsl为例对图像渲染的现有技术及存在的问题进行说明。

opengl(opengraphicslibrary,开放图形库)是一个定义了跨编程语言、 跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大、调用方便的底层图形库。通过opengl的api可以进行绘制图元、变换图形等处理,但不能改变基础的渲染管线。采用与opengl结合非常紧密的glsl(openglshadinglanguage,opengl着色语言),能将渲染管线中固定的功能阶段转变成可编程的。

目前,基于opengl实现图像渲染的方法是,直接将glsl编写的图像着色代码写入java或者object-c等语言编写的opengl应用程序中,例如,基于opengl实现个性化的图像滤镜功能,需要将着色器代码直接写入java或者object-c程序中,以及根据不同的图形纹理(texture)不断的调整程序代码。

然而,由于上述方法将着色器的程序代码直接写入到应用程序中,因此,当其它应用场景或应用程序需要进行相同的着色处理时,将出现无法复用已有着色器的程序代码的问题。例如,实现类似于photoshop的不同图层blend时,需要用glsl编写大量opengl的程序代码,而这些代码是无法复用的。由于glsl程序片段无法复用,因此将出现系统逐渐臃肿、开发人员难以阅读程序、以及程序可维护性差的问题。此外,随着实际业务的不断发展变更,程序的灵活性也会逐渐变差。

综上所述,现有技术存在无法复用着色器的程序代码的问题。



技术实现要素:

本申请提供一种图像渲染方法、装置及电子设备,以解决现有技术存在无法复用着色器的程序代码的问题。

本申请提供一种图像渲染方法,包括:

获取待处理的图像及特定图像渲染效果;

根据预先生成的与所述特定图像渲染效果对应的着色器程序配置文件及实现所述特定图像渲染效果所需的各个着色器的程序代码文件,生成实现所述特定图像渲染效果的着色器程序;

执行所述着色器程序,对所述待处理的图像进行图像渲染处理;

其中,所述着色器程序配置文件包括所述着色器程序的程序结构、所述各个着色器的程序代码文件的文件名及常量参数。

可选的,所述生成实现所述特定图像渲染效果的着色器程序,包括:

加载并解析所述着色器程序配置文件,获取所述程序结构、所述各个着色器的程序代码文件的文件名和所述常量参数;

根据所述文件名,读取所述各个着色器的程序代码文件,获取所述各个着色器的程序代码;

针对所述程序结构包括的各个所述着色器程序,根据与所述着色器程序关联的着色器对象的顺序标识及所述着色器的程序代码,创建并编译各个着色器对象,以及创建并链接所述着色器程序;

根据所述常量参数,为各个所述着色器程序设置各个常量的值;以及为各个所述着色器程序设置各个变量的值。

可选的,所述特定图像渲染效果包括单个滤镜的渲染效果或多个滤镜叠加的渲染效果;其中,所述单个滤镜包括至少一个所述着色器程序。

可选的,所述执行所述着色器程序,采用如下方式:

根据所述程序结构及所述着色器程序的顺序标识,依次执行各个所述着色器程序。

可选的,包括所述图像渲染方法的图像渲染应用程序的程序语言为java语言;在所述创建并编译各个着色器对象之前,还包括:

通过jni技术,将所述各个着色器的程序代码及所述常量参数传递至c++语言编写的本地程序中;所述本地程序执行所述创建并编译各个着色器对象的步骤。

可选的,所述着色器程序配置文件包括与所述程序结构相关的标签;所述标签包括效果标签、滤镜标签、着色器程序标签、着色器标签或常量标签;所述着色器标签包括文件名属性及着色器类型属性;所述常量标签包括名称属性和类型属性,和/或值属性;所述滤镜标签、所述着色器程序标签和所述着色器标签包括顺序属性。

可选的,所述着色器程序配置文件存储在包括所述图像渲染方法的图像渲染应用程序的资源目录中;所述资源目录包括assets目录或res目录。

可选的,所述图像渲染方法应用于屏幕渲染或离屏渲染;所述程序代码所采用的程序语言包括glsl着色语言或hlsl着色语言;所述特定图像渲染效果包括单个滤镜的渲染效果或多个滤镜叠加的渲染效果。

相应的,本申请还提供一种图像渲染装置,包括:

获取单元,用于获取待处理的图像及特定图像渲染效果;

生成单元,用于根据预先生成的与所述特定图像渲染效果对应的着色器程序配置文件及实现所述特定图像渲染效果所需的各个着色器的程序代码文件,生成实现所述特定图像渲染效果的着色器程序;

执行单元,用于执行所述着色器程序,对所述待处理的图像进行图像渲染处理;

其中,所述着色器程序配置文件包括所述着色器程序的程序结构、所述各个着色器的程序代码文件的文件名及常量参数。

可选的,所述生成单元包括:

解析子单元,用于加载并解析所述着色器程序配置文件,获取所述程序结构、所述各个着色器的程序代码文件的文件名和所述常量参数;

获取源代码子单元,用于根据所述文件名,读取所述各个着色器的程序代码文件,获取所述各个着色器的程序代码;

创建程序子单元,用于针对所述程序结构包括的各个所述着色器程序,根据与所述着色器程序关联的着色器对象的顺序标识及所述着色器的程序代码,创建并编译各个着色器对象,以及创建并链接所述着色器程序;

设置参数子单元,用于根据所述常量参数,为各个所述着色器程序设置各个常量的值;以及为各个所述着色器程序设置各个变量的值。

可选的,所述生成单元还包括:

传递子单元,用于通过jni技术,将所述各个着色器的程序代码及所述常量参数传递至c++语言编写的本地程序中;所述本地程序执行所述创建并编译各个着色器对象的步骤。

相应的,本申请还提供一种电子设备,包括:

显示器;

处理器;以及

存储器,所述存储器被配置成存储图像渲染装置,所述图像渲染装置被所述处理器执行时,包括如下步骤:获取待处理的图像及特定图像渲染效果;根据预先生成的与所述特定图像渲染效果对应的着色器程序配置文件及实现所述 特定图像渲染效果所需的各个着色器的程序代码文件,生成实现所述特定图像渲染效果的着色器程序;执行所述着色器程序,对所述待处理的图像进行图像渲染处理;其中,所述着色器程序配置文件包括所述着色器程序的程序结构、所述各个着色器的程序代码文件的文件名及常量参数。

与现有技术相比,本申请具有以下优点:

本申请提供的图像渲染方法、装置及电子设备,通过获取待处理的图像及特定图像渲染效果;根据为特定图像渲染效果预先生成的着色器程序配置文件及实现特定图像渲染效果所需的各个着色器的程序代码文件,生成实现特定图像渲染效果的着色器程序;执行着色器程序,对待处理的图像进行图像渲染处理。采用本申请提供的方法,将着色器程序的程序结构、各个着色器的程序代码文件的文件名及常量参数设置在着色器程序配置文件中,避免将着色器的程序代码直接写入应用程序中,使得能够复用预先编写的着色器的程序代码,从而达到提高gpu开发效率的效果。

附图说明

图1是本申请的图形渲染方法实施例a的流程图;

图2是本申请的图形渲染方法实施例a步骤s103的具体流程图;

图3是本申请的图形渲染方法实施例b的系统架构图;

图4是本申请的图形渲染装置实施例的示意图;

图5是本申请的图形渲染装置实施例生成程序单元103的具体示意图;

图6是本申请的电子设备实施例的示意图。

具体实施方式

在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。

在本申请中,提供了一种图形渲染方法、装置及电子设备。在下面的实施例中逐一进行详细说明。

本申请提供的图形渲染方法,其核心的基本思想为:将实现特定图像渲染 效果的着色器程序的程序结构、各个着色器的程序代码文件的文件名及常量参数等作为可配置对象设置在着色器程序配置文件中,通过解析着色器程序配置文件,并根据单独存储的各个着色器的程序代码文件,生成实现特定图像渲染效果的着色器程序。由于将着色器程序的程序结构、着色器程序代码文件的文件名及常量参数等设置在着色器程序配置文件中,避免将着色器的程序代码直接写入应用程序中,使得能够复用预先编写的着色器的程序代码,从而达到提高gpu开发效率的效果。

请参考图1,其为本申请的图形渲染方法实施例的流程图。所述方法包括如下步骤:

步骤s101:获取待处理的图像及特定图像渲染效果。

本申请实施例所述的待处理的图像包括但不限于位图文件(bitmap)。位图是windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/(8*1024)=3072kb。

本申请实施例所述的特定图像渲染效果包括采用单个滤镜或多个滤镜的组合对图像进行渲染所达到的图像效果。滤镜是指对图像的像素点进行变换等处理的算法,主要用来实现图像的各种特殊效果。滤镜通常需要同通道、图层等联合使用,以取得最佳艺术效果。应用多个滤镜的组合对图像进行渲染,能够达到类似于photoshop的不同图层blend时的图像效果。

获取到待处理的图像及特定图像渲染效果后,就可进入下一步,根据着色器程序配置文件生成着色器程序。

步骤s103:根据预先生成的与所述特定图像渲染效果对应的着色器程序配置文件及实现所述特定图像渲染效果所需的各个着色器的程序代码文件,生成实现所述特定图像渲染效果的着色器程序。

本申请实施例提供的图像渲染方法,采用动态加载方式加载与特定图像渲染效果对应的着色器程序配置文件,该配置文件可存入应用程序工程根目录下的资源目录中,例如,assets目录或res目录。所述的着色器程序配置文件包括实现特定图像渲染效果所需的各种着色器程序配置参数,例如,程序结构、滤镜的名称及属性、着色器的程序代码文件的文件名及各种常量参数等。其中,所述的程序结构是指,实现特定图像渲染效果所需的各个着色器的执行顺序; 所述的常量参数是指,在着色器中使用的常量数据,例如,glsl着色器中的uniform变量。

本申请实施例所述的着色器程序可包括多个顶点着色器和多个片段着色器,一个顶点着色器对应一个片段着色器。以opengl为例,着色器程序可包括多个program对象,每个program对象包括一个顶点着色器和一个片段着色器。在实际应用中,一个滤镜可包括多个program对象,各个program对象的执行是有序的;对于多个滤镜组合成的图像渲染效果,其中的各个滤镜的执行也是有序的。

需要说明的是,着色器程序配置文件的编写语言包括但不限于可扩展标记语言(extensiblemarkuplanguage,xml),还可以采用其它标记语言。采用xml语言编写着色器程序配置文件,使得配置文件具有结构性,能够根据各个标签的从属关系获取到各层级配置参数。

本申请实施例所述的特定图像渲染效果及与其对应的着色器程序配置文件之间具有对应关系,例如,特定图像渲染效果的名称与配置文件的文件名前缀相同等。在本实施例中,通过特定图像渲染效果与其着色器程序配置文件之间的对应关系,获取与特定图像渲染效果对应的着色器程序配置文件。

本申请实施例所述的着色器的程序代码存储在图像渲染程序以外的外部文件中,通过读取外部文件的程序,可获取存储在外部文件中的着色器的程序代码。在本实施例中,将顶点着色器的程序代码文件后缀定义为.vs,片段着色器的程序代码文件后缀定义为.fs。在实际应用中,也可以定义为其它后缀,如.vert等。

在实际应用中,可以采用多种具体的实施方式实现步骤s103。该实施方式的各种形式的变化,都只是具体实施方式的变更,都不偏离本申请的核心,因此都在本申请的保护范围之内。

请参考图2,其为本申请的图像渲染方法实施例a步骤s103的具体流程图。在本实施例中,步骤s103可包括如下步骤:

步骤s1031:加载并解析所述着色器程序配置文件,获取所述程序结构、所述各个着色器的程序代码文件的文件名和所述常量参数。

要生成着色器程序,首先需要加载并解析着色器程序配置文件,以获取程序结构、各个着色器的程序代码文件的文件名和常量参数。下面给出两个本实 施例所用的着色器程序配置文件对程序结构、着色器的程序代码文件的文件名和常量参数进行说明。

1)对应单个滤镜效果的着色器程序配置文件。

在本实施例中,着色器程序配置文件采用xml语言进行编写,对应单个滤镜效果的着色器程序配置文件,其示例代码如下:

由上述代码可见,该配置文件与一个滤镜效果相对应。一个滤镜可以包含多个可执行程序(即:program对象)。在opengles中,每个program对象有且仅有一个顶点着色器对象和一个片断着色器对象连接到它,因此,每个program包括一个顶点着色器和一个片断着色器。上述代码中着色器标签shader所具有的name属性是指,该着色器的程序代码文件的文件名或文件标识;uniform标签表示着色器的uniform变量,其中,type属性为类型属性、name属性为名称属性、value属性为值属性。

2)对应多个滤镜组合效果的着色器程序配置文件。

在本实施例中,对应多个滤镜组合效果的着色器程序配置文件,其示例代码如下:

由上述代码可见,该配置文件与一个多滤镜组合而成的图像渲染效果相对应,一个多滤镜组合的渲染效果可以包含多个滤镜。其中,滤镜标签filter具有的id属性指定对滤镜进行叠加的顺序,name属性指定滤镜的名称,通过滤镜名称,可获取与该滤镜对应的着色器程序配置文件;滤镜标签filter的下一级标签param定义了该滤镜应用的参数,param标签具有的参数名属性、参数类型属性、参数值属性等。

需要说明的是,以上给出的着色器程序配置文件只是一种具体的文件格式,在实际应用中,还可以采用其它文件格式。该实施方式的各种形式的变化,都只是具体实施方式的变更,都不偏离本申请的核心,因此都在本申请的保护范围之内。

本步骤首先加载与特定图像渲染效果对应的着色器程序配置文件,然后对该着色器程序配置文件进行解析处理,从而能够获取着色器程序的程序结构、各个着色器的程序代码文件的文件名和常量参数。

本实施例采用xml语言标记着色器程序配置文件,因此,可通过xml解析器(即:xmlparser)获取着色器程序的程序结构、各个着色器的程序代码文件的文件名和常量参数。

步骤s1032:根据所述文件名,读取所述各个着色器的程序代码文件,获取所述各个着色器的程序代码。

通过上一步骤获取到各个着色器的程序代码文件的文件名后,本步骤根据文件名,读取各个着色器的程序代码文件,获取各个着色器的程序代码。例如,步骤s1031给出的单个滤镜对应的着色器程序配置文件包括一个着色器,该着色器的程序代码文件的文件名为film.fs,通过读取该文件,可获取该着色器的程序代码文件。

在本实施例中,film.fs文件中的着色器的程序代码如下:

由上述代码可见,该着色器将原始图片做了一次贝塞尔映射。

步骤s1033:针对所述程序结构包括的各个所述着色器程序,根据与所述着色器程序关联的着色器对象的顺序标识及所述着色器的程序代码,创建并编译各个着色器对象,以及创建并链接所述着色器程序。

本步骤针对获取到的程序结构所包括的各个着色器程序(如opengl中的program对象)分别进行处理。针对各个着色器程序,首先根据与该着色器程序关联的着色器对象的顺序标识(如步骤s1031中滤镜对应的着色器程序配置文件中的<shaderid=’0’>)及相应的着色器程序代码,创建并编译各个着色器对象,然后再创建并链接着色器程序,即:生成可执行程序。可执行程序包含最后可以在硬件(即:gpu)上执行的硬件指令。

在本实施例中,生成可执行程序的步骤包括:1)创建并编译shader对象;2)创建并链接program对象。

1)创建并编译shader对象。

获取到着色器的源代码后,就可以创建shader实例。一个program对象包括两个着色器对象:一个为顶点着色器实例,另一个为片断着色器实例。以opengl为例,创建shader实例的api为glcreateshader(glenumtype),该api返回一个gluint类型的着色器实例。创建着色器实例后,需要为每个shader实例指定源码,opengl中对应的api为glshadersource。然后,就可以在线编译shader源码,opengl中对应的api为glcompileshader(gluintshader)。

2)创建并链接program对象。

编译好shader对象后,就可以创建program对象,opengl中对应的api为glcreateprogram(void),该api返回一个gluint类型的program实例。创建program对象后,需将编译好的shader对象绑定到program对象,opengl中对 应的api为glattachshader(gluintprogram,gluintshader)。每个program必须绑定一个vertexshader和一个fragmentshader。

创建的program对象实际为着色器程序容器的id。如果任何类型为gl_vertex_shader的shader对象连接到program,则该shader对象将产生在顶点着色器上可执行的程序;如果任何类型为gl_fragment_shader的shader对象连接到program,它将产生在像素着色器上可执行的程序。

将编译好的shader对象绑定到program对象后,还需要链接program,opengl中对应的api为gllinkprogram(gluintprogram)。在链接阶段使用glgetprogramiv()可获取编译情况。在链接了program以后,就可以使用gluseprogram()函数来加载并使用链接好的程序。

需要说明的是,对于使用独立shader编译器编译的二进制shader代码,可使用glshaderbinary来加载到一个shader实例中。

步骤s1034:根据所述常量参数,为各个所述着色器程序设置各个常量的值;以及为各个所述着色器程序设置各个变量的值。

以glsl为例,uniform变量限定了表示一个变量的值将由应用程序在着色器执行之前指定,并且在图元的处理过程中不会发生变化。glsl中的uniform是由顶点着色器和片段着色器共享的,因此,必须声明为全局变量。例如,对于顶点着色器来说,可能最普遍的统一值就是变换矩阵。

当glsl编译器链接到着色器程序后,它会创建一个表格,其中包含了所有的uniform变量,获取该变量在表中的索引值所对应的api为glgetuniformlocation(gluintprogram,constglchar*name)。

用户定义的属性变量都是全局变量,与opengl应用程序传递给在opengl实现内部执行的顶点着色器的值相关联。uniform变量和attribute变量在着色器中通过location和name来对应的。

需要说明的是,包括本申请实施例提供的图像渲染方法的图像渲染应用程序可采用多种编程语言,例如,c++或java语言等。如果所采用的程序语言为java语言,那么,在创建并编译各个着色器程序之前,还包括:通过jni技术,将各个着色器的程序代码及常量参数传递至c++语言编写的本地程序中。

jni是javanativeinterface的缩写,它提供了若干的api实现了java和其他语言的通信(主要是c&c++)。c++语言编写的本地程序执行所述创建并编译各 个着色器对象的步骤以及后续创建并链接着色器程序的步骤,能够达到有利于跨平台的效果。

在具体实现方面,要通过jni技术将着色器的程序代码及常量参数传递至c++语言编写的本地程序,需要预先进行两方面工作:1)生成包括本地方法的本地动态链接库;2)在java层注册本地方法。由于这两方面工作均属成熟的现有技术,因此,此处不再赘述。

在链接了着色器程序后,就可以加载并使用链接好的着色器程序,从而对待处理的图像进行图像渲染处理。

步骤s105:执行所述着色器程序,对所述待处理的图像进行图像渲染处理。

最后,需要执行着色器程序,对待处理的图像进行图像渲染处理。在实际应用中,可根据程序结构及各个着色器程序的顺序标识,依次执行各个着色器程序,从而完成对待处理的图像的处理。所述的着色器程序的顺序标识是指,着色器程序的执行顺序,例如,在步骤s1031给出的滤镜示例的着色器程序配置文件中,<programid=’0’>即表示该program对象的顺序标识。

本申请实施例提供的图像渲染方法,可运行在应用各种操作系统的计算设备中,例如,android操作系统、ios操作系统、wp操作系统或linux操作系统。下面给出运行在android操作系统中的一个实施例。

请参考图3,其为本申请的图像渲染方法实施例b的系统架构图。运行实施例b的计算设备采用的操作系统为android操作系统,在android操作系统中图像渲染应用程序通常为java程序。因此,实施例b的系统架构图包括三层架构:1)java层;2)jni层;3)c++核心层。其中,android的framework用于加载着色器程序配置文件;jni层用于传递配置参数;c++核心层用于具体构建着色器程序。下面分别对上述各层进行具体说明。

1)java层

在android中用ndk层egl/opengl显示java层打开的图像,即:在android的java层打开一张图片,并在native层进行渲染。因此,本实施例的图像渲染方法可以分为两个部分:首先,在java层读取着色器程序配置文件,并构建各个配置对象,通过jni接口将配置对象传给ndk层;然后,在ndk层通过egl和opengles来渲染图像。

在本实施例中,java层的主要任务包括:基于glsurfaceview管理esl的 surface,并维护渲染线程;基于esl的工作原理,将着色器程序做出可以配置化,并将配置文件存入工程根目录下的资源目录(如assets目录或res目录)中;通过jni将java中的各个配置对象,传递给c++相映射的native对象。

在本实施例中,加载并解析着色器程序配置文件的处理在java层完成,并根据获取到的程序结构、各个着色器的程序代码文件的文件名和常量参数,形成各个配置对象,例如,效果(effect)对象、滤镜对象、着色器对象、参数对象等。java层构建的各个配置对象,需要通过jni的本地接口,传递给c++相映射的native对象。

由图3可见,java层包括lwglsurfaceview类,该类继承了glsurfaceview类。android上使用opengl进行滤镜渲染效率较高,比起单纯的使用cpu给用户带来的体验会好很多。滤镜的对象是图片,图片是以bitmap的形式表示,opengl不能直接处理bitmap,在android上一般是通过glsurfaceview来进行渲染的,即:android需要借助glsurfaceview来完成对图片的渲染。通过自定义的lwglsurfaceview类,可添加定制属性。

需要说明的是,通常在android上使用opengles,都是希望把渲染后的结果显示在屏幕上,例如,图片处理、模型显示等。这种情况下,只需要使用androidapi中提供的glsurfaceview类和renderer类,在这两个类提供的初始化、回调函数中设置/编写相应的代码即可。在实际应用中,如果不希望把渲染结果显示在屏幕上,也就是所说的离屏渲染(offscreenrender),则无需使用这两个类。

上述glsurfaceview类提供如下功能:1)在opengles和view系统之间建立联系;2)使得opengles可以工作在activity生命周期中;3)可选择合适的framebuffer像素格式;4)创建并管理一个单独的渲染线程,可以实现平滑的动画;5)提供debugging工具和api。

在android上使用glsurfaceview来显示并完成图片的渲染,实现渲染需要实现glsurfaceview.render接口,该接口有三个方法:ondrawframe(gl10gl),该方法按照一定的刷新频率反复执行;onsurfacechanged(gl10gl,intwidth,intheight),该方法在窗口重绘的时候执行;onsurfacecreated(gl10gl,eglconfigconfig)在创建surfaceview的时候执行。具体的,onsurfacecreated方法在渲染开始前调用,opengles的绘制上下文被重建时也会被调用。当activity暂停时绘制上下文会丢失,当activity继续时,绘制上下文会被重建。另外,创建 长期存在的opengl资源(如texture)往往也在这里进行。onsurfacechanged方法是在surface的尺寸发生改变时被调用的。往往在这里设置viewport。每帧都通过ondrawframe进行绘制。绘制时通常先调用glclear函数来清空framebuffer,然后在调用opengles的起它的接口进行绘制。

2)jni层

在android中提供jni的方式,让java程序可以调用c/c++语言程序。android中很多java类都具有native接口,这些native接口就是由本地实现,然后注册到系统中。android包含很多jni库,例如:媒体部分的jni在目录frameworks/base/media/jni/中,被编译成libmedia_jni.so。在本实施例中,jni层主要是维护java和engine的中间管理层。

3)c++核心层

c++核心层负责具体实现各个本地方法,供jni层调用,以对待处理图像进行渲染处理。本实施例在c++层对openggles的api进行封装,由于c++内核可以在不同平台上移植,由此为本申请实施例提供的方法移植到linux或者ios平台做准备。

需要说明的是,在android上进行图像渲染,还涉及到egl接口。egl是介于诸如opengl或openvg的khronos渲染api与底层本地平台窗口系统的接口。它被用于处理图形管理、表面/缓冲捆绑、渲染同步及支援使用其他khronosapi进行的高效、加速、混合模式2d和3d渲染。

在上述的实施例中,提供了一种图像渲染方法,与之相对应的,本申请还提供一种图像渲染装置。该装置是与上述方法的实施例相对应。

请参看图4,其为本申请的图像渲染装置实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。

本实施例的一种图像渲染装置,包括:

获取单元101,用于获取待处理的图像及特定图像渲染效果;

生成单元103,用于根据预先生成的与所述特定图像渲染效果对应的着色器程序配置文件及实现所述特定图像渲染效果所需的各个着色器的程序代码文件,生成实现所述特定图像渲染效果的着色器程序;

执行单元105,用于执行所述着色器程序,对所述待处理的图像进行图像渲 染处理;

其中,所述着色器程序配置文件包括所述着色器程序的程序结构、所述各个着色器的程序代码文件的文件名及常量参数。

请参看图5,其为本申请的图像渲染装置实施例的具体示意图。可选的,所述生成单元103包括:

解析子单元1031,用于加载并解析所述着色器程序配置文件,获取所述程序结构、所述各个着色器的程序代码文件的文件名和所述常量参数;

获取源代码子单元1032,用于根据所述文件名,读取所述各个着色器的程序代码文件,获取所述各个着色器的程序代码;

创建程序子单元1034,用于针对所述程序结构包括的各个所述着色器程序,根据与所述着色器程序关联的着色器对象的顺序标识及所述着色器的程序代码,创建并编译各个着色器对象,以及创建并链接所述着色器程序;

设置参数子单元1035,用于根据所述常量参数,为各个所述着色器程序设置各个常量的值;以及为各个所述着色器程序设置各个变量的值。

可选的,所述生成单元103还包括:

传递子单元1033,用于通过jni技术,将所述各个着色器的程序代码及所述常量参数传递至c++语言编写的本地程序中;所述本地程序执行所述创建并编译各个着色器对象的步骤。

请参考图6,其为本申请的电子设备实施例的示意图。由于设备实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的设备实施例仅仅是示意性的。

本实施例的一种电子设备,该电子设备包括:显示器1101;处理器1102;以及存储器1103,获取待处理的图像及特定图像渲染效果;根据预先生成的与所述特定图像渲染效果对应的着色器程序配置文件及实现所述特定图像渲染效果所需的各个着色器的程序代码文件,生成实现所述特定图像渲染效果的着色器程序;执行所述着色器程序,对所述待处理的图像进行图像渲染处理;其中,所述着色器程序配置文件包括所述着色器程序的程序结构、所述各个着色器的程序代码文件的文件名及常量参数。

本申请提供的图像渲染方法、装置及电子设备,通过获取待处理的图像及特定图像渲染效果;根据为特定图像渲染效果预先生成的着色器程序配置文件 及实现特定图像渲染效果所需的各个着色器的程序代码文件,生成实现特定图像渲染效果的着色器程序;执行着色器程序,对待处理的图像进行图像渲染处理。采用本申请提供的方法,将着色器程序的程序结构、各个着色器的程序代码文件的文件名及常量参数设置在着色器程序配置文件中,避免将着色器的程序代码直接写入应用程序中,使得能够复用预先编写的着色器的程序代码,从而达到提高gpu开发效率的效果。

本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

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