Share via


テクスチャ ラッピング

テクスチャ ラッピング

簡単に言えば、テクスチャ ラッピングとは、Microsoft® Direct3D® で各頂点に対して指定されたテクスチャ座標を使って、テクスチャ処理したポリゴンをラスタ化する際の基本的な方法を変更する処理である。ポリゴンのラスタ化中に、システムはポリゴンの各頂点のテクスチャ座標の間を補間して、ポリゴンのすべてのピクセルに使うテクセルを決める。通常、システムはテクスチャを 2D 平面として扱い、テクスチャ内の点 A から点 B までの最短経路をとることで新しいテクセルを補間する。点 A が u, v 位置座標 (0.8, 0,1) で、点 B が (0.1,0.1) の場合、補間の線は次の図のようになる。

補間の線

上の図では、AB 間の最短距離がテクスチャのほぼ中央を通っている。u または v のテクスチャ座標のラッピングを有効にすると、u および v 方向でのテクスチャ座標間の最短経路を Direct3D が認識する方法が変化する。定義では、0.0 と 1.0 が同じ位置座標を占めると仮定して、テクスチャ ラッピングによってラスタライザがテクスチャ座標間の最短経路をとる。最後のビットは扱いにくいが、次のように考えるとわかりやすい。一方向のテクスチャ ラッピングを有効にすると、システムはテクスチャがあたかも円柱の周囲に巻き付いているかのようにテクスチャを扱う。たとえば、次の図を考える。

円柱

上の図は、u 方向のラッピングによって、システムによるテクスチャ座標の補間方法がどのように変化するかを示している。この例で使った同じ点を、正常なまたは巻き付けていないテクスチャに使うと、点 A と 点 B の最短距離がテクスチャの中心にないことがわかる。この場合、最短距離は 0.0 と 1.0 が共に位置する境界を通っている。v 方向のラッピングも同様である。ただし、側面が下になっている円柱の周囲にテクスチャが巻き付いている。u および v の両方向のラッピングの場合はさらに複雑である。この場合はトーラス、つまりドーナツを想像するとよい。

テクスチャ ラッピングを実際に使った最も一般的なアプリケーションは、環境マッピングの実行である。通常、環境マッピングでテクスチャ処理したオブジェクトは非常に反射的であり、シーンのオブジェクトの周囲にイメージが反映する。これを説明するため、四方が壁で囲まれた部屋を考える。壁にはそれぞれ R、G、B、および Y という文字が付けてあり、それに対応する赤色、緑色、青色、および黄色で塗られている。このような単純な部屋の環境マッピングであれば、次のようになる。

赤色・緑色・青色・黄色の垂直方向のストライプ

この部屋の天井が、4 面からなる非常に反射しやすい柱で支えられているとする。この柱に環境マッピングを実行するのは非常に簡単である。しかし、壁の文字と色が柱に反射しているように見せるのは簡単なことではない。次の図は、上方の頂点の近くのテクスチャ座標を適用した、柱のワイヤ フレームを示している。ラッピングがこのテクスチャのエッジを横切る「継ぎ目」は、点線で示す。

矩形と矩形を二分する点線

u 方向でラッピングが有効になっているので、テクスチャ処理した柱には、環境マッピングからの色とシンボルが正しく表示されており、テクスチャの前面の継ぎ目では、ラスタライザがテクスチャ座標間の最短経路を正しく選択している (u 座標 0.0 と 1.0 が同じ位置を占めるという前提)。テクスチャを適用した柱は、次の図に示すようになる。

赤色、緑色、青色、黄色の 4 つの部分で構成される矩形

テクスチャ ラッピングが有効でない場合、ラスタライザは、実物のように反射したイメージを生成するために必要な方向に補間を行わない。逆に、柱の前面部分では、u 座標の 0.175 および 0.875 間のテクセルが、テクスチャの中心を通るときに水平方向で圧縮され、ラップ エフェクトは崩れる。

テクスチャ ラッピングの使い方

テクスチャ ラッピングを有効にするには、次のサンプル コードに示すように、IDirect3DDevice9::SetRenderState メソッドを呼び出す。

d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0);

IDirect3DDevice9::SetRenderState が受け取る第 1 引数は、設定するレンダリング ステートである。ラッピングを設定するテクスチャ レベルを指定する D3DRS_WRAP0 ~ D3DRS_WRAP7 の列挙値のいずれかを指定する。第 2 引数に D3DWRAPCOORD_0 ~ D3DWRAPCOORD_3 フラグを指定して、対応する方向のテクスチャ ラッピングを有効にするか、これらのフラグを組み合わせて複数の方向のラッピングを有効にする。フラグを省略すると、対応する方向でのテクスチャ ラッピングが無効になる。テクスチャ座標のセットに対してテクスチャ ラッピングを無効にするには、対応するレンダリング ステートの値を 0 に設定する。

テクスチャ ラッピングと、類似した名前のテクスチャ アドレシング モードを混同しないこと。テクスチャ ラッピングは、テクスチャ アドレシングの前に実行される。テクスチャ ラッピングに [0.0, 1.0] の範囲外のテクスチャ座標が含まれないようにすること。このような座標が含まれている場合の結果は不定である。詳細については、「テクスチャ アドレシング モード」を参照すること。

ディスプレースメント マップとラッピング

ディスプレースメント マップは、テセレーション エンジンによって補間される。テセレーション エンジンではラップ モードを指定できないので、ディスプレースメント マップを使ってテクスチャ ラッピングを実行することはできない。アプリケーションは、強制的に補間を実行する一連の頂点を使って任意の方向にラッピングすることができる。また、アプリケーションは単純な線形補間による補間の実行を指定できる。