テクスチャー ラッピング (Direct3D 9)
テクスチャー ラッピングは、簡単に言うと、Direct3D が各頂点に指定されたテクスチャー座標を使用して、テクスチャー処理されたポリゴンをラスター化する際の基本的な処理方法を変更することです。ポリゴンをラスター化するときに、システムは、ポリゴンの各頂点のテクスチャー座標の間を補間して、ポリゴンのすべてのピクセルに使用するテクセルを決定します。通常、システムはテクスチャーを 2D 平面として扱い、テクスチャー内の点 A から点 B までの最短経路を取ることによって新しいテクセルを補間します。点 A が u, v 位置 (0.8, 0.7) にあり、点 B が (0.1,0.1) にある場合、補間の線は次の図のようになります。
この図では、A と B の間の最短距離がテクスチャーのほぼ中央を通っています。u または v のテクスチャー座標のラッピングを有効にした場合、Direct3D で u 方向および v 方向のテクスチャー座標間の最短経路を判定する方法が変わります。定義では、テクスチャー ラッピングによって 0.0 と 1.0 が同じ位置になると仮定され、ラスタライザーがテクスチャー座標間の最短経路を決定します。これは、理解が難しい部分です。次のように考えてみましょう。一方向のテクスチャー ラッピングを有効にすると、システムは、円柱の周囲に巻き付いているかのようにテクスチャーを扱います。たとえば、次の図を検討してみましょう。
この図は、u 方向のラッピングによって、テクスチャー座標の補間方法が影響を受けるようすを示しています。ラッピングされていない通常のテクスチャーの例と同じ点を使用すると、点 A と点 B 間の最短経路がテクスチャーの中央を通っていないことがわかります。この場合は、0.0 と 1.0 が重なっている境界線を横切っています。v 方向のラッピングも同様です。ただし、横置きになった円柱の周囲にテクスチャーが巻き付けられます。u 方向と v 方向両方のラッピングはさらに複雑です。この場合は、円環面、つまりドーナツ状のテクスチャーを想像してください。
テクスチャー ラッピングを実際に使用した最も一般的なアプリケーションは、環境マッピングの実行です。通常、環境マップでテクスチャー処理したオブジェクトは非常に反射しやすく、オブジェクトの周囲のミラー イメージがシーンに表示されます。これを説明するために、4 つの壁に囲まれた部屋を考えてみましょう。壁にはそれぞれ R、G、B、Y という文字が描かれており、それぞれに対応する赤、緑、青、および黄色のカラーが塗られています。このような単純な部屋の環境マップは、次の図のようになります。
この部屋の天井が、完全に反射する、4 面から成る 1 本の柱で支えられているとします。この柱に環境マップ テクスチャーをマッピングするのは簡単ですが、文字とカラーが柱に反射しているように見せるのは容易ではありません。次の図は、上部の頂点付近に該当するテクスチャー座標を記載した、柱のワイヤー フレームを示したものです。ラッピングがテクスチャーのエッジを横切る継ぎ目は、点線で示しています。
u 方向でラッピングが有効になっているので、テクスチャー処理した柱には、環境マップのカラーとシンボルが適切に表示されており、テクスチャーの前面の継ぎ目では、ラスタライザーによって、テクスチャー座標間の最短経路が正しく選択されています。この場合、u 座標の 0.0 と 1.0 が重なっていることを前提としています。テクスチャー処理した柱は、次の図のようになります。
テクスチャー ラッピングが有効でない場合、ラスタライザーは、期待される反射イメージの生成に必要な方向で補間しません。代わりに、u 座標 0.175 と 0.875 間のテクセルはテクスチャーの中心を通り、柱の前面の領域では水平方向で圧縮されたテクセルが使用されます。ラップの効果は適用されていません。
テクスチャー ラッピングの使用
テクスチャー ラッピングを有効にするには、次のコード例のように IDirect3DDevice9::SetRenderState メソッドを呼び出します。
d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0);
IDirect3DDevice9::SetRenderState が取る最初のパラメーターは、設定するレンダリング ステートです。ラッピングを設定するテクスチャー レベルの D3DRS_WRAP0 ~ D3DRS_WRAP7 の列挙値のいずれかを指定します。2 番目のパラメーターでは D3DWRAPCOORD_0 ~ D3DWRAPCOORD_3 フラグを指定して、対応する方向のテクスチャー ラッピングを有効にするか、これらを組み合わせて複数の方向のラッピングを有効にします。フラグを省略すると、対応する方向のテクスチャー ラッピングが無効になります。複数のテクスチャー座標に対してテクスチャー ラッピングを無効にするには、対応するレンダリング ステートの値を 0 に設定します。
テクスチャー ラッピングを、類似する名前のテクスチャー アドレッシング モードと混同しないでください。テクスチャー ラッピングは、テクスチャー アドレッシングの前に実行されます。テクスチャー ラッピング データに、[0.0, 1.0] の範囲外のテクスチャー座標が含まれないようにしてください。このような座標が含まれている場合、予測できない結果になる場合があります。テクスチャー アドレッシングの詳細については、「テクスチャー アドレッシング モード (Direct3D 9)」を参照してください。
ディスプレースメント マップ ラッピング
ディスプレースメント マップは、テセレーション エンジンによって補間されます。テセレーション エンジンにはラップ モードを指定できないので、ディスプレースメント マップを使用してテクスチャー ラッピングを実行することはできません。アプリケーションは、強制的に補間を実行する頂点を使用して、任意の方向にラッピングすることができます。また、単純な線形補間として実行されるように補間を指定することもできます。