纹理处理方法和装置与流程

文档序号:15274685发布日期:2018-08-28 22:50阅读:1076来源:国知局

本发明涉及图像处理领域,特别涉及一种纹理处理方法和装置。



背景技术:

在图像处理的3d渲染中,一般都会通过大量应用大纹理来提升表现力,但精细的纹理也相应带来大的内存开销。目前纹理的常用格式主要有bmp,tga,png,jpg,dds,tif,gif,exr等等,这些数据需要通过cpu软解压成相应的像素格式(如a8r8g8b8),转送到gpu端来进行使用。一张1024*1024大小的a8r8g8b8纹理格式,一般需要4m容量(设置mipmap,会增加33%大小)。mipmap是在三维图形的贴图渲染中的一个常用的技术,为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为mipmap。mipmap需要占用一定的内存空间,同时也遵循小波压缩规则。为了丰富3d模型表现,同时保证最小失真,压缩纹理格式应运而生。

基于opengles的压缩纹理格式主要有etc1和pvrtc,分别为安卓设备和ios设备所支持,由于etc1压缩纹理不支持alpha通道,这给压缩纹理的使用带来很大的麻烦。

对于这个技术问题,现有的解决方案主要有:

(1).对于一些小规模应用,因为本身对内存要求就不高,所以无需处理。

(2).对于一些中等或大规模的应用,为了展现丰富的画面,会大量的使用高精度的纹理.在这种情况,有些应用会选择性的对不带alpha通道的纹理,即不透明纹理,进行压缩,但对透明的纹理就无能为力。

下面对仅处理不透明纹理,忽略对透明纹理的处理进行说明。在应用中,往往包含大量的透明纹理,因为如果不使用透明纹理的话,意味着,美术要做更多的工作。

按3d渲染的纹理混合方式分,

1)alphatest

一个模型mesh(比如铁丝网),用alphatest混合方式,一张纹理(texture)和一个四边形模型网格(mesh)就可以实现.镂空和铁丝部分用不同的alpha值标识出来,如果不使用alpha通道,那么美术需要认真勾边,需要对铁丝建模,这显然没必要的。

2)alphablend

模型网格mesh的一小部分或整体,需要和背景去混合,比如一块毛玻璃,本发明人眼可以看到其背后的模糊的物体,就是相当于毛玻璃和后面物体产生混合后的效果。

常用的混合效果是blendsrcalpha1-scralpha,即如果毛玻璃a=0.3,颜色是(r,g,b),背景颜色是(r’,g’,b’),则最终颜色是(r,g,b)*0.3+(r’,g’,b’)*(1–0.3)。

而美术建模时,是没办法对这种透明效果进行建模的。

(3).同上,但对透明的纹理进行处理,通过修改着色器(shader),将一张rgba(透明纹理),分离出rgb纹理和alpha纹理.处理时,对两张图进行采样,从而得到原透明纹理的所有信息。着色器又叫shader,指一组供计算机图形资源在执行渲染任务时使用的指令,用于计算图像的颜色或明暗。

下面对支持考虑了透明纹理的处理进行说明,现有的方法中,主要的做法是:rgb和alpha纹理分离处理,然后安卓和ios设备都使用相同策略,该方法下,ios设备内存开销增加一倍。

rgb和alpha分离,分离出的rgb是以png格式保存的。这里所存在的问题在于,其一,png格式有其局限性。在3d渲染的实践中,进行混合测试中发现,对于blendsrcalpha,one的模式下,png和tga在应用纹理压缩后,差异不大,但对于之外的混合方式,tga得到最终效果要远好于png纹理。比如,应用中如果运用了相当部分的粒子效果,使用alphablend模式的粒子shader,使用png来压缩,最终会明显降低画面表现。其二,由于分离出的alpha纹理以固定的纹理格式保存,客观上限定了纹理的命名规则。同一目录文件下,如果存在t.png和t.tga,那么分离出的alpha纹理,最终只存在一张t_alpha.png。客观上造成t.png和t.tga有一张alpha纹理被覆盖,必然造成渲染错误。如果项目处于开发中后期,要修正这个问题,可能最容易想到的处理方案,是去改名,但这种代价是很大的,因为纹理的加载不仅仅是静态加载的,也可能是通过动态加载的。

这种rgb和alpha分离,其采样方法的修改大致如下:

由于该方法在修改时,是对纹理采样分成2次来做,这意味着对于复杂的shader,在做这样的修改时,需要去主动解读shader,进行拆解,以完对该纹理的正确采样。比如:

half4c=lerp(tex2d(diffusetex,uv),half4(0.3,0.5,0.2,1.0),0.3)*_tintcolor;

最后,现有技术下,遇到无法解决的渲染错误,事实上会导致shader数量的增加.比如一份a.shader是对rgb纹理采用且对alpha纹理采样并取alpha信息,另一份相同功能的a_1.shader是因为rgba纹理不压缩纹理,这是很常见的,比如某纹理x在应用时可以采用rgb和a分离技术,这时会使用a.shader,如果有纹理y用作rtt等渲染技术,这时就会用回a_1.shader,其纹理将不进行压缩。所以这种情况下,会对shader的使用带来一定的混乱,更重要的是,过多的shader执行对应用整体的渲染效率带来负面影响。

在现有技术方案中,由于增加了不必要的i/o操作,同时容错性差,也无法进行试错,加大流水线操作难度。在安卓下,由于rgba被分离成rgb和alpha,然后压缩处理,此时shader是读取两张纹理来进行采样的。如果ios或其它平台使用支持alpha通道的压缩方式,可能有两种解决方法:第一种方法,需要进行纹理合成,同时修改shader。这种方式下首先rgb和a合并为rgba,同时需要删除alpha操作,且操作严格按照次序,容错性差;另外如果想查看支持alpha通道的压缩纹理的效果,无法实现,因为alpha被分离出去了。第二种方法,分别维护两个工程,代价更大,需要处理好同步问题,维护麻烦。

在纹理压缩之后,后续也存在着一些问题,在应用的后期开发过程中,ui界面改动很频繁,当一张纹理贴图集(纹理atlas)压缩为etc1格式后,其alpha信息丢失了,以后更新或是增加其它图标后,生成的纹理atlas不正确,unity的atlas生成工具主要有ngui和ugui,后者是引擎接管该工作,通过程序给纹理带上标识,然后自动生成纹理atlas。其他第3方工具,如texturepack,因为资源更新没有和引擎结合起来,操作自然麻烦些。tga文件的压缩后,在用于alpha混合时,效果好过png格式,也需要有相应的工具来完成批量替换,让材质球指向替换后的tga纹理。

这些解决方案都存在着巨大的问题,只能对部分纹理做些局部应用。一方面由于没做全盘考量,无法形成流水性操作,只能进行固化操作,对压缩方案也没有可选择性;另一方面因为没有考虑到纹理压缩对应用开发的影响,对于应用纹理压缩后,常规技术失效(比如rtt,rendertotexture,渲染到纹理技术),以及渲染出错,这就极大限制了纹理压缩的使用,最后,由于不正确的处理方法,也会给纹理管理带来很大的混乱。



技术实现要素:

本发明的目的在于提供纹理处理方法和装置,通过判断每个待处理纹理是否需要分离alpha信息来进行对应的压缩处理,从而无论是哪个平台下都可定制纹理压缩方案,提高了纹理压缩效率,节约了开发成本。

为解决上述技术问题,本发明的第一实施方式公开了一种纹理处理方法,通过判断每个待处理纹理是否需要分离alpha信息来进行对应的压缩处理,该方法包括以下步骤:

获取项目中所有纹理的获取步骤;

设置压缩参数,从所有纹理中挑选出需要进行压缩处理的待处理纹理的挑选步骤;

根据压缩参数,判断每个待处理纹理是否需要分离alpha信息,对于不需要分离alpha信息的每个待处理纹理,进行自适应纹理压缩,对于需要分离alpha信息的每个待处理纹理,生成包含了alpha信息的对应的alpha纹理之后再进行纹理压缩的压缩步骤;以及

将压缩步骤所得到的所有纹理进行打包的打包步骤。

本发明的第二实施方式还公开了一种纹理处理装置,包括:

获取单元,用于获取项目中所有纹理;

挑选单元,用于设置压缩参数,从所有纹理中挑选出需要进行压缩处理的待处理纹理;

压缩单元,用于根据压缩参数,判断每个待处理纹理是否需要分离alpha信息,对于不需要分离alpha信息的每个待处理纹理,进行自适应纹理压缩,对于需要分离alpha信息的每个待处理纹理,生成包含了alpha信息的对应的alpha纹理之后再进行纹理压缩;以及

打包单元,用于将压缩单元所得到的所有纹理进行打包。

本发明实施方式与现有技术相比,主要区别及其效果在于:

通过判断每个待处理纹理是否需要分离alpha信息来进行对应的压缩处理,从而无论是哪个平台下都可定制纹理压缩方案,提高了纹理压缩效率,节约了开发成本。

进一步地,在各运行平台都进行压缩步骤,还对压缩步骤所得到的所有纹理进行检测,一旦出现压缩问题,都可以在打包之前将问题处理,避免打包出错。

进一步地,在挑选步骤中,不将有特定画质要求的纹理选为待处理纹理,进一步提高了压缩的精确度。

附图说明

图1是本发明第一实施方式中一种纹理处理方法的流程示意图。

图2是本发明第一实施方式的一个实例的流程示意图。

图3是本发明第二实施方式中一种纹理处理装置的结构示意图。

具体实施方式

在以下的叙述中,为了使读者更好地理解本申请而提出了许多技术细节。但是,本领域的普通技术人员可以理解,即使没有这些技术细节和基于以下各实施方式的种种变化和修改,也可以实现本申请各权利要求所要求保护的技术方案。

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明的实施方式作进一步地详细描述。

本发明第一实施方式涉及一种纹理处理方法。图1是该纹理处理方法的流程示意图。

具体地说,该纹理处理方法通过判断每个待处理纹理是否需要分离alpha信息来进行对应的压缩处理,从而无论是哪个平台下都可定制纹理压缩方案,提高了纹理压缩效率,节约了开发成本。如图1所示,该纹理处理方法包括以下步骤:

在步骤s101中,获取项目中所有纹理。获取的纹理的格式包括但不限于png格式和tga格式。

此后进入步骤s102,设置压缩参数,从所有纹理中挑选出需要进行压缩处理的待处理纹理。这里的压缩参数可以根据需要设置任意的参数,包括但不限于:压缩格式、压缩质量、最大压缩尺寸、npot适配方式等等。压缩格式例如有etc_rgb4,etc2_rgb4,etc2_rgb4_punchthro,etc2_rgba8,pvrtc_rgb2,pvrtc_rgba2,pvrtc_rgb4,pvrtc_rgba4等等。压缩质量主要涉及纹理压缩后效果,压缩越快,则质量越差。npot是指如果纹理不符合2的次幂大小,指示应该如何去扩展到pot,这个影响压缩后的像素大小。纹理压缩是一种有损压缩,会降低画质,对于涉及渐变效果的纹理或是精度要求很高的纹理,如果压缩后效果无法接受,则需要进行排外过滤设置,告诉转换工具,无需对该纹理进行压缩处理。一个典型的例子,模型的法线贴图(normalmap,一般不含alpha通道),比如压缩为etc_rgb4,则会降低高光计算效果,经实验,一张1024x1024大小的纹理,其法线贴图调整到512x512,压缩格式设成rgb24比较合适。本实施方式的做法是,自动识别这些用作法线贴图,进行默认处理,对于其他排外,则按效果来设置。

此后进入步骤s103,根据压缩参数,判断每个待处理纹理是否需要分离alpha信息,对于不需要分离alpha信息的每个待处理纹理,进行自适应纹理压缩,对于需要分离alpha信息的每个待处理纹理,生成包含了alpha信息的对应的alpha纹理之后再进行纹理压缩。在压缩步骤中所进行的自适应纹理压缩是指,对于包含alpha信息的待处理纹理进行支持alpha通道的压缩,对于不包含alpha信息的待处理纹理进行不支持alpha通道的压缩。选择支持alpha压缩的纹理压缩格式,应该对纹理进行自适应压缩;不支持的,则不需要适配。比如指定etc2_rgb4_punchthro,etc2_rgba8等,则需要检测被压缩的纹理是否含有alpha通道,如果没有,则要按etc_rgb4来进行压缩。对于支持alpha压缩的纹理压缩格式,是不需要分离alpha纹理的,但如果在设置的平台中,有一种设置的纹理压缩格式是不支持alpha通道压缩的,则需要先分离alpha纹理。对于支持alpha压缩的纹理压缩格式,并不意味着这种方式是最佳的.比如iphone下按pvrtc_rgba4来进行压缩。最终还是要看效果来取舍.比如在unity3d中,其4.x版本,按这种格式来压缩,纹理质量可以接受,但在5.x版本,纹理质量比较差。

在进行纹理压缩的同时,还统计shader并修改shader。根据压缩配置,决定需要将用到的shader修改为支持etc1版本(即支持alpha分离)。接下来替换内置shader,内置shader因为在缓冲中,无法改变,所以一般会让指向自己实现的功能相同的shader。先搜集项目工程中所有的shader,把shader名称和路径记录在字典中,然后遍历材质球(material),然后material指向的shader全部指向字典记录下并生成功的shader。然后修改材质球,对于etc1版本的shader,第2张纹理需要赋值,用来提供alpha值,这个操作批量自动完成。接下来切换shader/ect1shader,先确认各平台下纹理压缩方案,先处理需要alpha纹理存在的平台,然后切换到不需要alpha纹理的平台,并切换etc1shader为普通shader(即shader中不会多出xx_alpha属性)。

按照以下步骤来进行切换。

(1)生成etc1shader

对于任一个shader,如果是固定管线,则手工处理;否则利用工具,列出所有纹理属性,然后打上透明标识。有了这些额外信息,接着就可以读取要改写的shader,解析shader属性,如果有透明纹理,则增加alpha纹理属性,同时加上一个useetc标识。用tex2d_etc1方法取代tex2d,完成对纹理的采样,再保存shader。

tex2d_etc1方法,可以作为内置函数添加到shader中,也可以写入.cginc文件中,方便复用。后者,在对shader属性解析时,则需要收集属性值,实现复杂度稍高些。

(2)etc1shader与shader相互转换

先遍历所有shader,再读取shader,然后解析属性,是否不存在useetc标识,跳过。用正则表达式去匹配属性,然后注释/反注释多出的属性,并修改tex2d函数,保存shader。

此后进入步骤s104,将压缩步骤所得到的所有纹理进行打包。

此后结束该流程。

可选地,在各运行平台都进行压缩步骤,在打包步骤之前,纹理处理方法还包括对压缩步骤所得到的所有纹理进行检测的检测步骤,该检测步骤包括以下子步骤:遍历每个被压缩后的纹理;搜索包含了alpha信息的alpha纹理;搜索与每个alpha纹理对应的待处理纹理;查看与每个alpha纹理对应的待处理纹理的赋值是否正确;查看是否存在未被压缩的纹理;根据打包的运行平台删除多余的alpha纹理;以及统计所有出错信息。由此一来,一旦出现压缩问题,都可以在打包之前将问题处理,避免打包出错。各运行平台包括但不限于:ios平台,安卓平台,wp平台,playstation平台,xbox平台等等。

综上所述,以往的常见的解决方案是rgb+rgb(用来表示alpha信息),即两张不透明的贴图,来表达一张透明贴图。本发明的实施方式提出的解决方案是:rgba+rgb(用来表示alpha信息),因为rgba在转etc1时候,alpha信息丢失,可以靠第2张rgb不透明贴图来补足,现有的处理方法往往单独分理出一张rgb,费时费力;而在ios环境下,因为rgba已然包含alpha信息,所以可充分发挥pvrtc的压缩优势,不需要多出的alpha纹理。

也就是说,以往的shader修改的采样方法如下,

float4c=tex2d(maintex,uv);

c.a=tex2d(subtex,uv).r;//通常是灰度图,取r,g,b任意通道即可

该方案下,专门准备一张贴图,用来保存alpha信息,因为shader默认是对两张纹理进行采样,所以仅为了满足少数平台(主要是安卓),而对于那些支持alpha压缩的平台,就没有任何优势.看上去可行,实际上是不可取的。

与此相对的是,本发明的实施方式的采样方法是:

half4c=tex2d(maintex,uv);

halfp=tex2d(subtex,uv).r;//通常是灰度图,取任意通道即可

c.a=min(c.a,p);

该方法的优点是:可在任意平台下,根据需要设置成合适的纹理,不管有没有alpha贴图提供,都可正常显示,最重要的是,避免存在两份功能相同,但仅采样方法的shader。

本发明又进一步把它内置到u3d里,这种做法也大大简化了对于第3方和内置shader的修改,可以顺利无错的替换,从而修改成etc1版本的shader(即shader属性中多出一张alpha纹理)。

修改shader的原则是,如果采用u3d自带的surfshader,则需要把它的自定义的语法,改成opengl的语法,否则会造成etc1版本shader显示效果不正确。对于ngui的shader,按本实施方式的方式修改完后,需要处理图集atlas。因为图集etc1后,alpha信息丢失,在更新图集时,就需要修改ngui,使它在重打图集前,先恢复原有的alpha信息,否则生成的图集是不正确的。

而在shader的功能扩展上,由于在项目中,内置shader自身功能太弱,美术往往通过大量的纹理堆彻来达到想要效果,本发明的实施方式扩展了内置shader的功能,使之不需要堆彻,即可达到目的。而在特效表现上,本发明的实施方式通过新增shader,主要是为了复用纹理和提高渲染效率,从根源上解决纹理的赖用问题。

以下用一个实例来对本发明的该实施方式进行说明。

图2示出了这个实例的流程示意图。

1)获取纹理。从项目中获得纹理item001.png到item512.png,item001.tga到item003.tga。

2)挑选纹理。设置压缩参数,排外目录。经过挑选,item002.png和item003.tga被排除,而其余所有纹理都被选择。

3)判断是否生成alpha纹理。为挑选出的且判断有必要生成alpha纹理的纹理生成alpha纹理item001_alpha.png,item003_alpha.png到item512_alpha.png,item001_alpha.tga到item002_alpha.tga。

4)进行各平台压缩。安卓下为etc_rgb4。ios下透明纹理为为pvrtc_rgba4,不透明纹理为pvrtc_rgb4,如果存在alpha纹理则删除。

本发明的各方法实施方式均可以以软件、硬件、固件等方式实现。不管本发明是以软件、硬件、还是固件方式实现,指令代码都可以存储在任何类型的计算机可访问的存储器中(例如永久的或者可修改的,易失性的或者非易失性的,固态的或者非固态的,固定的或者可更换的介质等等)。同样,存储器可以例如是可编程阵列逻辑(programmablearraylogic,简称“pal”)、随机存取存储器(randomaccessmemory,简称“ram”)、可编程只读存储器(programmablereadonlymemory,简称“prom”)、只读存储器(read-onlymemory,简称“rom”)、电可擦除可编程只读存储器(electricallyerasableprogrammablerom,简称“eeprom”)、磁盘、光盘、数字通用光盘(digitalversatiledisc,简称“dvd”)等等。

本发明第二实施方式涉及一种纹理处理装置。图3是该文本处理装置的结构示意图。本发明的实际结构可以根据实际需要做出必要的调整,并不局限于图3中的结构。

具体地说,纹理处理装置通过判断每个待处理纹理是否需要分离alpha信息来进行对应的压缩处理,从而无论是哪个平台下都可定制纹理压缩方案,提高了纹理压缩效率,节约了开发成本。如图3所示,该纹理处理装置100包括:

获取单元101,用于获取项目中所有纹理;

挑选单元102,用于设置压缩参数,从所有纹理中挑选出需要进行压缩处理的待处理纹理;

压缩单元103,用于根据压缩参数,判断每个待处理纹理是否需要分离alpha信息,对于不需要分离alpha信息的每个待处理纹理,进行自适应纹理压缩,对于需要分离alpha信息的每个待处理纹理,生成包含了alpha信息的对应的alpha纹理之后再进行纹理压缩;以及

打包单元104,用于将压缩单元所得到的所有纹理进行打包。

可选地,纹理处理装置100还包括:

检测单元,用于对压缩单元所得到的所有纹理进行检测。

第一实施方式是与本实施方式相对应的方法实施方式,本实施方式可与第一实施方式互相配合实施。第一实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在第一实施方式中。

需要说明的是,本发明各设备实施方式中提到的各单元都是逻辑单元,在物理上,一个逻辑单元可以是一个物理单元,也可以是一个物理单元的一部分,还可以以多个物理单元的组合实现,这些逻辑单元本身的物理实现方式并不是最重要的,这些逻辑单元所实现的功能的组合才是解决本发明所提出的技术问题的关键。此外,为了突出本发明的创新部分,本发明上述各设备实施方式并没有将与解决本发明所提出的技术问题关系不太密切的单元引入,这并不表明上述设备实施方式并不存在其它的单元。

需要说明的是,在本专利的权利要求和说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

虽然通过参照本发明的某些优选实施方式,已经对本发明进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。

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