Unity 图片导入时进行抖动处理(RGBA16 + Dithering)

void OnPreprocessTexture()
    {
        var importer = (assetImporter as TextureImporter);
        importer.textureType = TextureImporterType.Sprite;
        if (assetPath.EndsWith("Dither.png"))
        {
            importer.textureFormat = TextureImporterFormat.RGBA32;
        }
    }
    void OnPostprocessTexture(Texture2D texture)
    {
        Debug.Log("this is OnPostprocesseTexture");
        if (!assetPath.EndsWith("Dither.png"))
        {
            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].g += ge * k5Per16;
                    pixels[n3].r += re * 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);


    }

你可能感兴趣的:(unity,游戏引擎)