Version: 2022.3
言語: 日本語
ミップマップ
ミップマップストリーミングシステム

ミップマップの基本

ミップまたはミップレベルは、特定の解像度を持つテクスチャのバージョンです。ミップはミップマップと呼ばれる集合で存在します。ミップマップには、1 つのテクスチャの解像度が徐々に低くなっていくバージョンが含まれています。

例えば、ミップマップには、オリジナルのテクスチャ (Mip 0) から、Mip 1、Mip 2、Mip 3 と 4 つのバージョンのテクスチャが含まれることがあります。

ミップレベル
ミップレベル

ミップマップは、3D シーンのオブジェクトのレンダリングによく使用されます。そこで、テクスチャ化されたオブジェクトはカメラからの距離によって異なる場合があります。カメラに近いオブジェクトには高いミップレベルが使用され、遠いオブジェクトには低いミップレベルが使用されます。

ミップマップは、GPU がテクスチャをその完全な解像度より低い解像度でレンダリングする場合、レンダリング操作を高速化し、レンダリングアーティファクトを低減することができます。ミップは事実上、オリジナルテクスチャのキャッシュした、ダウンサンプルしたバージョンです。GPU は、オリジナルのフル解像度のテクスチャに対して多くのサンプリング操作を行う代わりに、すでにダウンサンプルされたバージョンに対してより少ない数の操作を実行できます。

ミップマップが有益でないこともあります。ミップマップは、ディスクとメモリの両方で、テクスチャのサイズを 33% 増加させます。また、スケールされていない UI テクスチャなど、テクスチャが完全な解像度で描画される場合、ミップマップは何の利益ももたらしません。

テクスチャのミップマップは、手動で作成することも、Unity に指示して生成させることもできます。ミップマップを自動生成するには、ミップマップ画像の例に示すように、元のテクスチャの解像度が 2 のべき乗の値でなければなりません。

テクスチャアセットのミップマップの有効無効は、テクスチャインポート設定の Inspector で設定することができます。

GPU によるミップレベルのサンプリング方法

GPU がテクスチャをサンプリングするとき。GPU は現在のピクセルのテクスチャ座標 (UV) と GPU が計算する 2 つの内部値 DDX と DDY に基づいて、どのミップレベルを使用するかを決定します。DDX と DDY は現在のピクセルの横と上のピクセルの UV に関する情報 (距離と角度を含む) を提供します。

GPU はこれらの値を使用して、テクスチャの詳細がどの程度カ メラに見えるかを決定します。つまり、現在のピクセルとその隣接ピクセルの間の距離が長く、角度が極端なほど、GPU は解像度の低いミップを選び、距離が短くて角度が極端でないほど、GPU は解像度の高いミップを選びます。

GPU はトライリニアフィルタリングによって 2 つのミップからテクスチャ情報を一緒にブレンドすることもできます。サンプリング中にミップをブレンドすることで、あるミップから別のミップへの移行を目立たなくすることができます。ミップをブレンドするために、GPU は 1 つのミップから特定の割合のテクスチャ情報を取得し、残りをもう 1 つのミップから取得します。

ミップバイアス

ミップバイアスという設定は、サンプラーの設定に基づき、サンプリング中に 2 つのことを行うことができます。

  • ミップバイアスは、GPU がサンプルに対してより低いミップまたは高いミップを選択するしきい値を変更できます。サンプラーでポイントフィルタリングとリニアフィルタ リングを使用する場合、GPU は特定のミップを選択します。例えば、GPU は 一揃いの UV のテクスチャが Mip 3 のサンプルを使用すると判断する場合があります。ミップバイアスを –2 にすると、代わりに、GPU はサンプルに高解像度のミップ 1 を使用します。
  • ミップバイアスは、異なるミップからのサンプルをブレンドする場合に、あるミップを他のミップより何パーセント優先するかを正確に GPU に指示することができます。サンプラーでトライリニアフィルタリングを使用する場合、GPU はミップをブレンドします。例えば、GPU の計算が 0.5 という値を返すとします。0.5 という値は、GPU に、必要なテクスチャ情報の 50% をあるミップから、残りの 50% をミップマップ内の次のミップから取得するように指示します。0.2 のミップバイアスを追加すると、0.5 の値は 0.7 に変わり、GPU は最初のミップから 70%、2 番目のミップからは 30% だけテクスチャ情報を取得します。

GPU にはグローバルミップバイアスがあり、デフォルトでミップ選択に適用されます。テクスチャは独自のミップバイアスを持つことができ、Unity はこれをグローバルミップバイアスに加算または減算します。また、シェーダー内の個々のテクスチャサンプリング操作に対して、独自のミップバイアスを指定することができます。

個々のテクスチャにミップバイアスを設定するには、Texture.mipMapBias を参照してください。ハンドコードシェーダーでテクスチャサンプリング操作のミップバイアスを設定するには、tex2dbias などの HLSL 関数を使用します。Shader Graph でテクスチャサンプリング操作のミップバイアスを設定するには、Sample Texture 2D Array node または Sample Texture 2D node を参照してください。

Unity によるミップマップのロード方法

Unity がランタイムにミップマップをロードする方法は、ミップマップストリーミング で制御できます。

ミップマップ
ミップマップストリーミングシステム