我们在项目中有时会发现一些纯色纹理,如下图,纯色纹理顾名思义就是一些单一颜色的纹理贴图,在实际项目中我们是需要把这些剔除掉的,不建议使用纯色纹理。
原因:纹理大部分是用来赋予材质在shader中进行采样的,如果使用纯色纹理,我们完全可以在shader中加一个color属性替代纯色纹理采样,tex2D采样的非常消耗性能的。在实际项目中美术同学可能不知道,以至于或多或少我们项目中都存在一些纯色纹理,如果使用过UWA,UWA也可以帮我们检测出来,如下图:
下面介绍两种方法批处理美术资源并筛选出来纯色纹理,反馈给美术进行其他替代方案的制定。
一、逐像素判断法
这种是最笨的办法,就是取贴图的每一个像素,然后拿第一个像素点跟其他像素点的Color值去比较,只要比较值出现不同,就肯定不是纯色纹理。这种方法是最准确的,同时也是最费时的。特别是贴图尺寸特别大的时候,并且我们要获取像素点,还需要先设置纹理可读才能继续操作,操作完关闭可读。如果你有10000个纹理资源,估计工具得跑一整天。代码如下:
bool isSolidColor = true;
if (myTexture is Texture2D)
{
Texture2D texture = Texture as Texture2D;
int textureWidth = texture.width;
int textureHeight = texture.height;
TextureImporter importer = AssetImporter.GetAtPath(texturePath) as TextureImporter;
importer.isReadable = true;
AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(texture));
//取得第一个像素点
Color col0 = texture.GetPixel(0, 0);