プログラミングで世界を変える

ゲームプログラミングと技術のこと

UnityのuGUIで画像がぼやけて表示される時の対処とミップマップの仕様の話

uGUIのImageで表示していたSprite画像がぼやけて表示されることがありました。

対処方法

CanvasのPixelPerfectに依る場合もあるみたいですけど、僕の場合はImportSettingの「Generate Mip Maps」が原因でした。

f:id:splas_boomerang:20150710103917p:plain

Generate Mip Mapsを切り替えた時の比較です(スクショを2倍に拡大してあります)。
f:id:splas_boomerang:20150710095545p:plain f:id:splas_boomerang:20150710095549p:plain
(左) enable (右) disable

ケースバイケースだとは思いますが、僕の場合はiOSにて確認した時にかなりぼやけているように感じ、気になりました。

ミップマップの仕様

下記日本語版の公式マニュアルを参考にしました。 Unity - マニュアル: テクスチャ 2D

それによると、「Generate Mip Maps」の説明には

これを選択すると、ミップマップの生成が有効になります。ミップマップはより小さいテクスチャで、テクスチャが画面上で非常に小さい場合に使用されます。

とあり、ミップマップの説明は

ミップマップはプログレッシブでより小さくした画像イメージを複数集めた一覧であり、これによりリアルタイム 3D エンジンでのパフォーマンスを最適化します。カメラから遠く離れたオブジェクトはテクスチャの小さいものを使用します。ミップマップを使用すると 33% 多くメモリを使用しますが、使用しないとパフォーマンスのロスが顕著になります。ゲームのテクスチャでは常にミップマップを使用すべきで、唯一の例外は小さくされることのないテクスチャです(例. GUI テクスチャ)。

となっていました。

ミップマップの説明の最後にもありますが、基本的にGUI用途であればdisableにするのが良さそうです。
「使用しなくてもよい」という意味でも取れそうですが、ミップマップの目的から逸れ、メモリを多く必要とするデメリットもあるため、「使用すべきでない」という解釈をしました。"より小さくした画像イメージを複数集めた一覧"となるので、DrawCallの最適化をしてくれている可能性も考えましたが、検証したところ回数に変化はありませんでした。

疑問なのが、ミップマップはカメラから離れたオブジェクトに適用されるはずなのに、何故uGUIの画像にも適用されるのかが分かりませんでした。CanvasのRenderModeをScreen Space - Overlayにしていれば、そもそもカメラ自体に依存しないはずなのに…。 ミップマップが適用される閾値なども調べてみましたが分かりませんでした。その辺りの仕様について、何か情報がありましたら教えてください。

参考

tsubakit1.hateblo.jp

mip mapping and GUI textures - Unity Answers