Microsoft DirectX 8.0 (C++)

テクセルとピクセル間の直接マッピング

スクリーン上のピクセルにテクセルを直接マッピングするなど、アプリケーションでは通常、シーン内のジオメトリにテクスチャを適用する必要がある。たとえば、テクスチャ内のテキストをシーン内のオブジェクトに表示する必要があるアプリケーションを考える。テクスチャ内のテキスト情報をはっきりと表示するには、テクスチャを施すジオメトリが、テクスチャ フィルタリングによって崩れていないテクセルを確実に受け取るための何らかの方法が必要である。これが行われないと、ぼんやりした画像になったり、ポイント サンプル テクスチャ フィルタリングの場合にはエッジが粗くなる可能性がある。

Microsoft® Direct3D® では、画像とテクスチャのフィルタリングをサポートする一方で、ピクセルとテクスチャのサンプリング ルールは、ピクセルとテクスチャのサンプリングを単一化するように慎重に定義されているため、テクスチャのテクセルを取得してスクリーン上のピクセルに直接マッピングする処理は重要で、困難な作業になることが多い。そのため、頂点に対する浮動小数点テクスチャ座標が、ラスタライザで使用する整数ピクセル座標にどのようにマッピングされるかについて十分に理解しておく必要がある。

Direct3D では、次の計算を実行して、浮動小数点テクスチャ座標をテクセル アドレスにマッピングする。

これらの公式では、TxTy は水平方向と垂直方向の出力テクセル座標、uv は頂点に対して提供される水平方向と垂直方向のテクスチャ座標である。MxMy 要素は、現在のミップマップ レベルでの水平方向と垂直方向のテクセル数を表す。説明の後半では、テクセルとピクセル間の水平方向マッピングについて解説する。垂直方向マッピングは水平方向にマッピングする場合と同じである。

テクスチャ座標の上限と下限の 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 を使用する場合、ピクセルとテクセルが一列に並ぶ。両方のサイズがほぼ同じで適切に整列していれば、次の図に示すように、これらはテクセルとピクセル間で正確に対応する。