ミップマップレベルは、特定の解像度を持つテクスチャのバージョンです。ミップマップレベルはミップマップと呼ばれるひとそろいで存在します。ミップマップには、1 つのテクスチャの解像度が徐々に低くなっていくバージョンが含まれています。
例えば、ミップマップには、オリジナルのテクスチャ (ミップマップレベル 0) から、ミップマップレベル 1、ミップマップレベル 2、ミップマップレベル 3 まで、4 つのバージョンのテクスチャが含まれることがあります。
ミップマップは、3D シーンでのオブジェクトのレンダリングによく使用されます。3D シーンでは、テクスチャ化されたオブジェクトのカメラからの距離が異なる場合があります。カメラに近いオブジェクトには高いミップマップレベルが使用され、遠いオブジェクトには低いミップマップレベルが使用されます。
ミップマップは、GPU がテクスチャをその完全な解像度より低い解像度でレンダリングする場合、レンダリング操作を高速化し、レンダリングアーティファクトを低減することができます。ミップマップは事実上、オリジナルテクスチャのキャッシュした、ダウンサンプルしたバージョンです。GPU は、オリジナルのフル解像度のテクスチャに対して多くのサンプリング操作を行う代わりに、すでにダウンサンプルされたバージョンに対してより少ない数の操作を実行できます。
ミップマップが有益でないこともあります。ミップマップは、ディスクとメモリの両方で、テクスチャのサイズを 33% 増加させます。また、スケールされていない UI テクスチャなど、テクスチャが完全な解像度で描画される場合、ミップマップは何の利益ももたらしません。
テクスチャのミップマップは、手動で作成することも、Unity に指示して生成させることもできます。ミップマップを自動生成するには、ミップマップ画像の例に示すように、元のテクスチャの解像度が 2 のべき乗の値でなければなりません。
テクスチャアセットのミップマップの有効無効は、テクスチャインポート設定の Inspector で設定することができます。
GPU がテクスチャをサンプリングするとき、GPU は現在のピクセルのテクスチャ座標 (UV) と GPU が計算する 2 つの内部値 DDX と DDY に基づいて、どのミップマップレベルを使用するかを決定します。DDX と DDY は現在のピクセルの横と上のピクセルの UV に関する情報 (距離と角度を含む) を提供します。
GPU はこれらの値を使用して、テクスチャの詳細がどの程度カメラに見えるかを決定します。つまり、現在のピクセルとその隣接ピクセルの間の距離が長く、角度が極端なほど、GPU は解像度の低いミップマップレベルを選び、距離が短くて角度が極端でないほど、GPU は解像度の高いミップマップレベルを選びます。
GPU はトライリニアフィルタリングによって 2 つのミップマップレベルからテクスチャ情報を一緒にブレンドすることもできます。サンプリング中にミップマップレベルをブレンドすることで、あるミップマップレベルから別のミップマップレベルへの遷移を目立たなくすることができます。ミップマップレベルをブレンドするために、GPU は 1 つのミップマップレベルから特定の割合のテクスチャ情報を取得し、残りをもう 1 つのミップマップレベルから取得します。
ミップマップバイアスという設定は、サンプラーの設定に基づき、サンプリング中に 2 つのことを行うことができます。
GPU にはグローバルミップマップバイアスがあり、デフォルトでミップマップレベル選択に適用されます。テクスチャは独自のミップマップバイアスを持つことができ、Unity はこれをグローバルミップマップバイアスに加算または減算します。また、シェーダー内の個々のテクスチャサンプリング操作に対して、独自のミップマップバイアスを指定することができます。
個々のテクスチャにミップマップバイアスを設定するには、Texture.mipMapBias を参照してください。ハンドコードシェーダーでテクスチャサンプリング操作のミップマップバイアスを設定するには、tex2dbias などの HLSL 関数を使用します。Shader Graph でテクスチャサンプリング操作のミップマップバイアスを設定するには、サンプルテクスチャ 2D 配列ノードまたはサンプルテクスチャ 2D ノードを参照してください。
Unity がランタイムにミップマップをロードする方法は、ミップマップストリーミング で制御できます。