纹理压缩介绍DXT PVR等
为什么需要纹理压缩?
移动纹理压缩格式
干货:Unity游戏开发图片纹理压缩方案
Creator使用压缩纹理。
常用的纹理和纹理压缩格式
面向移动设备的纹理压缩方案
各种移动GPU压缩纹理的使用
纹理在软件开发中随处可见,尤其是在3D应用中,但由于网络环境和硬件能力的原因,它也是一个瓶颈。而且在一般的三维应用中,纹理的大小基本都在1/2以上,在模型中往往超过2/3。也许你会说,质感不就是一张图吗?有那么重要吗?下面两张对比图,你可能觉得前者太高了,但对于正常人来说,后者显然好很多。正是纹理给骨骼赋予了皮肤,使得我们的应用更加真实,更加贴近现实。
你能想象吗?上面的模型1 * * *有三个纹理,其中一个有如下效果:
纹理拼接是纹理压缩的开始,不同的压缩方式对纹理最终大小的影响也是显著的。比如上面的纹理在不同压缩格式下的大小差异也非常显著(原文件为tga格式,通过Photoshop转换为其他格式,默认选项):
与png、jgp等硬盘压缩方式不同,DXT、ETC等纹理压缩方式在游戏运行过程中无需CPU解压,直接由GPU采样,可以大大减少内存和带宽的占用,提高运行效率,尤其适用于手机游戏。
1.DXT
DXT是微软Direct支持的一种有损纹理压缩算法。DXT的格式有DXT1~DXT5,其中DXT1和DXT5比较常见,后面会详细讨论。可以说DXT是目前应用最广泛的纹理压缩格式,所有的PC端显卡都可以支持DXT压缩。根据维基百科,该专利的有效期至2017 10 2月2日。
DXT算法非常容易理解,整体效果看起来不错。但是如果你把一部分封闭起来,你会发现会有很多细节丢失,这也是算法本身造成的。毕竟每个块只有两种颜色,其他颜色就是这两种颜色的区别。如果当前区域有其他显著的颜色,它将丢失。
另一个问题是DXT3和DXT5的对比度。与不支持透明(但支持透明)的DXT1相比,DXT5大了一倍(多了64位)。和之前的色彩保存方案一样,也保存了两种16位的颜色和对应的调色板进行透明,保证了在RGBA上的效果,但是DXT3的思路不同。它为每个像素节省了4bit的透明度,也多了64bit,但此时毕竟只有16个透明度选项。与DXT5相比,压缩比相同,但对透明色的处理不够细腻,实用性上不推荐DXT3。
虽然DXT在细节上有明显的瑕疵,但整体效果还是不错的,确实是一种很强大的压缩方式,所以是大多数纹理压缩选择中的最优方案,几乎可以算是PC下的标准压缩格式。
2.PVR & amp;等等
也许从专利和商业的角度来看,也许DXT在移动端达不到要求是真的。DXT在移动端没有得到很大的支持。相反,它支持iOS设备中的PVR压缩和Android中的ETC压缩。
DXT在细节上有明显的缺陷。最重要的原因是当纹理被划分成4*4像素的区域块时,每个块都是独立的。虽然这极大地简化了压缩算法,但它失去了相邻块之间的这种普遍相似性。这是算法本身造成的,PVR会考虑区域块对应的右下右下三个区域块的相关性。
从现实的角度来看,受制于专利和硬件厂商,我们没有太多的选择。Android下我们会用ETC,iOS下只用PVR,PC上没有DXT估计会被嘲讽。但是,这也是一个很难的问题。比如在WebGL下,尤其是Android下,差别很大。支持纹理压缩吗?即使在同一设备的不同浏览器中,因为驱动不一致,系统可能支持ETC压缩,但不支持微信等QQ浏览器。而且华为手机在浏览器层面似乎不支持ETC(硬件支持或者驱动问题)。如果在移动设备上不需要压缩,内存是有限的。除非在数据量上做出牺牲,否则如何解决是很矛盾的。相比之下,iOS下就舒服多了。
Unity官网给出了各平台默认纹理压缩格式的详细说明和使用建议。需要注意的是,通过选择不同移动GPU平台下GPU支持的压缩纹理,可以直接由GPU采样,无需CPU解压,节省了CPU内存和带宽,也节省了存储体积。如果目标平台不支持设置的压缩格式,纹理会被解压缩为RGBA32或RGB24,浪费CPU时间和内存。
参考几种主流地图压缩算法的实现原理。
由于IOS9(A8架构)苹果手机已经支持ASTC压缩格式,如果考虑放弃苹果6代之前手机的兼容性问题,可以直接使用。相比PVRTC2/4,ASTC(4X4)的压缩比会提高到0.25,但显示效果会好很多,而且不需要把画面设置成正方形。
详细描述了对游戏资产使用Astc纹理压缩,并给出了一些建议,即针对不同的纹理类型给出不同的压缩方案。
1.雅拉问答H5游戏可以使用压缩纹理(ETC,PVR等。)?
问:问:H5游戏可以使用压缩纹理(ETC,PVR等。)?
答:有些浏览器会不支持(比如safari)。
问:在雅拉可以根据不同的浏览器(或者不同的平台)使用不同压缩格式的纹理吗?
答:可以自己获取当前浏览器,自己处理就好。
2.layarunt me目前是否支持ETC/DXT或PVR等格式?在文档中没有找到这样的描述。
LayaAir目前不支持ETC/DXT/PVR等格式!只要关注layaAir的版本引擎更新日志,如果支持我们会及时通知你!
3.Egret内存分析-存在双内存在-RES加载资源后无法释放的问题。
已经计划支持pvr和etc。