【Unity】ミップマップとテクスチャフィルタリングの概要・設定方法と処理負荷のお話

Unityにおけるミップマップとテクスチャフィルタリングの概要と設定方法をまとめました。

Unity2018.4.0

ミップマップ?

下図は、元のテクスチャと、そこから解像度を半々にしていったテクスチャを並べたものです。

f:id:halya_11:20190922105151j:plain
Mipmap - Wikipedia より

このようなテクスチャ群のことをミップマップと呼びます。

ミップマップは、後述するテクスチャフィルタリング時に使用することで、
カメラから遠かったり斜めに映ったりするモデルをきれいに描画できます(詳細は後述)。

Unityでは、テクスチャのインポート設定のGenerate Mip Mapsにチェックを入れることでミップマップを生成できます。

f:id:halya_11:20190922105802p:plain

作成されたミップマップの様子はテクスチャのプレビューウィンドウでスライダーを動かすことで確認できます。

f:id:halya_11:20190922110305g:plain

バイリニア・トライリニアフィルタリング

さて、今下記のUnityちゃんを画面に対してとても小さく描画することを考えます。

f:id:halya_11:20190922113305p:plain

まずテクスチャフィルタリングなしで描画したものを拡大すると次のようになります。

f:id:halya_11:20190922113422p:plain

少ないピクセル数に描き込んでいるのでドット絵のようになっています。
次にこれにテクスチャフィルタリングを適用してみます。

f:id:halya_11:20190922113606p:plain

上記二つを見比べるとわかる通り、テクスチャフィルタリングを使うと縮小して描画した部分がきれいになります。
この効果は環境オブジェクトなど、カメラから見て遠くに描画されがちなものに適用すると顕著です。

テクスチャフィルタリングを適用するにはFilter ModeをBilinearかTrilinearに設定します。
またテクスチャフィルタリングの仕組みにはミップマップが必要なので、Generate Mip Mapsにもチェックしておく必要があります。

f:id:halya_11:20190922113953p:plain

Filter Modeの各項目の説明は以下の通りです。

項目名 説明
Point(no filter) テクスチャフィルタリングを使用しない
Bilinear バイリニアフィルタリングを適用する
Pointより綺麗だが処理負荷が高くなる
Trilinear トライリニアフィルタリングを適用する
バイリニアより綺麗だが処理負荷が高くなる

異方性フィルタリング

次に、画面に対してモデルが傾いて描画されているケースを考えます。
3DCGはこのような状況でテクスチャを綺麗に描画するのが苦手です。

f:id:halya_11:20190922115538p:plain

上記はバイリニアフィルタリングだけを掛けて描画した結果です。
手前はチェック柄がうまく描画されていますが、奥に行くにつれて詳細がつぶれてしまっています。

このようなケースでは、異方性フィルタリングを使うことで品質を向上できます。
試しに異方性フィルタリングをレベル10(後述)で適用してみます。

f:id:halya_11:20190922115851p:plain

先ほどの結果よりも遠くまでチェック柄がはっきり見えるようになりました。
この効果は床など、カメラに対して斜め&広範囲に描画されるものに適用すると顕著です。

異方性フィルタリングを適用するには、テクスチャ設定でAniso Levelを2以上にします。
0と1は異方性フィルタリングOFFの状態なので注意してください。

f:id:halya_11:20190922120246p:plain

なお、異方性フィルタリングを使うにはバイリニアフィルタリングかトライリニアフィルタリングが適用されている必要があります。
これらが設定されていない場合にはAniso Levelは非アクティブになり異方性フィルタリングは適用されません。

f:id:halya_11:20190922120546p:plain

また、Aniso Levelについては高い値に設定するほど綺麗な結果にはなりますが、その分処理負荷が増大します。

Quality設定と異方性フィルタリング

テクスチャ設定の他にQuality設定にも異方性のレベルの適用方法に関する設定項目があります。

f:id:halya_11:20190922121327p:plain

この設定項目の働きは非常にわかりづらいのですが、まとめると以下のようになります。

設定項目名 説明
Disabled テクスチャ設定に関係なく異方性フィルタリングを無効にする
Per Texture テクスチャ設定をそのまま使う
Forced On テクスチャ設定に関係なくAniso Levelを9~16にクランプする
ただし、Aniso Levelが0に設定されているものは無効のままにする

Forced Onがわかりづらいですね。
マニュアルにもまともな記述がないのですが下記に記載されていました。

support.unity3d.com

処理負荷に注意

さて上記でも多少触れましたが、テクスチャフィルタリングを適用すると処理負荷が増大します。
簡単にまとめると処理負荷は以下のルールで増えていきます。

また具体的にはテクスチャのサンプリング数が増えるため、GPUの処理負荷が大きくなっていきます。
これに関しての詳細は以下の記事がわかりやすいので興味がある方は見ると良いと思います。

https://www.4gamer.net/specials/3de/nv_at/nv_at01.html

https://www.4gamer.net/specials/3de/nv_at/nv_at02.html

以上を踏まえた現実的な指針として、まずカメラからみてあまり遠くに行かないキャラクターなどのテクスチャはフィルタリングを無効にして良さそうです。
またVFXなどもあまり効果が感じられなそうであれば切ってしまってよさそうです。

残るは環境オブジェクトですが、カメラワークが自由である場合には基本的にテクスチャフィルタリングはONにしたほうがよさそうです。
ただし異方性フィルタリングは床などカメラに対して斜めに描画されやすいオブジェクトのみでいいかもしれません。
また、バイリニアとトライリニアにはそこまで見た目的な差がないため、特段気にならなければバイリニアにしておくのがいいかと思います。

参考

support.unity3d.com

https://www.4gamer.net/specials/3de/nv_at/nv_at01.html

https://www.4gamer.net/specials/3de/nv_at/nv_at02.html