Unity-Dither4444的研究

来源:互联网 发布:linux 查看环境路径 编辑:程序博客网 时间:2024/06/08 07:28

Dither-16bit的抖动优化

使用小插件, keijiro 的 github:unity-dither4444
将需要优化的大图后缀改为.Dither.png。
图片资源的 [硬盘/内存] 大小和图片设置的格式有关

实测

IOS中质量堪比trueColor,在pvrtc质量较差的情况下使用
IOS
Android中与ETC2差距不大,但更消耗内存
这里写图片描述
结论:仅IOS可用

优化

对IOS和Android区别对待,代码如下

using UnityEngine;using UnityEditor;using System.Collections;class TextureModifier : AssetPostprocessor{    void OnPreprocessTexture()    {        if (assetPath.EndsWith ("Dither.png")) {            var importer = (assetImporter as TextureImporter);            importer.textureFormat = TextureImporterFormat.RGBA32;            importer.SetPlatformTextureSettings (BuildTarget.Android.ToString(), 2048, TextureImporterFormat.ETC2_RGBA8);        }    }    void OnPostprocessTexture (Texture2D texture)    {        if (!assetPath.EndsWith ("Dither.png")) {            return;        }        if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) {            //Android时弃用            return;        }        var texw = texture.width;        var texh = texture.height;        var pixels = texture.GetPixels ();        var offs = 0;        var k1Per15 = 1.0f / 15.0f;        var k1Per16 = 1.0f / 16.0f;        var k3Per16 = 3.0f / 16.0f;        var k5Per16 = 5.0f / 16.0f;        var k7Per16 = 7.0f / 16.0f;        for (var y = 0; y < texh; y++) {            for (var x = 0; x < texw; x++) {                float a = pixels [offs].a;                float r = pixels [offs].r;                float g = pixels [offs].g;                float b = pixels [offs].b;                var a2 = Mathf.Clamp01 (Mathf.Floor (a * 16) * k1Per15);                var r2 = Mathf.Clamp01 (Mathf.Floor (r * 16) * k1Per15);                var g2 = Mathf.Clamp01 (Mathf.Floor (g * 16) * k1Per15);                var b2 = Mathf.Clamp01 (Mathf.Floor (b * 16) * k1Per15);                var ae = a - a2;                var re = r - r2;                var ge = g - g2;                var be = b - b2;                pixels [offs].a = a2;                pixels [offs].r = r2;                pixels [offs].g = g2;                pixels [offs].b = b2;                var n1 = offs + 1;                var n2 = offs + texw - 1;                var n3 = offs + texw;                var n4 = offs + texw + 1;                if (x < texw - 1) {                    pixels [n1].a += ae * k7Per16;                    pixels [n1].r += re * k7Per16;                    pixels [n1].g += ge * k7Per16;                    pixels [n1].b += be * k7Per16;                }                if (y < texh - 1) {                    pixels [n3].a += ae * k5Per16;                    pixels [n3].r += re * k5Per16;                    pixels [n3].g += ge * k5Per16;                    pixels [n3].b += be * k5Per16;                    if (x > 0) {                        pixels [n2].a += ae * k3Per16;                        pixels [n2].r += re * k3Per16;                        pixels [n2].g += ge * k3Per16;                        pixels [n2].b += be * k3Per16;                    }                    if (x < texw - 1) {                        pixels [n4].a += ae * k1Per16;                        pixels [n4].r += re * k1Per16;                        pixels [n4].g += ge * k1Per16;                        pixels [n4].b += be * k1Per16;                    }                }                offs++;            }        }        texture.SetPixels (pixels);        EditorUtility.CompressTexture (texture, TextureFormat.RGBA4444, TextureCompressionQuality.Best);    }}
0 0