一种图像渲染方法、装置和存储介质与流程

文档序号:16214506发布日期:2018-12-08 08:10阅读:162来源:国知局
一种图像渲染方法、装置和存储介质与流程
本发明涉及通信
技术领域
,具体涉及一种图像渲染方法、装置和存储介质。
背景技术
渲染,是计算机图形学(cg,computergraphics)的最后一道工序,也是最终使图像符合三维(3d,3dimensions)场景的阶段,通过对图像进行纹理的渲染,可以使图象更清晰和逼真。所谓纹理,是指一个物体上颜色的模式、以及物体表面的状况,比如是粗糙的还是光滑的,等等。事实上,一个纹理就是一个位图,例如,我们可以将一些青草、泥土和岩石等纹理用于一些三维图元,并将它们堆成一座小山,这样就有了一个山坡的背景,以此类推,通过纹理的渲染,可以得到各种所需的图像。通常情况下,一次渲染只能画出一个纹理(也可以看成为一个图案),若需要画出多种不同的纹理,则需要进行多次渲染。为此,现有技术又提出了另一种方案,具体为将不同纹理图合成一张大图,然后,将该大图一次性加载到显存中,再按照各纹理图在该大图中的坐标(简称纹理坐标)从该大图中获取相应的纹理,对待渲染图像进行渲染,进而实现单次渲染(指加载至显存的次数为一)多个不同纹理的目的。在对现有技术的研究和实践过程中,本发明的发明人发现,虽然“合成大图”的方案可以在一定程度上提高渲染的处理效率,但是,由于在合成后,大图的内容(纹理)就固定了,因此,单次渲染的内容只能是该大图中的内容,灵活性较差,而且,由于需要将该大图全部加载至内存和显存中,所以,会占用大量的内存和显存,对设备性能有一定影响。技术实现要素:本发明实施例提供一种图像渲染方法、装置和存储介质,可以在实现单次渲染多个纹理的同时,提高其灵活性,以及减少内存和显存的占用,改善设备性能。本发明实施例提供一种图像渲染方法,包括:获取待渲染图像、以及多个待渲染纹理图,其中每个待渲染纹理图对应的一组纹理参数;对所述多个待渲染纹理图的纹理参数进行拼接,得到拼接后纹理参数;按照待渲染纹理图的数量构造纹理索引数组;根据所述纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对所述待渲染图像进行渲染。相应的,本发明实施例还提供一种图像渲染装置,包括获取单元、拼接单元、构造单元和渲染单元,如下:获取单元,用于获取待渲染图像、以及多个待渲染纹理图,其中每个待渲染纹理图对应的一组纹理参数;拼接单元,用于对所述多个待渲染纹理图的纹理参数进行拼接,得到拼接后纹理参数;构造单元,用于按照待渲染纹理图的数量构造纹理索引数组;渲染单元,用于根据所述纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对所述待渲染图像进行渲染。可选的,在一些实施例中,所述拼接单元,具体可以用于确定所述多个待渲染纹理图的纹理参数的参数标识,将属于同一参数标识的纹理参数添加至同一参数集合中,得到多个与参数标识对应的参数集合,按照预设第一数据结构对得到的参数集合进行构造,得到拼接后纹理参数。可选的,在一些实施例中,所述构造单元可以包括构造子单元、建立子单元和组合子单元,如下:所述构造子单元,可以用于构造与所述待渲染纹理图的数量等量的数组,使得不同数组中元素的值不同;所述建立子单元,可以用于建立所构造的数组与待渲染纹理图之间的一一对应关系;所述组合子单元,可以用于根据所述对应关系,将所有数组按照预设第二数据结构进行组合,得到纹理索引数组。可选的,在一些实施例中,所述建立子单元,具体可以用于确定待渲染纹理图的渲染顺序,基于所述渲染顺序建立待渲染纹理图与数组之间的一一对应关系,使得渲染顺序在前的待渲染纹理图所对应的数组内元素的值,大于渲染顺序在后的待渲染纹理图所对应的数组内元素的值。可选的,在一些实施例中,所述构造子单元,具体可以用于构造与所述待渲染纹理图的数量等量的可变数组,每个可变数组包括多个具有相同值的元素,且不同可变数组中元素的值不同。可选的,在一些实施例中,所述渲染单元可以包括确定子单元、读取子单元和渲染子单元,如下:所述确定子单元,可以用于从所述纹理索引数组中确定当前纹理索引;所述读取子单元,可以用于根据所述当前纹理索引从拼接后纹理参数中读取纹理参数,得到目标纹理参数;所述渲染子单元,可以用于基于目标纹理参数对所述待渲染图像进行渲染,并触发确定子单元执行从所述纹理索引数组中确定当前纹理索引的操作,直至所述多个待渲染纹理图均渲染完毕。可选的,在一些实施例中,所述图像渲染装还可以包括载入单元,如下:所述载入单元,可以用于调用片段着色器,并将拼接后纹理参数载入所述片段着色器中;所述读取子单元,具体用于根据所述当前纹理索引,从片段着色器所承载的拼接后纹理参数中读取纹理参数,得到目标纹理参数。可选的,在一些实施例中,所述载入单元,具体可以用于调用片段着色器,在所述片段着色器中设置多个纹理变量,将拼接后纹理参数载入所述多个纹理变量中;所述读取子单元,具体可以用于根据所述当前纹理索引,从所述多个纹理变量中读取纹理参数,得到目标纹理参数。可选的,在一些实施例中,所述渲染子单元,具体可以用于获取目标纹理参数所对应的待渲染纹理图,得到目标纹理图,在显存中,采用所述目标纹理图对所述待渲染图像进行渲染。可选的,在一些实施例中,所述图像渲染装置还可以包括加载单元,如下:所述加载单元,可以用于将所述多个待渲染纹理图加载至显存,以及,将所述待渲染图像加载至显存;所述渲染子单元,具体可以用于从显存中获取目标纹理参数所对应的待渲染纹理图,得到目标纹理图。此外,本发明实施例还提供一种存储介质,所述存储介质存储有多条指令,所述指令适于处理器进行加载,以执行本发明实施例所提供的任一种图像渲染方法中的步骤。本发明实施例在获取到待渲染图像和多个待渲染纹理图之后,可以对该多个待渲染纹理图的纹理参数进行拼接,以及按照待渲染纹理图的数量构造纹理索引数组,然后,根据该纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对该待渲染图像进行渲染,进而达到单次渲染多个纹理的目的;由于该方案只需对纹理参数进行拼接,在需要渲染时才获取相应的待渲染纹理图,而无需预先对多张待渲染纹理图进行合成,因此,现对于现有单次渲染的内容只能是合成后大图中的内容的方案而言,可以灵活地通过调整纹理参数来选择所需渲染的纹理,大大提高其灵活性,而且,由于该方案无需一次性将合成后大图加载至内存和显存中,所以,也可以大大减少内存和显存的占用,改善设备性能。附图说明为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1a是本发明实施例提供的图像渲染方法的场景示意图;图1b是本发明实施例提供的图像渲染方法的流程图;图1c是本发明实施例提供的图像渲染方法中拼接前纹理参数的示例图;图1d是本发明实施例提供的图像渲染方法中拼接后纹理参数的示例图;图1e是本发明实施例提供的图像渲染方法中纹理索引数组的示例图;图2a是本发明实施例提供的图像渲染方法的另一流程图;图2b是本发明实施例提供的图像渲染方法中拼接前纹理参数的另一示例图;图2c是本发明实施例提供的图像渲染方法中纹理参数拼接的另一示例图;图2d是本发明实施例提供的图像渲染方法中纹理索引数组的另一示例图;图3a是本发明实施例提供的图像渲染装置的结构示意图;图3b是本发明实施例提供的图像渲染装置的另一结构示意图;图4是本发明实施例提供的终端的结构示意图。具体实施方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。为了更好地对本发明实施例进行说明,以下将对开放图形库(opengl,opengraphicslibrary)和渲染进行简略说明。opengl是指定义了一个跨编程语言、及跨平台的编程接口规格的专业的图形程序接口,它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。opengl默认的渲染步骤是在图形处理器(gpu,graphicsprocessingunit)上执行的,当需要渲染一个几何图形时,一般会采用一个顶点缓冲器(vertexbuffer)来定义构成几何图形的三角形(或者了可以采用其他基本图像,但一般采用三角形),顶点缓冲器中又包含一系列的顶点数据。来自顶点缓冲器中的顶点数据作为输入传递给顶点着色器(vertexshader),在顶点着色器中处理这些数据,然后,由图形处理器将顶点着色器的输出数据组装为三角形,并对这些三角形进行适当地剪裁,以适应用户视域(viewport),再由光栅化单元对剪裁后三角形进行处理,得到片段(fragments)数据。片段数据是一种简单的数据格式,每一个片段数据包含一个三角形在屏幕上能显示的所有像素,片段数据中的数据内容通常由顶点着色器决定。事实上,顶点着色器可以将顶点属性参数作为自己的输出。光栅化单元负责将顶点着色器输出的顶点数据在三角形上进行颜色插值(interpolate),使片段数据上的每个像素都得到正确的属性值。此后,这些插值后未经处理的片段数据被传输给片段着色器(fragmentshader),由片段着色器确定并输出片段数据上的每个像素的最终颜色,这样,即完成了渲染的目的。可选的,除了片段着色器接收的片段数据外,还可以用将一些待渲染纹理图(即纹理数据)传递给片段着色器,供片段着色器取样。传统方案中,单次渲染一般只能渲染一个纹理,而本发明实施例则提供了一种图像渲染方法、装置和存储介质,其不仅可以实现单次渲染多个纹理(texture)的目的,而且还可以提高其灵活性,以及减少内存和显存的占用。例如,以图像渲染装置具体集成在终端中为例,如图1a所示,终端在获取到待渲染图像、以及多个待渲染纹理图如“待渲染纹理图1、待渲染纹理图2……、待渲染纹理图n”后,可以通过对多个待渲染纹理图的纹理参数进行拼接,以及按照待渲染纹理图的数量构造纹理索引数组,然后,在需要渲染时,利用该纹理索引数组依次从拼接后纹理参数中读取纹理参数,以获取相应的纹理来对待渲染图像进行渲染。下分别进行详细说明。需说明的是,以下实施例的序号不作为对实施例优选顺序的限定。实施例一、本实施例将从图像渲染装置的角度进行描述,该图像渲染装置具体可以集成在终端等设备中,该终端可以包括手机、平板电脑、笔记本电脑、和个人计算机(pc,personalcomputer)等设备。一种图像渲染方法,包括:获取待渲染图像、以及多个待渲染纹理图,其中每个待渲染纹理图对应的一组纹理参数;对该多个待渲染纹理图的纹理参数进行拼接,得到拼接后纹理参数;按照待渲染纹理图的数量构造纹理索引数组;根据该纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对该待渲染图像进行渲染。如图1b所示,该图像渲染方法的具体流程可以如下:101、获取待渲染图像、以及多个待渲染纹理图。其中,待渲染图像指的是需要进行渲染的对象,而待渲染纹理图则指的是需要渲染至待渲染图像的纹理。每个待渲染纹理图对应的一组纹理参数,每一组纹理参数可以包括至少一个纹理参数,每个纹理参数可以包括渲染时所采用的基本图形的各个顶点的坐标,比如,以该基本图形为两个三角形(即以两个三角形的方式来渲染)为例,如图1c所示,则每一个纹理参数可以包括这两个三角形的顶点的坐标,如第一个三角形的左上角的坐标(lt)、第一个三角形的左下角的坐标(lb)、第一个三角形的右下角的坐标(rb)、第二个三角形的左上角的坐标(lt)、第二个三角形的右下角的坐标(rb)、以及第二个三角形的右上角的坐标(rt),等等。102、对该多个待渲染纹理图的纹理参数进行拼接,得到拼接后纹理参数;例如,具体可以如下:确定该多个待渲染纹理图的纹理参数的参数标识,将属于同一参数标识的纹理参数添加至同一参数集合中,得到多个与参数标识对应的参数集合,按照预设第一数据结构对得到的参数集合进行构造,得到拼接后纹理参数。其中,该参数标识指的是用于区分不同参数的信息,比如参数的名称或编号等,为了描述方便,在本发明实施例中,将均以该参数标识具体为参数名称为例进行说明。例如,以纹理参数具体为“参数1”和“参数2”为例,参见图1c和图1d,具体可以如下:分别提取各个待渲染纹理图,如待渲染纹理图1和待渲染纹理图2等的“参数1”的纹理参数,然后,将提取到的多个“参数1”纹理参数添加至同一参数集合1中,并按照预设数据结构(为了描述方便,在此称为第一数据结构)对该参数集合1进行构造,得到拼接后的“参数1”的纹理参数。同理,分别提取各个待渲染纹理图,如待渲染纹理图1和待渲染纹理图2等的“参数2”的纹理参数,然后,将提取到的多个“参数2”纹理参数添加至同一参数集合2中,并按照预设第一数据结构对该参数集合2进行构造,得到拼接后的“参数2”的纹理参数。其中,该第一数据结构可以根据实际应用的需求而定,比如,如图1d所示,可以以参数标识,如“参数1”为字段名,参数集合1中的各个纹理参数为字段内容,构建一数据段,便可以得到拼接后的“参数1”纹理参数,同理,可以以“参数2”为字段名,参数集合2中的各个纹理参数为字段内容,构建一数据段,便可以得到拼接后的“参数2”纹理参数,依此类推,其他参数集合与此类似,最终可以得到多个具有不同字段名的数据段,在本发明实施例中,将这些数据段称为拼接后纹理参数。103、按照待渲染纹理图的数量构造纹理索引数组。其中,该纹理索引数组可以对当前渲染的纹理进行识别。之所以在此构造纹理索引数组,这是因为,当顶点着色器的输出数据(三角形)经由光栅化单元处理之后,片段着色器所需要处理的“点”的数量,要比原本顶点着色器需要的“点”的数量多得多,比如,以渲染2个纹理,如纹理1和纹理2为例,若每个纹理用两个三角形画,则共有12个顶点,因此,顶点着色器需要执行12次,而栅格化后,片段着色器却可能要执行成千上万次,因此,很难控制片段着色器当前渲染的是纹理1还是纹理2,所以,此时需要构造一“标识”来识别不同的纹理,在本发明实施例中,将该“标识”称为纹理索引数组。其中,该纹理索引数组中包括多个纹理索引,纹理索引的数量与待渲染纹理图的数量相对应,且每一纹理索引对应一个待渲染纹理图。该纹理索引数组的构造方法可以有多种,例如,具体可以如下:(1)构造与该待渲染纹理图的数量等量的数组,使得不同数组中元素的值不同;例如,具体可以如下:构造与该待渲染纹理图的数量等量的可变(varying)数组,每个可变数组包括多个具有相同值的元素,且不同可变数组中元素的值不同。其中,varying用于在顶点着色器和片段着色器之间进行数据传递的变量。比如,还是以在渲染时所采用的基本图形为“两个三角形”为例(即一个纹理用两个三角形的方式渲染),则该可变数组可以包括6个元素,且同一个可变数组中的6个元素为同一值,比如同为0.5等,而不同可变数组中元素的值不同,比如可变数组1中元素的值为0.5,可变数组2中元素的值为1.5,等等。由于根据opengl的插值原理,光栅化单元在负责将顶点着色器输出的顶点数据在三角形上进行颜色插值时,插值的结果会介于可变数组中这些元素的最大值和最小值之间,而此处所构造的可变数组中各个元素的值又均为同一值,因此,其插值的结果也必然为同一值,也就是说,在渲染其中每个三角形时,各个像素的插值结果总是这个值(比如0.5或1.5等),所以,在片段着色器中,只要知道当前的插值是多少,便可以区分出当前画的是哪个纹理,譬如,如果插值为0.5,则可以确定当前正在渲染的纹理为待渲染纹理图1,如果插值为1.5,则可以确定当前正在渲染的纹理为待渲染纹理图2,以此类推,等等。(2)建立所构造的数组与待渲染纹理图之间的一一对应关系;例如,可以如下:确定待渲染纹理图的渲染顺序,基于该渲染顺序建立待渲染纹理图与数组之间的一一对应关系,使得渲染顺序在前的待渲染纹理图所对应的数组内元素的值,大于渲染顺序在后的待渲染纹理图所对应的数组内元素的值。比如,以待渲染纹理图的渲染顺序为“待渲染纹理图1—>待渲染纹理图2—>待渲染纹理图3”,且数组1、数组2和数组3内元素的值分别为0.5、1.5和2.5为例,则如图1e所示,待渲染纹理图1可以对应数组1(0.5,0.5,0.5,0.5,0.5,0.5),待渲染纹理图2对应数组2(1.5,1.5,1.5,1.5,1.5,1.5),而待渲染纹理图3则可以对应数组3(2.5,2.5,2.5,2.5,2.5,2.5),以此类推,等等。(3)根据该对应关系,将所有数组按照预设数据结构(为了描述方便,在本发明实施例中称为第二数据结构)进行组合,得到纹理索引数组。例如,可以以纹理索引的名称,如“a_texindex”为字段名,各个数组为字段内容,构建一数据段,便可以得到该纹理索引数组,比如,参见图1e。104、根据该纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对该待渲染图像进行渲染。例如,具体可以如下:(1)从该纹理索引数组中确定当前纹理索引。(2)根据该当前纹理索引从拼接后纹理参数中读取纹理参数,得到目标纹理参数。比如,具体可以从片段着色器中读取纹理参数,即在步骤“根据该当前纹理索引从拼接后纹理参数中读取纹理参数,得到目标纹理参数”之前,该图像渲染方法还可以包括:调用片段着色器,并将拼接后纹理参数载入该片段着色器中;比如,具体可以在该片段着色器中设置多个纹理变量,然后,将拼接后纹理参数载入该多个纹理变量中,等等。则此时,步骤“根据该当前纹理索引从拼接后纹理参数中读取纹理参数,得到目标纹理参数”可以包括:根据该当前纹理索引,从片段着色器所承载的拼接后纹理参数中读取纹理参数,得到目标纹理参数;比如,可以根据该当前纹理索引,从该多个纹理变量中读取纹理参数,得到目标纹理参数。(3)基于目标纹理参数对该待渲染图像进行渲染,并返回执行从该纹理索引数组中确定当前纹理索引的步骤,直至该多个待渲染纹理图均渲染完毕。例如,具体可以获取目标纹理参数所对应的待渲染纹理图,得到目标纹理图,在显存中,采用该目标纹理图对该待渲染图像进行渲染。其中,在进行渲染之前,需要将待渲染纹理图和待渲染图像加载至显存中,即在步骤“基于目标纹理参数对该待渲染图像进行渲染”之前,该图像渲染方法还可以包括:将该多个待渲染纹理图加载至显存;以及,将该待渲染图像加载至显存。则此时,步骤“获取目标纹理参数所对应的待渲染纹理图,得到目标纹理图”可以包括:从显存中获取目标纹理参数所对应的待渲染纹理图,得到目标纹理图。需说明的是,在加载多个待渲染纹理图时,为了避免短时间消耗过多的内存和显存,无需一次性对该多个待渲染纹理图进行加载,而是可以分批和/或分时段进行加载,加载的时机可以根据需求灵活设置,只需在渲染之前即可。同理,待渲染图像的加载时机也只需在渲染之前,具体可以根据实际应用的需求而定。由上可知,本实施例在获取到待渲染图像和多个待渲染纹理图之后,可以对该多个待渲染纹理图的纹理参数进行拼接,以及按照待渲染纹理图的数量构造纹理索引数组,然后,根据该纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对该待渲染图像进行渲染,进而达到单次渲染多个纹理的目的;由于该方案只需对纹理参数进行拼接,在需要渲染时才获取相应的待渲染纹理图,而无需预先对多张待渲染纹理图进行合成,因此,现对于现有单次渲染的内容只能是合成后大图中的内容的方案而言,可以灵活地通过调整纹理参数来选择所需渲染的纹理,大大提高其灵活性,而且,由于该方案无需一次性将合成后大图加载至内存和显存中,所以,也可以大大减少内存和显存的占用,改善设备性能。实施例二、根据前面实施例所描述的方法,以下将举例作进一步详细说明。在本实施例中,将以该图像渲染装置具体集成在终端中为例进行说明。如图2a所示,一种图像渲染方法,具体流程可以如下:201、终端获取待渲染图像、以及多个待渲染纹理图。其中,每个待渲染纹理图对应的一组纹理参数,每一组纹理参数可以包括渲染时所采用的基本图形的各个顶点的坐标,比如,以该基本图形为两个三角形为例,则每一组纹理参数可以包括这两个三角形的顶点的坐标,如第一个三角形的左上角的坐标(lt)、第一个三角形的左下角的坐标(lb)、第一个三角形的右下角的坐标(rb)、第二个三角形的左上角的坐标(lt)、第二个三角形的右下角的坐标(rb)、以及第二个三角形的右上角的坐标(rt),等等。例如,以该多个待渲染纹理图具体为待渲染纹理图1和待渲染纹理图2,且以纹理坐标具体为贴纸坐标“position”为例,则该多个待渲染纹理图的纹理参数具体可以如图2b所示。需说明的是,待渲染图像与该多个待渲染纹理图可以是同时获取,也可以是依次获取,且获取的先后顺序可以根据实际应用的需求而定。此外,还需说明的是,该待渲染图像、以及多个待渲染纹理图的样式和内容均可以根据实际应用的需求而定,比如,以在人脸图像上添加“耳朵”、“胡须”和/或“桃心”为例,则可以将人脸图像作为待渲染图像,而将“耳朵”、“胡须”和“桃心”等贴纸作为待渲染纹理图,以此类推。202、终端对该多个待渲染纹理图的纹理参数进行拼接,得到拼接后纹理参数。例如,终端可以确定该多个待渲染纹理图的纹理参数的参数标识,将属于同一参数标识的纹理参数添加至同一参数集合中,得到多个与参数标识对应的参数集合,然后,按照预设第一数据结构对得到的参数集合进行构造,得到拼接后纹理参数。其中,该参数标识指的是用于区分不同参数的信息,比如参数的名称或编号等。例如,以纹理参数具体为“贴纸坐标”(position)为例,参见图2c,具体可以如下:分别提取各个待渲染纹理图,如待渲染纹理图1和待渲染纹理图2等的“position”纹理参数,然后,将提取到的多个“position”纹理参数添加至同一参数集合中,并按照预设第一数据结构对该参数集合进行构造,得到拼接后的“position”纹理参数。其中,该第一数据结构可以根据实际应用的需求而定,比如,如图2c所示,可以以参数标识,如参数名称“position”为字段名,参数集合中的各个纹理参数(如待渲染纹理图1的“position”纹理参数、以及待渲染纹理图2的“position”纹理参数等)为字段内容,构建一数据段,便可以得到拼接后的“position”纹理参数。其他参数集合与此类似,最终可以得到多个具有不同字段名的数据段,在本发明实施例中,将这些数据段称为拼接后纹理参数。其中,纹理参数的值可以为各个渲染时所采用的基本图像如三角形的顶点的坐标。比如,以待渲染纹理图1为“耳朵”、以及待渲染纹理图2为“胡须”为例,则拼接后的“position”纹理参数的数据结构可以如下:203、终端调用片段着色器(fragmentshader),并将拼接后纹理参数载入该片段着色器中。比如,终端具体可以在该片段着色器中设置多个纹理变量,然后,将拼接后纹理参数载入该多个纹理变量中,等等。需说明的是,由于在传统的渲染方法中,一次只渲染一个纹理,所以,其片段着色器中只需有一个纹理变量来承载其纹理,然后每次渲染前再对纹理变量进行更新即可,而由于在本发明实施例中,一次可以渲染多个纹理,因此,片段着色器中需要预留足够数量的纹理变量来进行承载,比如,其合并前和合并后的代码具体可以分别如下:合并前:uniformsampler2dinputimagetexture合并后:其中,texture1、texture2、texture3和texture4分别指的是待渲染纹理图1、待渲染纹理图2、待渲染纹理图3、和待渲染纹理图4。204、终端构造与该待渲染纹理图的数量等量的数组,使得不同数组中元素的值不同。例如,该数组具体可以为可变(varying)数组,即终端可以构造与该待渲染纹理图的数量等量的可变数组,其中,每个可变数组包括多个具有相同值的元素,且不同可变数组中元素的值不同。比如,还是以在渲染时所采用的基本图形为“两个三角形”为例(即一个纹理用两个三角形的方式渲染),则该可变数组可以包括6个元素,且同一个可变数组中的6个元素为同一值,比如同为0.5、1.5或2.5等,而不同可变数组中元素的值不同,比如可变数组1中元素的值为0.5,则可变数组2中元素的值需要取除0.5之外的值,如1.5或2.5等。需说明的是,其中,步骤203与204的执行可以不分先后,步骤203在步骤206之前执行即可。205、终端建立所构造的数组与待渲染纹理图之间的一一对应关系,并根据该对应关系,将所有数组按照预设第二数据结构进行组合,得到纹理索引数组;例如,可以如下:终端确定待渲染纹理图的渲染顺序,基于该渲染顺序建立待渲染纹理图与数组之间的一一对应关系,使得渲染顺序在前的待渲染纹理图所对应的数组内元素的值,大于渲染顺序在后的待渲染纹理图所对应的数组内元素的值,然后,根据该对应关系,将所有数组按照预设第二数据结构进行组合,比如,可以以纹理索引的名称,如“a_texindex”为字段名,各个数组为字段内容,构建一数据段,进而得到该纹理索引数组。比如,以待渲染纹理图的渲染顺序为“待渲染纹理图1—>待渲染纹理图2—>待渲染纹理图3”,且数组1、数组2和数组3内元素的值分别为0.5、1.5和2.5为例,则如图2d所示,待渲染纹理图1对应的纹理索引可以为数组1(0.5,0.5,0.5,0.5,0.5,0.5),待渲染纹理图2对应的纹理索引可以为数组2(1.5,1.5,1.5,1.5,1.5,1.5),而待渲染纹理图3对应的纹理索引则可以为数组3(2.5,2.5,2.5,2.5,2.5,2.5),以此类推,等等;在建立了待渲染纹理图与各个数组之间的对应关系之后,便可以根据该对应关系,以“a_texindex”为字段名,以各个数组为字段内容,构建如图2d所示的纹理索引数组。由于该元素的值表示在渲染其中每个三角形时,各个像素的插值结果总是这个值,因此,在片段着色器中,只要知道当前的插值是多少,便可以区分出当前画的是哪个纹理,譬如,如果插值为0.5,则可以确定当前正在渲染的纹理为待渲染纹理图1(简称纹理1),如果插值为1.5,则可以确定当前正在渲染的纹理为待渲染纹理图2(简称纹理2),而如果插值为2.5,则可以确定当前正在渲染的纹理为待渲染纹理图3(简称纹理3),以此类推,等等。其中,片段着色器中执行代码在合并前(即现有技术)和合并后(即本发明实施例)的对比可以如下:合并前:合并后:可见,在本发明实施例中,通过该插值的方式,在单次渲染中,可以通过在片段着色器中更新纹理变量来动态切换当前渲染的纹理,比如从待渲染纹理图1切换到待渲染纹理图2,而无需担心无法区分出当前画的是哪个纹理。206、终端从该纹理索引数组中确定当前纹理索引,并根据该当前纹理索引,从片段着色器所承载的拼接后纹理参数中读取纹理参数,得到目标纹理参数,然后执行步骤207。例如,终端可以从该纹理索引数组中确定当前纹理索引,比如,确定当前纹理索引为待渲染纹理图1的纹理索引“0.5,0.5,0.5,0.5,0.5,0.5”,然后,根据该当前纹理索引,从片段着色器的纹理变量中读取待渲染纹理图1的纹理参数,得到目标纹理参数,再然后,执行步骤207。又例如,若当前纹理索引更新为待渲染纹理图2的纹理索引“1.5,1.5,1.5,1.5,1.5,1.5”,则终端可以根据该当前纹理索引,从片段着色器的纹理变量中读取待渲染纹理图2的纹理参数,并将该读取到的待渲染纹理图2的纹理参数作为新的目标纹理参数,然后执行步骤207,以此类推。207、终端基于目标纹理参数对该待渲染图像进行渲染,并返回执行从该纹理索引数组中确定当前纹理索引的步骤(即返回执行步骤206),直至该多个待渲染纹理图均渲染完毕。例如,终端可以获取目标纹理参数所对应的待渲染纹理图,得到目标纹理图,然后,在显存中,采用该目标纹理图对该待渲染图像进行渲染,比如,如果待渲染图像为人脸图像,而目标纹理图为贴纸“耳朵”,则此时,可以在人脸图像中渲染上贴纸“耳朵”,然后,判断所有待渲染纹理图是否均渲染完毕,若是,则结束流程,可以输出渲染后的图像;若否,则返回执行步骤206,以更新当前纹理索引,并根据更新后的当前纹理索引获取新的待渲染纹理图,比如贴纸“胡须”,再继续将贴纸“胡须”渲染到人脸图像上,以此类推,直至所有待渲染纹理图均渲染完毕为止。其中,在进行渲染之前,需要将待渲染纹理图和待渲染图像加载至显存中,也就是说,在获取目标纹理参数所对应的待渲染纹理图,可以直接从显存中读取。需说明的是,在加载多个待渲染纹理图至显存时,为了避免短时间消耗过多的内存和显存,可以分批和/或分时段对该多个待渲染纹理图进行加载,加载的时机可以根据需求灵活设置,只需在渲染之前即可。同理,待渲染图像的加载时机也只需在渲染之前,具体可以根据实际应用的需求而定。由上可知,本实施例在获取到待渲染图像和多个待渲染纹理图之后,可以对该多个待渲染纹理图的纹理参数进行拼接,以及利用插值机制构造纹理索引数组,然后,根据该纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对该待渲染图像进行渲染,进而达到单次渲染多个纹理的目的;由于该方案只需对纹理参数进行拼接,在需要渲染时才获取相应的待渲染纹理图,而无需预先对多张待渲染纹理图进行合成,因此,现对于现有单次渲染的内容只能是合成后大图中的内容的方案而言,可以灵活地通过调整纹理参数来选择所需渲染的纹理,大大提高其灵活性,而且,由于该方案无需一次性将合成后大图加载至内存和显存中,所以,也可以大大减少内存和显存的占用,改善设备性能。实施例三、为了更好地实施以上方法,本发明实施例还提供一种图像渲染装置,该图像渲染装置具体可以集成在终端等设备中,该终端可以包括手机、平板电脑、笔记本电脑、和个人计算机等设备。例如,如图3a所示,该图像渲染装置可以包括获取单元301、拼接单元302、构造单元303和渲染单元304,如下:(1)获取单元301;获取单元301,用于获取待渲染图像、以及多个待渲染纹理图。其中,每个待渲染纹理图对应的一组纹理参数;每一组纹理参数可以包括至少一个纹理参数,每个纹理参数可以包括渲染时所采用的基本图形的各个顶点的坐标,具体可参见前面的方法实施例,在此不作赘述。(2)拼接单元302;拼接单元302,用于对该多个待渲染纹理图的纹理参数进行拼接,得到拼接后纹理参数。例如,该拼接单元302,具体可以用于确定该多个待渲染纹理图的纹理参数的参数标识,将属于同一参数标识的纹理参数添加至同一参数集合中,得到多个与参数标识对应的参数集合,按照预设第一数据结构对得到的参数集合进行构造,得到拼接后纹理参数。其中,该参数标识指的是用于区分不同参数的信息,比如参数的名称或编号等;比如,以该参数标识具体为参数名称为例,则该拼接后纹理参数具体可以如图1d所示,在此不作赘述。(3)构造单元303;构造单元303,用于按照待渲染纹理图的数量构造纹理索引数组。其中,该纹理索引数组中包括多个纹理索引,纹理索引的数量与待渲染纹理图的数量相对应,且每一纹理索引对应一个待渲染纹理图。该纹理索引数组的构造方法可以有多种,例如,该构造单元303可以包括构造子单元、建立子单元和组合子单元,如下:该构造子单元,可以用于构造与该待渲染纹理图的数量等量的数组,使得不同数组中元素的值不同;例如,具体可以如下:该构造子单元,具体可以用于构造与该待渲染纹理图的数量等量的可变(varying)数组,每个可变数组包括多个具有相同值的元素,且不同可变数组中元素的值不同。比如,还是以在渲染时所采用的基本图形为“两个三角形”为例(即一个纹理用两个三角形的方式渲染),则该可变数组可以包括6个元素,且同一个可变数组中的6个元素为同一值,比如同为0.5等,而不同可变数组中元素的值不同,比如可变数组1中元素的值为0.5,可变数组2中元素的值为1.5,等等。该建立子单元,用于建立所构造的数组与待渲染纹理图之间的一一对应关系;例如,可以如下:该建立子单元,具体用于确定待渲染纹理图的渲染顺序,基于该渲染顺序建立待渲染纹理图与数组之间的一一对应关系,使得渲染顺序在前的待渲染纹理图所对应的数组内元素的值,大于渲染顺序在后的待渲染纹理图所对应的数组内元素的值,具体可参见前面的实施例,在此不作赘述。该组合子单元,用于根据该对应关系,将所有数组按照预设第二数据结构进行组合,得到纹理索引数组,比如,可参见图1e和图2d。(4)渲染单元304;渲染单元304,用于根据该纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对该待渲染图像进行渲染。例如,该渲染单元304可以包括确定子单元、读取子单元和渲染子单元,如下:该确定子单元,可以用于从该纹理索引数组中确定当前纹理索引。该读取子单元,可以用于根据该当前纹理索引从拼接后纹理参数中读取纹理参数,得到目标纹理参数。该渲染子单元,可以用于基于目标纹理参数对该待渲染图像进行渲染,并触发确定子单元执行从该纹理索引数组中确定当前纹理索引的操作,直至该多个待渲染纹理图均渲染完毕。比如,读取子单元具体可以从片段着色器中读取纹理参数,即,在根据该当前纹理索引从拼接后纹理参数中读取纹理参数之前,还可以将拼接后纹理参数载入该片段着色器,因此,如图3b所示,该图像渲染装置还可以包括载入单元305,如下:该载入单元305,可以用于调用片段着色器,并将拼接后纹理参数载入该片段着色器中。例如,该载入单元305,具体可以用于调用片段着色器,在该片段着色器中设置多个纹理变量,将拼接后纹理参数载入该多个纹理变量中。则此时,该读取子单元,具体可以用于根据该当前纹理索引,从片段着色器所承载的拼接后纹理参数中读取纹理参数,得到目标纹理参数。例如,该读取子单元,具体可以用于根据该当前纹理索引,从该多个纹理变量中读取纹理参数,得到目标纹理参数。该渲染子单元,具体可以用于获取目标纹理参数所对应的待渲染纹理图,得到目标纹理图,在显存中,采用该目标纹理图对该待渲染图像进行渲染。其中,在进行渲染之前,需要将待渲染纹理图和待渲染图像加载至显存中,即如图3b所示,该图像渲染装置还可以包括加载单元306,如下:该加载单元306,用于将该多个待渲染纹理图加载至显存,以及,将该待渲染图像加载至显存。则此时,该渲染子单元,具体可以用于从显存中获取目标纹理参数所对应的待渲染纹理图,得到目标纹理图。需说明的是,在加载多个待渲染纹理图至显存时,为了避免短时间消耗过多的内存和显存,加载单元306可以分批和/或分时段对该多个待渲染纹理图进行加载,加载的时机可以根据需求灵活设置,只需在渲染之前即可。同理,待渲染图像的加载时机也只需在渲染之前,具体可以根据实际应用的需求而定。具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元的具体实施可参见前面的方法实施例,在此不作赘述。由上可知,本实施例的图像渲染装置在获取到待渲染图像和多个待渲染纹理图之后,可以由拼接单元302对该多个待渲染纹理图的纹理参数进行拼接,以及由构造单元303按照待渲染纹理图的数量构造纹理索引数组,然后,由渲染单元304根据该纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对该待渲染图像进行渲染,进而达到单次渲染多个纹理的目的;由于该方案只需对纹理参数进行拼接,在需要渲染时才获取相应的待渲染纹理图,而无需预先对多张待渲染纹理图进行合成,因此,现对于现有单次渲染的内容只能是合成后大图中的内容的方案而言,可以灵活地通过调整纹理参数来选择所需渲染的纹理,大大提高其灵活性,而且,由于该方案无需一次性将合成后大图加载至内存和显存中,所以,也可以大大减少内存和显存的占用,改善设备性能。实施例四、相应的,本发明实施例还提供一种终端,如图4所示,该终端可以包括射频(rf,radiofrequency)电路401、包括有一个或一个以上计算机可读存储介质的存储器402、输入单元403、显示单元404、传感器405、音频电路406、无线保真(wifi,wirelessfidelity)模块407、包括有一个或者一个以上处理核心的处理器408、以及电源409等部件。本领域技术人员可以理解,图4中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:rf电路401可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器408处理;另外,将涉及上行的数据发送给基站。通常,rf电路401包括但不限于天线、至少一个放大器、调谐器、一个或多个振荡器、用户身份模块(sim,subscriberidentitymodule)卡、收发信机、耦合器、低噪声放大器(lna,lownoiseamplifier)、双工器等。此外,rf电路401还可以通过无线通信与网络和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(gsm,globalsystemofmobilecommunication)、通用分组无线服务(gprs,generalpacketradioservice)、码分多址(cdma,codedivisionmultipleaccess)、宽带码分多址(wcdma,widebandcodedivisionmultipleaccess)、长期演进(lte,longtermevolution)、电子邮件、短消息服务(sms,shortmessagingservice)等。存储器402可用于存储软件程序以及模块,处理器408通过运行存储在存储器402的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器402可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据终端的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器402可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器402还可以包括存储器控制器,以提供处理器408和输入单元403对存储器402的访问。输入单元403可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,在一个具体的实施例中,输入单元403可包括触敏表面以及其他输入设备。触敏表面,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面上或在触敏表面附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器408,并能接收处理器408发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面。除了触敏表面,输入单元403还可以包括其他输入设备。具体地,其他输入设备可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。显示单元404可用于显示由用户输入的信息或提供给用户的信息以及终端的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元404可包括显示面板,可选的,可以采用液晶显示器(lcd,liquidcrystaldisplay)、有机发光二极管(oled,organiclight-emittingdiode)等形式来配置显示面板。进一步的,触敏表面可覆盖显示面板,当触敏表面检测到在其上或附近的触摸操作后,传送给处理器408以确定触摸事件的类型,随后处理器408根据触摸事件的类型在显示面板上提供相应的视觉输出。虽然在图4中,触敏表面与显示面板是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可以将触敏表面与显示面板集成而实现输入和输出功能。终端还可包括至少一种传感器405,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板的亮度,接近传感器可在终端移动到耳边时,关闭显示面板和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于终端还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。音频电路406、扬声器,传声器可提供用户与终端之间的音频接口。音频电路406可将接收到的音频数据转换后的电信号,传输到扬声器,由扬声器转换为声音信号输出;另一方面,传声器将收集的声音信号转换为电信号,由音频电路406接收后转换为音频数据,再将音频数据输出处理器408处理后,经rf电路401以发送给比如另一终端,或者将音频数据输出至存储器402以便进一步处理。音频电路406还可能包括耳塞插孔,以提供外设耳机与终端的通信。wifi属于短距离无线传输技术,终端通过wifi模块407可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图4示出了wifi模块407,但是可以理解的是,其并不属于终端的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。处理器408是终端的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器402内的软件程序和/或模块,以及调用存储在存储器402内的数据,执行终端的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器408可包括一个或多个处理核心;优选的,处理器408可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器408中。终端还包括给各个部件供电的电源409(比如电池),优选的,电源可以通过电源管理系统与处理器408逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源409还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。尽管未示出,终端还可以包括摄像头、蓝牙模块等,在此不再赘述。具体在本实施例中,终端中的处理器408会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器402中,并由处理器408来运行存储在存储器402中的应用程序,从而实现各种功能:获取待渲染图像、以及多个待渲染纹理图,其中每个待渲染纹理图对应的一组纹理参数;对该多个待渲染纹理图的纹理参数进行拼接,得到拼接后纹理参数;按照待渲染纹理图的数量构造纹理索引数组;根据该纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对该待渲染图像进行渲染。例如,具体可以确定该多个待渲染纹理图的纹理参数的参数标识,将属于同一参数标识的纹理参数添加至同一参数集合中,得到多个与参数标识对应的参数集合,按照预设第一数据结构对得到的参数集合进行构造,得到拼接后纹理参数。以及,构造与该待渲染纹理图的数量等量的数组,使得不同数组中元素的值不同,然后建立所构造的数组与待渲染纹理图之间的一一对应关系,根据该对应关系,将所有数组按照预设第二数据结构进行组合,得到纹理索引数组;此后,便可以从该纹理索引数组中确定当前纹理索引,根据该当前纹理索引从拼接后纹理参数中读取纹理参数,得到目标纹理参数,基于目标纹理参数对该待渲染图像进行渲染,并返回执行从该纹理索引数组中确定当前纹理索引的步骤,直至该多个待渲染纹理图均渲染完毕。以上各个操作的具体实施可参见前面的实施例,在此不作赘述。由上可知,本实施例的终端在获取到待渲染图像和多个待渲染纹理图之后,可以对该多个待渲染纹理图的纹理参数进行拼接,以及按照待渲染纹理图的数量构造纹理索引数组,然后,根据该纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对该待渲染图像进行渲染,进而达到单次渲染多个纹理的目的;由于该方案只需对纹理参数进行拼接,在需要渲染时才获取相应的待渲染纹理图,而无需预先对多张待渲染纹理图进行合成,因此,现对于现有单次渲染的内容只能是合成后大图中的内容的方案而言,可以灵活地通过调整纹理参数来选择所需渲染的纹理,大大提高其灵活性,而且,由于该方案无需一次性将合成后大图加载至内存和显存中,所以,也可以大大减少内存和显存的占用,改善设备性能。实施例五、本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一计算机可读存储介质中,并由处理器进行加载和执行。为此,本发明实施例提供一种存储介质,其中存储有多条指令,该指令能够被处理器进行加载,以执行本发明实施例所提供的任一种图像渲染方法中的步骤。例如,该指令可以执行如下步骤:获取待渲染图像、以及多个待渲染纹理图,其中每个待渲染纹理图对应的一组纹理参数;对该多个待渲染纹理图的纹理参数进行拼接,得到拼接后纹理参数;按照待渲染纹理图的数量构造纹理索引数组;根据该纹理索引数组依次从拼接后纹理参数中读取纹理参数,并基于读取到的纹理参数对该待渲染图像进行渲染。例如,该指令可以执行如下步骤:确定该多个待渲染纹理图的纹理参数的参数标识,将属于同一参数标识的纹理参数添加至同一参数集合中,得到多个与参数标识对应的参数集合,按照预设第一数据结构对得到的参数集合进行构造,得到拼接后纹理参数。以及,构造与该待渲染纹理图的数量等量的数组,使得不同数组中元素的值不同,然后建立所构造的数组与待渲染纹理图之间的一一对应关系,根据该对应关系,将所有数组按照预设第二数据结构进行组合,得到纹理索引数组;此后,便可以从该纹理索引数组中确定当前纹理索引,根据该当前纹理索引从拼接后纹理参数中读取纹理参数,得到目标纹理参数,基于目标纹理参数对该待渲染图像进行渲染,并返回执行从该纹理索引数组中确定当前纹理索引的步骤,直至该多个待渲染纹理图均渲染完毕。以上各个操作的具体实施可参见前面的实施例,在此不再赘述。其中,该存储介质可以包括:只读存储器(rom,readonlymemory)、随机存取记忆体(ram,randomaccessmemory)、磁盘或光盘等。由于该存储介质中所存储的指令,可以执行本发明实施例所提供的任一种图像渲染方法中的步骤,因此,可以实现本发明实施例所提供的任一种图像渲染方法所能实现的有益效果,详见前面的实施例,在此不再赘述。以上对本发明实施例所提供的一种图像渲染方法、装置和存储介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1