テクスチャ アドレシング モード

テクスチャ アドレシング モード

Microsoft® Direct3D® アプリケーションでは、どのプリミティブのどの頂点にもテクスチャ座標を割り当てることができる。詳細については、「テクスチャ座標」を参照すること。通常、頂点に割り当てるテクスチャ座標 u および v の範囲は、0.0 と 1.0 を含む 0.0 ~ 1.0 である。しかし、この範囲外のテクスチャ座標を割り当てて、特殊なテクスチャ エフェクトを作成することもできる。

テクスチャ アドレシング モードを設定することで、[0.0, 1.0] の範囲外のテクスチャ座標で Direct3D が行う処理を制御できる。たとえば、アプリケーションでテクスチャ アドレシング モードを設定して、プリミティブ全体にテクスチャをタイルのように張ることができる。次のトピックでさらに詳しく説明する。

Direct3D を使用して、アプリケーションではテクスチャ ラッピングを実行できる。テクスチャ アドレシング モードを D3DTADDRESS_WRAP に設定することと、テクスチャ ラッピングを実行することとは同じではないので注意すること。テクスチャ アドレシング モードを D3DTADDRESS_WRAP に設定すると、現在のプリミティブに適用される転送元テクスチャのコピーが複数生成される。テクスチャ ラッピングを有効にすると、テクスチャ処理されたポリゴンをシステムがラスタ処理する際の方法が変更される。詳細については、「テクスチャ ラッピング」を参照すること。

テクスチャ ラッピングを有効にすると、事実上 [0.0, 1.0] の範囲外にあるテクスチャ座標を無効にでき、このような不適切なテクスチャ座標のラスタ化の動作を未定義にできる。テクスチャ ラッピングが有効になっていると、テクスチャ アドレシング モードは使われない。テクスチャ ラッピングが有効になっている場合には、アプリケーションで指定するテクスチャ座標が0.0 より小さくなったり、1.0 より大きくならないように注意すること。

アドレシング モードの設定

IDirect3DDevice9::SetSamplerState メソッドを呼び出して、各テクスチャ ステージにテクスチャ アドレシング モードを設定できる。第 1 引数に目的のテクスチャ ステージ識別子を指定する。第 2 引数に D3DSAMP_ADDRESSU、D3DSAMP_ADDRESSV、または D3DSAMP_ADDRESSW 値を設定して、u、v、または w アドレシング モードを個別に更新する。IDirect3DDevice9::SetSamplerState に渡す第 3 引数は、設定されているモードを判別する。これには、D3DTEXTUREADDRESS 列挙型のいずれのメンバを指定してもかまわない。テクスチャ ステージの現在のテクスチャ アドレシング モードを取得するには、IDirect3DDevice9::GetSamplerState を呼び出し、D3DTEXTURESTAGESTATETYPE 列挙の D3DSAMP_ADDRESSU、D3DSAMP_ADDRESSV、または D3DSAMP_ADDRESSW メンバを使って、情報の取得対象のアドレシング モードを識別する。

デバイス制限

一般に、システムでは 0.0 ~ 1.0 (0.0 と 1.0 を含む) の範囲外にあるテクスチャ座標でも使用できるが、多くの場合、その許容範囲はハードウェア制限によって影響される。デバイス能力を取得すると、レンダリング デバイスはこの制限を D3DCAPS9 構造体の MaxTextureRepeat メンバに知らせる。このメンバ内の値は、デバイスで使用可能なテクスチャ座標の全範囲を示す。たとえば、この値が 128 の場合、入力テクスチャ座標は -128.0 ~ +128.0 の範囲内になければならない。この範囲外のテクスチャ座標を持つ頂点を渡すと無効になる。自動テクスチャ座標生成およびテクスチャ座標変換の結果として生成されたテクスチャ座標に対しても、これと同じ制限が適用される。

MaxTextureRepeat の解釈も D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE 能力ビットによって変わる。このビットを設定すると、D3DCAPS9MaxTextureRepeat メンバの値が定義どおりに正確に使われる。ただし、D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE が設定されていない場合は、テクスチャ反復制限は、テクスチャ座標によってインデックス化されたテクスチャのサイズに依存する。この場合、有効なテクスチャ座標の範囲を計算するために、MaxTextureRepeat は、現在のテクスチャ サイズによって最大詳細レベルでスケーリングされる必要がある。たとえば、テクスチャの寸法が 32 で、MaxTextureRepeat 値が 512 の場合、実際の有効なテクスチャ座標範囲は 512/32 = 16 となる。したがって、このデバイスでは -16.0 ~ +16.0 の範囲内にテクスチャ座標が存在する必要がある。

テクスチャ アドレシング モードの詳細については、以下のトピックを参照すること。