生活随笔
收集整理的這篇文章主要介紹了
Unity图片优化神器 - dither算法究极进化方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Unity移動平臺的游戲開發過程中,貼圖資源是往往是占資源量最大的資源。如何在保證視覺效果的同時,盡可能的減少貼圖資源,是開發團隊會經常遇到的問題。通常來說,對于3D物體的紋理,是可以采用ETC/PVRTC等壓縮比很大的算法處理的,但是對于細節要求很高的UI紋理,這樣處理造成的失真往往達不到質量要求。對于這類的貼圖,我們可以考慮使用失真較小的16位的貼圖格式存儲。
但是對于顏色數較高的紋理,Unity提供的默認轉換方法會呈現明顯的色帶。針對該問題,keijiro實現了一種dither4444的改進算法。從圖1上可以看到,對于畫面細節比較平滑的圖片,該算法雖然消除了色帶現象,同時帶來了肉眼可見的噪點。
?
<圖1> 左:原始圖 右:keijiro的dither4444示意圖
筆者在keijiro的算法基礎上進行了改進,提供了一個將RGB24bit圖dither之后轉RGB565的方法,基本消除了肉眼可見的失真,實際效果見圖2。
?
<圖2> 左:原始圖 右:筆者的dither565示意圖
實際在我的項目的應用中,對于不適合ETC/PVRTC壓縮的圖片,二手手機號購買平臺都采用了該文章中的RGB565或者RGB565+A8的方式。在肉眼基本無失真的基礎上,節省了部分資源。
最后附上OnPostprocessTexture代碼
void OnPostprocessTexture (Texture2D texture){? ?? ?? ?? ?? ?? ?if(assetPath.Contains ("_dither565"))? ?? ?? ?? ?? ?? ?{? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var texw = texture.width;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var texh = texture.height;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var pixels = texture.GetPixels ();? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var offs = 0;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k1Per31 = 1.0f / 31.0f;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k1Per32 = 1.0f / 32.0f;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k5Per32 = 5.0f / 32.0f;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k11Per32 = 11.0f / 32.0f;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k15Per32 = 15.0f / 32.0f;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k1Per63 = 1.0f / 63.0f;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k3Per64 = 3.0f / 64.0f;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k11Per64 = 11.0f / 64.0f;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k21Per64 = 21.0f / 64.0f;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k29Per64 = 29.0f / 64.0f;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k_r = 32; //R&B壓縮到5位,所以取2的5次方? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?var k_g = 64; //G壓縮到6位,所以取2的6次方? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?for(var y = 0; y < texh; y++){? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? for(var x = 0; x < texw; x++){? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? float r = pixels [offs].r;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? float g = pixels [offs].g;
復制代碼
float b = pixels [offs].b;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???var r2 = Mathf.Clamp01 (Mathf.Floor (r * k_r) * k1Per31);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???var g2 = Mathf.Clamp01 (Mathf.Floor (g * k_g) * k1Per63);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???var b2 = Mathf.Clamp01 (Mathf.Floor (b * k_r) * k1Per31);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???var re = r - r2;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???var ge = g - g2;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???var be = 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].r += re * k15Per32;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?pixels [n1].g += ge * k29Per64;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?pixels [n1].b += be * k15Per32;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???if(y < texh - 1){? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?pixels [n3].r += re * k11Per32;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?pixels [n3].g += ge * k21Per64;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?pixels [n3].b += be * k11Per32;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?if(x > 0){? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? pixels [n2].r += re * k5Per32;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? pixels [n2].g += ge * k11Per64;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? pixels [n2].b += be * k5Per32;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?}? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?if(x < texw - 1){? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? pixels [n4].r += re * k1Per32;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? pixels [n4].g += ge * k3Per64;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? pixels [n4].b += be * k1Per32;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?}? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pixels [offs].r = r2;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pixels [offs].g = g2;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pixels [offs].b = b2;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???offs++;? ?? ?? ?? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ?? ? }? ?? ?? ?? ?? ?? ? texture.SetPixels (pixels);? ?? ?? ?? ?? ?? ? EditorUtility.CompressTexture (texture, TextureFormat.RGB565, TextureCompressionQuality.Best);? ?? ?? ? }}
復制代碼
總結
以上是生活随笔為你收集整理的Unity图片优化神器 - dither算法究极进化方案的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。