Version: Unity 6.0 (6000.0)
言語 : 日本語
GPU テクスチャ形式のリファレンス
テクスチャのインポート

Mipmaps

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

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

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

ミップマップは、3D シーンでのオブジェクトのレンダリングによく使用されます。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 のテクスチャがミップマップレベル 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 でテクスチャサンプリング操作のミップマップバイアスを設定するには、サンプルテクスチャ 2D 配列ノードまたはサンプルテクスチャ 2D ノードを参照してください。

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

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

追加リソース

GPU テクスチャ形式のリファレンス
テクスチャのインポート