0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】画像をインポートすると画質が落ちる(ノイズが発生する)原因と対処法

0
Posted at

はじめに

Unityで画像(PNG等)をインポートしてUI上に表示したとき、元画像にはないノイズやチラつきが発生することがあります。
本記事では、対処法と、その背景にある原因を解説します。

環境

  • Meta Quest 3
  • Unity 6.3 LTS
  • ビルドターゲット: Android(Meta Quest 3)

症状

VR空間内で騒音シミュレーションを行うアプリを開発していました。World Space Canvas上にパネルを配置し、ボタンを押すと対応する乗り物の図面画像がパネル内に表示される、という構成です。

Unity Editor上では画像はきれいに表示されていたのですが、Meta Quest 3向けにビルドして実機で確認すると、画像部分にだけノイズが入り、画質が著しく劣化していました。

VR空間内での表示。左がノイズあり、右が修正後

左側がノイズあり、右側が修正後です。
ノイズのようなちらつきを確認できます。

対処法

テクスチャのインポート設定を変更する

Project ウィンドウで対象の画像ファイルを選択し、Inspector の Advanced セクションで以下を変更します。

設定項目 変更前 変更後
Generate Mip Maps OFF ON
Filter Mode Bilinear Trilinear
Aniso Level 1 4 以上

変更後、Apply をクリックしてください。

変更前  変更後
before after

それでも改善しない場合

テクスチャ圧縮フォーマットを変更する

Android向けビルドでは、テクスチャが自動的に圧縮されます。Unity の AndroidデフォルトはETC2ですが、Meta Quest向けではASTCが推奨されており、Build Settingsで選択できます。いずれも非可逆圧縮のため、細かい線や図面のような画像では圧縮ノイズが発生することがあります。

上記の Mipmapやフィルタリング設定で改善しない場合は、以下も試してください

  1. InspectorのAndroidタブを開く
  2. Override for Androidにチェック
  3. Formatを RGBA 32 bit に変更
  4. Apply

ただしRGBA 32 bitは無圧縮のため、テクスチャのメモリ使用量が増加します。UI用の画像数枚であれば問題ありませんが、大量のテクスチャに適用する場合はメモリとのトレードオフを考慮してください。

なぜノイズが発生するのか

ここからは、上記の対処法がなぜ効くのかを解説します。

Mipmap とは

Mipmapは、1枚の画像からサイズ違いのコピーをあらかじめ作っておく仕組みです。

描画時には、画面上での見た目のサイズに合った Mipレベルが自動で使われます。遠くにある(=小さく表示される)ものには小さい画像、近くにあるものには大きい画像、というように切り替わります。

World Space CanvasとScreen Space Canvasの違い

Screen Space Canvas(通常の2D UI)は、画面のピクセルにそのまま表示されます。画像が拡大・縮小されることがないので、Mipmapがなくても問題ありません。

一方World Space Canvasは、3D空間に板のように置かれたUIです。中身は実際にはポリゴン(メッシュ)に変換されて描画されています。つまり、3Dの建物や地面と同じ方法で画面に映し出されます。

そのため、カメラとの距離や角度によって表示サイズが常に変わります。VR ではプレイヤーが頭を動かすだけで距離・角度が変化するため、この影響が特に大きくなります。

Mipmap がないとどうなるか

たとえば、元画像が1024×1024ピクセルあるのに、画面上では100×100ピクセル程度の大きさでしか表示されない場面を考えてみてください。

GPUは1024×1024の画像を100×100に縮めて表示する必要がありますが、すべてのピクセルを丁寧に平均化しているわけではありません。実際にはごく一部のピクセルだけを拾って表示しています。そのため、拾われなかったピクセルの情報が抜け落ち、結果としてノイズやチラつき(エイリアシング)が発生するようです。

Mipmapが有効なら、最初から128×128に縮小された画像が用意されているので、GPUはそちらを使います。すでにきれいに縮小された画像を読み取るだけなので、ノイズは発生しません。

フィルタリングの役割

Mipmapを有効にしても、まだ完璧ではありません。Mipレベルが切り替わる境界で、解像度がガクッと変わって帯状の線が見えることがあります。これを解消するのがフィルタリングモードです。

フィルタリング やっていること 画質
Point 一番近い1ピクセルをそのまま使う 最低(ドット絵向き)
Bilinear 周囲4ピクセルの平均を取る 中(なめらかだが Mip 境界は残る)
Trilinear Bilinear に加えて、隣り合う Mip レベル同士も混ぜ合わせる 高(Mip 境界の線が消える)

Trilinearは、2つのMipレベルの描画結果をブレンドするので、切り替わりの境目が目立たなくなります。

また、Aniso Levelは、テクスチャを斜めから見たときのぼやけを抑える機能です。VRではパネルを正面から見るとは限らないため、Aniso Levelを上げておくと斜め方向からでもくっきり表示されます。

まとめ

  • World Space Canvasに画像を表示する場合は、Generate Mip Mapsを有効にする
  • Filter Mode を TrilinearにしてMipレベル間の補間を滑らかにする
  • Aniso Levelを4以上にして斜め方向の画質を確保する
  • それでもノイズが残る場合は、Androidの圧縮フォーマットをRGBA 32 bitに変更する

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?