由于近期在开发者群里发现一些开发者对纹理压缩不太理解,遇到一些使用上的问题,所以本次文章中对纹理压缩进行详细的说明和使用上的介绍,希望能对有需求的开发者带来帮助。
本篇文章已经先更新到官网的文档中,也欢迎大家保持对官网文档的关注
一、初识纹理压缩
纹理是指物体表面的纹路样式和细腻程度等外观效果。在计算机图形学中,常用于描述三维模型表面图案的二维图形。
我们日常见到和使用的图片格式,主要为PNG和JPG,虽然在三维和二维的某些情况下,也会把这些图片称为纹理,但他们并不是纹理格式,不能被GPU直接读取并显示。因此,这些图片文件要先经过CPU解码成纹理格式,再传送到GPU进行使用。
而纹理格式,自然就是可以被GPU直接读取并显示的格式。所以,一方面,避免CPU解码可以减少运算带来的性能压力。另一方面,就是直接读取并渲染,也可以避免图像解压到内存的占用开销。
那纹理格式有哪些?在移动端,Android平台的主流纹理格式是ETC(Ericsson Texture Compression),iOS平台的主流纹理格式是PVRTC(PowerVR Texture Compression)。
需要特别说明的是,ETC1是不支持透明通道的,PVRTC是支持透明通道的,尽管在ETC2的时候,补全了ETC1不支持的透明通道,但是ETC2需要在OpenGL ES 3.0(对应webGL 2.0 )的环境下,而当前尚未全面普及,所以LayaAir引擎及工具也只支持了ETC1的纹理压缩。未来,当小游戏平台大多数都支持webGL 2.0后,我们也会跟进支持ETC2。
二、使用纹理压缩功能要注意的几个问题
尽管前文中描述了纹理压缩的好处,但我们如果不能充分的认知,做好准备。未必可以达到想要的效果。
2.1、纹理压缩的源图宽高规范
由于不同系统平台对纹理格式的宽高像素要求不同,所以纹理压缩的源图(PNG\JPG)也要按规范做出对应的设计,否则就可能会导致拉伸变形。
这里,我们先看一下错误的示例。
图1 左侧是一张宽高为512*313
的PNG图像,右侧是通过LayaAir引擎提供的纹理压缩工具导出的PVRTC格式图像。
(图1)
很明显,在运行后,纹理压缩后的图像被拉伸了。这就是由于iOS系统下,纹理压缩格式必须宽高相等且为2的幂次方。即便Android系统不需要纹理宽高相等,但宽高也必须是2的幂次方,否则工具也会自动强行拉伸。所以,美术在设计之初,就要沟通确认好哪些需要进行纹理压缩,然后将需要纹理压缩的源图按平台规范进行调整。
2.2、LayaAirIDE与LayaAir Unity插件的差异
LayaAirIDE中的纹理压缩工具 与 LayaAir Unity插件中的纹理压缩工具在使用的时候,还是有所区别的,大家需要注意,下面分别进行介绍。
2.2.1 LayaAir Unity插件纹理压缩功能
在LayaAir Unity插件,资源发布平台的选项中,每一个选项在导出后,会对应一个独立的完整目录,如图2所示。每一个目录内都有着完整的导出资源,只是纹理资源与相关路径信息的差异。
(图2)
Conventional
图2中的Conventional这个选项是常规的导出方式,导出对应的目录内不会有任何纹理压缩的文件格式,原来的是JPG还是JPG,是PNG仍是PNG。用于发布web版和PC浏览器上调试效果。
JPG质量的参数设置是指在导出JPG格式图时的压缩比,100为最高。如果原图已经处理好,不想再改变质量,那就设置100。