異方性フィルタリングの性質を理解するには、テクスチャマッピングの実際の意味をしっかりと理解する必要があります。
「テクスチャマッピング」という用語は、オブジェクト上の位置をテクスチャ内の場所に割り当てることを意味します。これにより、ラスタライザ/シェーダは、オブジェクトの位置ごとに、テクスチャから対応するデータをフェッチできます。これを行う従来の方法は、オブジェクトの各頂点にテクスチャ座標を割り当て、その位置をテクスチャ内の場所に直接マップすることです。ラスタライザは、さまざまな三角形の面にまたがってこのテクスチャ座標を補間し、テクスチャからカラーをフェッチするために使用されるテクスチャ座標を生成します。
それでは、ラスタライズのプロセスについて考えてみましょう。それはどのように機能しますか?三角形を取り、ピクセルサイズのブロックに分割します。これを「フラグメント」と呼びます。現在、これらのピクセルサイズのブロックは、画面に対してピクセルサイズです。
ただし、これらのフラグメントは、テクスチャに比べてピクセルサイズではありません。ラスタライザがフラグメントの各コーナーのテクスチャ座標を生成したと想像してください。次に、これらの4つのコーナーを、スクリーン空間ではなくテクスチャ空間で描画することを想像してください。これはどんな形でしょうか?
まあ、それはテクスチャ座標に依存します。つまり、テクスチャがポリゴンにどのようにマップされるかによって異なります。特定のフラグメントについては、軸に沿った四角形になる場合があります。軸に沿っていない正方形の場合があります。長方形かもしれません。台形かもしれません。それは、ほぼすべての4面の図(または少なくとも凸面の図)かもしれません。
テクスチャアクセスを正しく行っている場合、フラグメントのテクスチャカラーを取得する方法は、この長方形が何であるかを理解することです。次に、その四角形内のテクスチャからすべてのテクセルをフェッチします(カバレッジを使用して境界にある色をスケーリングします)。次に、それらすべてを平均します。それは完璧なテクスチャマッピングでしょう。
また、非常に遅くなります。
パフォーマンスのために、実際の答えを近似するようにしています。テクセル空間内のフラグメントの領域全体をカバーする4ではなく、1つのテクスチャ座標に基づいています。
ミップマップベースのフィルタリングは、低解像度の画像を使用します。これらの画像は基本的に、色の大きなブロックがブレンドされたときにどのように見えるかを事前に計算することにより、完璧な方法のショートカットです。したがって、より低いミップマップを選択すると、各テクセルがテクスチャの領域を表す事前計算された値が使用されます。
異方性フィルタリングは、固定数の追加サンプルを取得することにより、完璧な方法(ミップマッピングと組み合わせることができ、組み合わせる必要があります)を近似することによって機能します。しかし、まだテクスチャ座標が1つしか与えられていないため、フェッチするテクセル空間の領域をどのようにして把握するのでしょうか。
基本的に、それはだまします。フラグメントシェーダーは2x2の隣接ブロックで実行されるため、画面空間XおよびYでフラグメントシェーダーの任意の値の導関数を計算できます。次に、これらの導関数を実際のテクスチャ座標と組み合わせて使用して、真のフラグメントのテクスチャフットプリントはどうなるか。そして、この領域内で多数のサンプルを実行します。
これを説明するのに役立つ図は次のとおりです。
白黒の四角はテクスチャを表しています。これは、2x2の白と黒のテクセルのチェッカーボードです。
オレンジ色の点は、問題のフラグメントのテクスチャ座標です。赤いアウトラインはフラグメントのフットプリントであり、テクスチャ座標を中心にしています。
緑のボックスは、異方性フィルタリングの実装がアクセスする可能性のあるテクセルを表します(異方性フィルタリングアルゴリズムの詳細はプラットフォーム固有であるため、一般的なアイデアしか説明できません)。
この特定の図は、実装が4つのテクセルにアクセスする可能性があることを示唆しています。そうそう、緑色のボックスは7つをカバーしていますが、中央の緑色のボックスは小さなミップマップからフェッチできるため、1つのフェッチで4テクセルに相当するものをフェッチできます。実装はもちろん、単一のテクセルのものと比較して、そのフェッチの平均に4の重みを付けます。
異方性フィルタリングの制限が4(またはそれ以上)ではなく2の場合、実装はこれらのサンプルの2つを選択してフラグメントのフットプリントを表します。