バイリニア テクスチャー フィルタリング (Direct3D 9)
テクスチャーは常に、図 7a のように、左上隅の (0.0, 0.0) から右下隅の (1.0, 1.0) へと線形的に座標が割り当てられます。
テクスチャーは通常、単色のカラー ブロックで構成されているように表されますが、実際には、ラスター表示の概念と同様にテクスチャーについても考えるとより正確です。各テクセルは、図 7b のように、グリッド セルのちょうど中心で定義されます。
UV 座標 (0.375, 0.375) におけるこのテクスチャーのカラーをテクスチャー サンプラーに要求すると、単色の赤 (255, 0, 0) を受け取ります。赤のテクセルのセルのちょうど中心は UV (0.375, 0.375) にあるので、これは問題ありません。UV (0.25, 0.25) におけるテクスチャーのカラーをサンプラーに要求した場合はどうでしょうか。UV (0.25, 0.25) のポイントは 4 つのテクセルのちょうど隅にあるので、これはそれほど容易ではありません。
最も単純な方法は、最も近いテクセルのカラーをサンプラーが返すようにする方法です。これは点フィルタリング (「最近点サンプリング (Direct3D 9)」を参照) と呼ばれ、結果が粗くなったり、むらができたりするので、一般には望ましくありません。UV (0.25, 0.25) におけるテクスチャーの点サンプリングによって、最近点フィルタリングに関する別の複雑な問題が明らかになります。サンプリング ポイントから等距離のテクセルが 4 つあるので、最も近いテクセルが 1 つあるわけではありません。この 4 つのテクセルのいずれかが、返されるカラーとして選択されますが、選択されるテクセルは座標の丸め方によって異なり、不自然なテアリングが生じる可能性があります (SDK の最近点サンプリングに関する記事を参照してください)。
もう少し正確で一般的なフィルタリング方法は、サンプリング ポイントに最も近い 4 つのテクセルの加重平均を計算する方法です。これは、バイリニア フィルタリングと呼ばれます。このルーチンは最近のグラフィック ハードウェアに実装されているので、通常、増加する計算コストはごくわずかです。バイリニア フィルタリングを使用して、さまざまなサンプル ポイントで取得するカラーを次に示します。
UV: (0.5, 0.5)
このポイントは、赤、緑、青、および白の各テクセル間のちょうど境界にあります。サンプラーが返すカラーは灰色です。
0.25 * (255, 0, 0)
0.25 * (0, 255, 0)
0.25 * (0, 0, 255)
+ 0.25 * (255, 255, 255)
------------------------
= (128, 128, 128)
UV: (0.5, 0.375)
このポイントは、赤と緑のテクセル間の境界の中点にあります。サンプラーが返すカラーは黄灰色です (青と白のテクセルのコントリビューションのスケールは 0 に設定されています)。
0.5 * (255, 0, 0)
0.5 * (0, 255, 0)
0.0 * (0, 0, 255)
+ 0.0 * (255, 255, 255)
------------------------
= (128, 128, 0)
UV: (0.375, 0.375)
これは、返されたカラーである赤のテクセルのアドレスです (フィルタリング計算における他のすべてのテクセルの重みは 0 に設定されています)。
1.0 * (255, 0, 0)
0.0 * (0, 255, 0)
0.0 * (0, 0, 255)
+ 0.0 * (255, 255, 255)
------------------------
= (255, 0, 0)
これらの計算を図 7c と比較してみましょう。この図は、4 × 4 テクスチャー内の各テクスチャー アドレスでバイリニア フィルタリング計算を実行した場合に表示されるカラーを示しています。