Platform SDK: DirectX |
スクリーン上のピクセルにテクセルを直接マッピングするなど、アプリケーションでは通常、シーン内のジオメトリにテクスチャを適用する必要がある。たとえば、テクスチャ内のテキストをシーン内のオブジェクトに表示する必要があるアプリケーションを考える。テクスチャ内のテキスト情報をはっきりと表示するには、テクスチャを施すジオメトリが、テクスチャ フィルタリングによって崩れていないテクセルを確実に受け取るための何らかの方法が必要である。これが行われないと、ぼんやりした画像になったり、ポイントサンプルテクスチャ フィルタリングの場合にはエッジが粗くなる可能性がある。
Direct3D では、画像とテクスチャのフィルタリングをサポートする一方で、ピクセルとテクスチャのサンプリング ルールは、ピクセルとテクスチャのサンプリングを単一化するように慎重に定義されているため、テクスチャのテクセルを取得してスクリーン上のピクセルに直接マッピングする処理は、重要で通常は困難になることが多い。そのため、頂点に対する浮動小数点テクスチャ座標が、ラスタライザで使用する整数ピクセル座標にどのようにマッピングされるかについて十分に理解しておく必要がある。
Direct3D では、次の計算を実行して、浮動小数点テクスチャ座標をテクセル アドレスにマッピングする。
この公式では、Tx と Ty は水平方向と垂直方向の出力テクセル座標、u と v は頂点に対する水平方向と垂直方向のテクスチャ座標である。Mx と My 要素は、現在のミップマップ レベルでの水平方向と垂直方向のテクセル数を表す (説明の後半では、テクセルとピクセル間の水平方向マッピングについて解説する。垂直方向マッピングは水平方向マッピングと同じである)。
テクスチャ座標の上限と下限の 0.0 と 1.0 をこれらの公式に代入すると、テクスチャ座標 0.0 は反復テクスチャ マップの最初と最後のテクセル間の中間点にマッピングされる。テクスチャ座標 1.0 は、現在の反復テクスチャ マップの最後のテクセルと次の反復テクスチャ マップ間の中間点にマッピングされる。テクセル幅が 4 の反復テクスチャで、ミップマップ レベルが 0 の場合、座標 0.0 と 1.0 は、次の図に示すようにマッピングされる。
マッピングについて理解しておくと、単純なバイアスをスクリーン空間のジオメトリ座標に適用して、各テクセルを対応するピクセルに強制的にマッピングすることができる。たとえば、4 つの辺があるポリゴン (つまり "四角形") で、前のテクスチャの各テクセルをスクリーン上の 1 つだけのピクセルにマッピングする場合、ジオメトリ座標でピクセルを強制的にオーバーラップして、各テクセルの中心を各ピクセルの中心に効果的に配置する必要がある。この結果、アプリケーションで多くの場合必要な 1 対 1 マッピングになる。
テクセル幅が 4 のテクスチャをピクセル座標 0 〜 3 にマッピングするには、それぞれスクリーン空間座標 –0.5 〜 3.5 とテクスチャ座標 0.0 〜1.0 を持つ、4 辺から成るポリゴンを (2 つの三角形を基に) 描画する。たとえば、スクリーン座標 0.0 にあるピクセルを例として考える。0.0 は最初の頂点 (-0.5) から 0.5 ピクセルだけ離れた位置座標にあり、合計幅が 4.0 であることから、反復テクスチャの座標は 0.125 になる (公式を思い出すこと)。これをテクスチャ サイズ 4 を基にスケーリングすると 0.5 になる。バイアスを 0.5 だけ減じるとテクスチャ アドレスが 0.0 になる。これは、マップ内の最初のテクセルに完全に対応する。
要約すると、テクスチャ座標はテクスチャ マップを両側で均等にオーバーラップする。テクスチャのサイズが 4 の場合、次のようなマッピングになる。
ピクセル座標は、テクセルの場合と同様に正規化される。したがって、頂点がレンダリング先のピクセルをオーバーラップし、その頂点でテクスチャ座標 0.0 と 1.0 を使用する場合、2 つが一列に並ぶ。両方のサイズがほぼ同じで適切に整列していれば、次の図に示すように、これらはテクセルとピクセル間で正確に対応する。