Unity高性能ASTC动态图集方案
在古代,人们只能在静态图集中使用压缩纹理,一旦到了动态图集,只能老老实实的使用RGBA32。
后来随着科技发展,人们开始使用ComputeShader在运行时进行动态图集的压缩。不过再怎么优化压缩算法,这个计算开销是避不掉的。
本方案对资产生产流程做了微小的一点改变,即可避免运行时的压缩计算开销。如果想兼容更广泛的机型,也可以轻松改成其他基于Block的压缩纹理方案。
ASTC是一种基于Block的压缩纹理算法,Block的大小可以是4x4、6x6或者其他,但是一个Block的数据大小是固定的128bit。
我们在使用动态图集时,最主要的目的是把散图放到图集纹理中。传统做法都是基于像素去处理的,这种做法易于理解,但是与压缩纹理的模式是冲突的。
我们只需要改变一下思路,基于Block去处理,这样就不需要进行计算,只需要单纯的拷贝即可。
而基于Block处理,就需要让Block的像素尺寸是散图尺寸和图集尺寸的公约数。
例如6x6的Block,散图可以是126x126、132x132,但不能是128x128。图集可以是1020x1020、1026x1026,但不能是1024x1024。
所以我们就需要将散图尺寸扩大到Block的倍数,并压缩成ASTC格式,再导入到Unity中。而由于我们本来就需要给散图增加Padding,所以可以一起放在这一步中执行。
在将散图拷贝到图集中时,如果目标设备支持CopyTexture,那么我们可以使用Graphics.CopyTexture,否则的话在GetPixelData之后手动Copy。






