Unity使用 16bit 压缩 Texture 颜色能均匀过渡

 

下面是unity自带 16bit 图 的效果,可以看到颜色过度的很不均匀,占用内存 0.5M

  

 

如果调成 truecolor 后 颜色过渡很均匀,而内存却占到 1.1 M

  

 

讲图片 后缀名改成  .Dither.png  结尾后回到 unity,设置贴图格式为 Truecolor 后,颜色过渡也很均匀,而且内存只占了 0.5M

 

以下代码来至 keijiro 的 github:unity-dither4444

 

 1 using UnityEngine;
 2 using UnityEditor;
 3 using System.Collections;
 4 
 5 class TextureModifier : AssetPostprocessor
 6 {
 7     void OnPreprocessTexture()
 8     {
 9         var importer = (assetImporter as TextureImporter);
10 
11         importer.textureType = TextureImporterType.GUI;
12 
13         if (assetPath.EndsWith ("Dither.png")) {
14             importer.textureFormat = TextureImporterFormat.RGBA32;
15         }
16     }
17 
18     void OnPostprocessTexture (Texture2D texture)
19     {
20         if (!assetPath.EndsWith ("Dither.png")) {
21             return;
22         }
23 
24         var texw = texture.width;
25         var texh = texture.height;
26 
27         var pixels = texture.GetPixels ();
28         var offs = 0;
29 
30         var k1Per15 = 1.0f / 15.0f;
31         var k1Per16 = 1.0f / 16.0f;
32         var k3Per16 = 3.0f / 16.0f;
33         var k5Per16 = 5.0f / 16.0f;
34         var k7Per16 = 7.0f / 16.0f;
35 
36         for (var y = 0; y < texh; y++) {
37             for (var x = 0; x < texw; x++) {
38                 float a = pixels [offs].a;
39                 float r = pixels [offs].r;
40                 float g = pixels [offs].g;
41                 float b = pixels [offs].b;
42 
43                 var a2 = Mathf.Clamp01 (Mathf.Floor (a * 16) * k1Per15);
44                 var r2 = Mathf.Clamp01 (Mathf.Floor (r * 16) * k1Per15);
45                 var g2 = Mathf.Clamp01 (Mathf.Floor (g * 16) * k1Per15);
46                 var b2 = Mathf.Clamp01 (Mathf.Floor (b * 16) * k1Per15);
47 
48                 var ae = a - a2;
49                 var re = r - r2;
50                 var ge = g - g2;
51                 var be = b - b2;
52 
53                 pixels [offs].a = a2;
54                 pixels [offs].r = r2;
55                 pixels [offs].g = g2;
56                 pixels [offs].b = b2;
57 
58                 var n1 = offs + 1;
59                 var n2 = offs + texw - 1;
60                 var n3 = offs + texw;
61                 var n4 = offs + texw + 1;
62 
63                 if (x < texw - 1) {
64                     pixels [n1].a += ae * k7Per16;
65                     pixels [n1].r += re * k7Per16;
66                     pixels [n1].g += ge * k7Per16;
67                     pixels [n1].b += be * k7Per16;
68                 }
69 
70                 if (y < texh - 1) {
71                     pixels [n3].a += ae * k5Per16;
72                     pixels [n3].r += re * k5Per16;
73                     pixels [n3].g += ge * k5Per16;
74                     pixels [n3].b += be * k5Per16;
75 
76                     if (x > 0) {
77                         pixels [n2].a += ae * k3Per16;
78                         pixels [n2].r += re * k3Per16;
79                         pixels [n2].g += ge * k3Per16;
80                         pixels [n2].b += be * k3Per16;
81                     }
82 
83                     if (x < texw - 1) {
84                         pixels [n4].a += ae * k1Per16;
85                         pixels [n4].r += re * k1Per16;
86                         pixels [n4].g += ge * k1Per16;
87                         pixels [n4].b += be * k1Per16;
88                     }
89                 }
90 
91                 offs++;
92             }
93         }
94 
95         texture.SetPixels (pixels);
96         EditorUtility.CompressTexture (texture, TextureFormat.RGBA4444, TextureCompressionQuality.Best);
97     }
98 }

 

posted @ 2015-07-17 22:43  gabo  阅读(5559)  评论(0编辑  收藏  举报