ミップマップでのテクスチャ フィルタリング
ミップマップは連続したテクスチャで、各テクスチャは同じイメージを徐々に低い解像度で表したものです。 ミップマップでの各イメージの高さと幅、つまりレベルは、直前のレベルを 2 の累乗で割った値になります。 ミップマップは正方形である必要はありません。
ユーザーに近いオブジェクトには、解像度の高いミップマップ イメージが使用されます。 オブジェクトが遠くに表示されるにつれて、より低い解像度のイメージが使用されます。 ミップマップ処理によってレンダリングしたテクスチャの品質は向上しますが、使用するメモリは増加します。
Direct3D では、付属サーフェスのチェーンとしてミップマップが表現されます。 解像度が最も高いテクスチャはチェーンの先頭にあり、次のレベルのミップマップを添付データとして保有します。 さらに、そのレベルではミップマップ内の次のレベルの添付データを保有し、解像度が最も低いミップマップに至るまで続きます。
以下の各図は、これらのレベルの例を示したものです。 このビットマップ テクスチャは、主観視点の 3D ゲームにおけるコンテナーの警告表示を表しています。 ミップマップとして作成すると、解像度が最も高いテクスチャが先頭になります。 ミップマップ セット内のその後に続く各テクスチャの高さと幅は 2 の累乗ずつ小さくなります。 この場合、解像度が最も高いミップマップは 256 × 256 ピクセルです。 次のテクスチャは 128 × 128 です。 チェーン内の最後のテクスチャは 64 × 64 です。
この表示は、可視範囲から最大の距離にあります。 ユーザーがこの表示から遠く離れたところからゲームを始めた場合、ミップマップ チェーン内の最小のテクスチャ (この場合は 64 x 64 のテクスチャ) が表示されます。
ユーザーが視点を警告表示に近づけるにつれて、徐々にミップマップ チェーン内の解像度が高いテクスチャが使用されます。 次の図の解像度は 128 x 128 です。
次の図に示すように、ユーザーの視点が警告表示からの許容最短距離にあるとき、解像度が最も高いテクスチャが使用されます。
これは、テクスチャの遠近の見え方をシミュレートする際の効率的な方法です。 1 つのテクスチャを多くの解像度でレンダリングするよりも、複数のテクスチャを各解像度で使用する方が時間がかかりません。
Direct3D では、ミップマップ セット内のどのテクスチャが目的とする出力に最も近い解像度であるかを評価し、そのテクセル空間にピクセルをマッピングすることができます。 最終画像の解像度がミップマップ セット内の複数のテクスチャ解像度の間にある場合、Direct3D では、両方のミップマップのテクセルを調べて、そのカラー値をブレンドします。
ミップマップを使用するには、アプリケーションでミップマップのセットを作成する必要があります。 アプリケーションでは、ミップマップ セットを現在のテクスチャ セットの最初のテクスチャとして選択することによって、ミップマップを適用します。 「テクスチャ ブレンド」をご覧ください。
次に、Direct3D でテクセルのサンプリングに使用するフィルタリング方法を設定する必要があります。 最も時間がかからないミップマップ フィルタリング方法は、Direct3D で最も近いテクセルを選択する方法です。 これを選択するには、D3DTEXF_POINT 列挙値を使用します。 Direct3D では、D3DTEXF_LINEAR 列挙値を使用すると、より適切なフィルタリング結果を生成することができます。 これによって最も近いミップマップが選択され、テクスチャ内の現在のピクセルがマッピングされる位置の周辺で、テクセルの加重平均が計算されます。
ミップマップ テクスチャは 3D シーンで使用され、シーンのレンダリングに必要な時間が短縮されます。 また、シーンのリアリティも増します。 ただし、多くの場合、大量のメモリを必要とします。
注 ミップマップ チェーンの各サーフェスのサイズは、チェーン内の直前のサーフェスの半分です。 最上位のミップマップのサイズが 256 x 128 である場合、第 2 レベルのミップマップのサイズは 128 x 64、第 3 レベルは 64 x 32 というように小さくなり、最終的には 1 x 1 になります。 Levels では、チェーン内のミップマップの幅または高さが 1 より小さくなるようなミップマップ レベルを指定することはできません。 最上位のミップマップ サーフェスが 4 × 2 の単純な場合、Levels の有効最大値は 3 です。 最上位のサイズが 4 × 2 である場合、第 2 レベルのサイズは 2 × 1、第 3 レベルのサイズは 1 × 1 になります。 Levels の値が 3 よりも大きい場合、第 2 レベルのミップマップの高さが小数値になるので、許可されません。
Direct3D は、ミップマップのテクスチャ フィルタ リングを自動的に実行できます。 アプリケーションでは、ミップマップ チェーン内を手動で移動して、チェーン内の各サーフェスにビットマップ データをロードする必要があります。 通常は、この目的のみにチェーン内を移動します。 テクスチャの作成時にミップマップを自動的に生成すると、ミップマップはビデオ メモリに格納されるため、ハードウェア フィルタリングを利用できます。
関連トピック