ShaderTips

シェーダーTips

主にUnityシェーダーについての記事を書いています。

【Unity】ミップマップとテクスチャフィルタリング

ミップマップの基本 - Unity マニュアル引用

ミップマップとは?


元のテクスチャ解像度を1/2ずつ縮小しながら何枚もテクスチャを生成します。生成した一つ一つのテクスチャをミップといい、全てのミップのまとめたものをミップマップと言います。 youtu.be


カメラからの距離が近いときは解像度の高いミップを使用し、遠くなるにつれて解像度の低いミップを使用することで、処理負荷を抑えることができます。


遠いところに解像度の高いミップを使用して、カメラを動かすと、ちらついて見えてしまうのですが、元から解像度の低いミップを使用すると変化が少ないため、ちらつきを抑えることができます。


メリットは大きいですが、ミップマップ使用時とそうでない時では、メモリの使用量が33%(Unity公式)増えます。そのため、解像度の低いミップを使用しない場合は、ミップマップを使用しない方が良いです。


どの解像度のミップを使用するかは、隣接ピクセルとのUV座標の変化量(ddx, ddy)から、1ピクセルずれたときにテクスチャ的に何ピクセル進むかを計算することで、求めます。

ミップマップの設定方法

テクスチャ設定で、行うミップマップの各オプションについて、解説します。

GenerateMipMap

このプロパティを有効にすると、ミップマップ生成を行います。

BorderMipMaps

低レベルのミップになると、外周部分がボケて別の色になってしまいます。
WarpModeをClampにすると外周の1pixelを繰り返すので、ボケてしまった色を繰り返してしまいます。
このプロパティを有効にするとボケなくすることができます。 主にライトのクッキーで使用ます。

BorderMipMaps オフ youtu.be

BorderMipMaps オン youtu.be

MipMapFiltering

画像品質を最適化するために 2 種類のミップマップフィルタリングがあります。

Box
ミップが小さくになるにつれて滑らかになります。 Kaiser
小さいミップでもシャープになりやすいです。
Boxで、ぼやけすぎる場合は使えるが、基本的には使用しません。

MipMapsPreserveConverge

調べてもよく分からなかったので、公式の説明を載せておきます。
誰か、教えてください。

このプロパティを有効にすると、生成されたミップマップのアルファチャンネルは、アルファテストの間、範囲を維持します。詳細はTextureImporterSettings.mipMapsPreserveCoverage を参照してください。

Generate Mip Maps が有効の場合のみ、使用できます。

テクスチャのインポート設定 - Unity マニュアル引用

FadeOutMipMaps

MIPレベルが進行するにつれてミップマップがグレーにフェードアウトします。スクロールの左端はフェードアウト開始時点のMIPレベルです。スクロールの右端は、テクスチャが完全にグレーに表示されるMIPレベルを定義します。

スクロールバーの左側で、フェードを開始するレベル、右端でグレーに変化するレベルを設定できます。

テクスチャフィルタリング

テクスチャをポリゴンに貼り付ける際はテクスチャが拡大や縮小され、荒くなってしまいます。
テクスチャフィルタリングは拡大や縮小されても、自然に見せるようにする技術です。
テクスチャフィルタリングには以下の手法があります。

バイリニアフィルタリング

バイリニアフィルタリングは、負荷の少ない軽量なテクスチャフィルタリング処理です。テクスチャマッピング時に4テクセル分を取り出し、テクスチャの拡大率を吟味した形でこの4テクセルの色を混ぜ合わせて最終的なテクセルの色を決定します。

視線に対してポリゴンが傾いているときに、本来は奥行きや傾きに配慮して、テクセルを選択して補間しないといけないのですが、バイリニアでは 常に、注目しているテクセルの周囲4テクセルの色を補間するため、正しい結果になりません。

設定方法
テクスチャ設定のFilterModeをBilinearにします。

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

トライリニアフィルタリングでは、バイリニアフィルタリングで考慮されていなかった、奥行きを考慮します。

バイリニアフィルタリングと同じく、周囲4テクセルの色を補間するのですが、これを視線からの距離に応じて、2つのミップマップから、それぞれ4テクセルずつ、合計8テクセルを取り出し、補間します。

これにより、奥行きを考慮することはできるのですが、視線とポリゴンの向きの関係は依然として無視されたままです。

設定方法
テクスチャ設定のFilterModeをTrilinearにします。

異方性フィルタリング

異方性フィルタリングは、視線とポリゴンの角度を考慮します。

wgld.org | WebGL: 異方性フィルタリング |引用

ピンクの矢印はサンプリングするテクセルで、視線とポリゴンの角度に応じて、サンプリングするテクセルを変更します。

画像では2つのテクセルをサンプリングしていますが、テクスチャ設定のAniso Levelを上げることで、サンプリングするテクセルを増やし、綺麗な結果にはなりますが、処理負荷が大きくなります。

また、Project Settings > Quality > Anisotropic Texturesでも、設定を行います。

設定項目 説明
Disabled 無効
Per Texture テクスチャごとに設定します。テクスチャのAniso Levelを2以上にすると有効になります。0の場合は無効です。
Forced On テクスチャのAniso Level1〜8にするとLevel9として扱います。0の場合は無効です。

異方性フィルタリングには2タイプある

異方性フィルタリングにはバイリニアタイプとトライリニアタイプが あります。
異方性フィルタリングは、視線とポリゴンの角度とAniso Levelに応じて、適切なテクセルをサンプリングすると説明しましたが、正確には違います。
注目した複数のテクセルから、バイリニアフィルタリングやトライリニアフィルタリングを適用します。
その為、異方性フィルタリングを有効にした状態でも、テクスチャ設定のFilterModeを設定することができます。

参考

docs.unity3d.com www.youtube.com wgld.org gamingpc-now.com https://www.4gamer.net/specials/3de/nv_at/nv_at01.html