テクスチャマッピング
■概要
テクスチャマッピングはピクセルシェーダで行われている処理の一つで
テクスチャの一部を切り出し、ポリゴンに貼り付ける(マッピング)処理のことです。
DirectX9ではレンダリングパイプラインで行われているので、
テクスチャ設定と頂点情報にテクスチャ座標を指定することで簡単に実装可能です。
テクスチャマッピングを実際に使用するには以下の設定が必要です。
●頂点データへのテクスチャ座標の設定
頂点データの設定はまずFVFフォーマットにテクスチャを使用することを設定し、
その設定に沿った頂点構造体を宣言します。
・FVF設定
#define VERT_FVF(D3DFVF_XYZ | D3DFVF_DIFFUZE | D3DFVF_TEX1)
・頂点構造体
typdef struct
{
D3DXVECTOR3 m_Pos;
DWORD m_Color;
D3DXVECTOR2 m_UV;
} TEX_VERTEX;
※テクスチャを表示させるだけならD3DFVF_XYZとD3DFVF_TEX1だけで問題ありません。
●テクスチャ画像の読み込み
テクスチャの読み込みはD3DXCreateTextureFromFile
またはD3DXCreateTextureFromFileExを使用して読み込みを行います。
D3DXCreateTextureFromFile:
抜き色の指定がないので必要な引数も少なく、単純な内容になっています。
D3DXCreateTextureFromFileEx:
抜き色等の細かい指定ができるので、引数の指定が多くなっています。
●テクスチャ座標
テクスチャマッピングを行う際にテクスチャ座標を指定する必要があります。
テクスチャ座標は縦、横ともに0.0~1.0までの範囲で指定します。
横をU軸、縦をV軸というためにUV座標と呼ばれることもあります。
●テクスチャステージ
DirectXのテクスチャマッピングではテクスチャ画像の座標値をもとにして
テクスチャのピクセル(テクセル)を一つ一つ取り出して
ポリゴンや、既に合成済みのピクセルと合成を行い、ピクセルを作り出して、
新しいピクセル情報とします。
この新しいピクセルを作り出すための処理ブロックをテクスチャステージといいます。
ピクセル:
コンピュータでの画像を構成する単位のことで、
色情報や奥行き、透明度などの情報が含まれている。
例えば640 * 480の画像の場合、307200個の
ピクセル情報によって画像が構成されています。
DirectXではテクスチャステージの設定はSetTextureStageStateで行われます。
以下はSetTextureStageStateで設定できる情報や処理方法の一例です。
・テクスチャステージで設定できる情報:
・ディフューズ成分
・スペキュラー成分
・テクスチャーカラー(テクセル)成分
・設定情報に対しての処理方法
・どちらかをそのまま出力する(色の合成をしない)
・両方を掛け合わせる
・両方を足し合わせる
SetTextureStageStateを使用していない場合はデフォルト設定が使用されています。
デフォルト設定の内容は「色はポリゴンの色とテクスチャの色の乗算、
α値はテクスチャのα値のみ使用」です。
乗算:
乗算は文字通り色成分同士で掛け算を行うのですが、
掛け算の結果としてほとんどが255を超える計算になってしまうので、
乗算の結果に対して255で除算を行います。
例:
色成分1:RGB = (248, 75, 128)
色成分2:RGB = (255, 83, 192)
色成分1 * 色成分2
R: 248 * 255 / 255 = 248
G: 75 * 83 / 255 = 24
B: 128 * 192 / 255 = 96
上の例の乗算結果のように乗算は255以外の値で計算を行うと
元の色情報よりも小さい値になります。
掛け算なので、計算前よりも明るくなると考える方もいますが、
元の色よりも暗くなりますので、注意してください。
テクスチャステージの特徴:
テクスチャステージでは色成分と透明度は別の情報として扱われており、
合成処理の設定も各自で設定する必要があります。
例えば合成処理で加算したいと思ったら、色成分と透明度の両方に
加算設定を行わないといけません。
SetTextureStageStateの使用方法:
以下はSetTextureStageStateの関数に渡す引数の内容です。
この引数に適切な値を設定することで「合成成分1」「合成成分2」
「合成処理内容」の内容が決まります。
SetTextureStageStateの内容:
第一引数:
テクスチャステージ番号
第二引数:
テクスチャステージに渡す引数または合成処理の設定
第三引数:
第二引数の詳細設定
●テクスチャの貼り付け
テクスチャステージの設定が終わったらポリゴンに貼り付けるテクスチャの設定をします。
テクスチャ貼り付けの関数はSetTextureです。
この関数で設定したテクスチャがSetTextureStageStateのD3DTA_TEXTUREとして使用されます。
SetTextureの内容:
第一引数:
テクスチャステージ番号
第二引数:
テクスチャのポインタ
■マルチテクスチャ
マルチテクスチャとは一枚のポリゴンに複数のテクスチャを貼り付ける方法のことです。
DirectX9では一回のテクスチャステージの合成で使用できるテクスチャは一枚のみと決まっているので、
マルチテクスチャを実装した場合、設定したテクスチャの枚数分のテクスチャステージが実行されます。
●頂点データの変更
頂点データの設定はFVFフォーマットに2枚目のテクスチャを使用する設定をして、
その設定に沿った頂点構造体を宣言します。
・FVF設定
#define VERT_FVF(D3DFVF_XYZ | D3DFVF_DIFFUZE | D3DFVF_TEX1 | D3DFVF_TEX2)
・頂点構造体
typdef struct
{
D3DXVECTOR3 m_Pos;
DWORD m_Color;
D3DXVECTOR2 m_UV;
D3DXVECTOR2 m_UV2; // 2枚目テクスチャのUV座標
} TEX_VERTEX;
●テクスチャステージの設定
マルチテクスチャのテクスチャステージは各テクスチャごとに
設定を行う必要がありますが、基本的な仕様は通常と変わりません。
以下の内容がマルチテクスチャ時の変更点になります。
・テクスチャステージ番号の変更
「設定中のテクスチャが何枚目なのか」という点で
値を変更する必要があります。
1枚目なら0、2枚目なら1というように、テクスチャの枚数ごとに
ステージ番号を加算してください。
・第三引数でD3DTA_CURRENTを使用する
D3DTA_CURRENTは「前のテクスチャステージで合成された結果を使用する」という
意味を持っていますので、色、透明度ともに引数設定の種類では
テクスチャステージの引数のどちらかにD3DTA_CURRENTを使用してください。
・例
// 一枚目のテクスチャのテクスチャステージ設定
SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
// 二枚目のテクスチャのテクスチャステージ設定
SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
●テクスチャの貼り付け
テクスチャの貼り付けは通常と同じでSetTextureを使用します。
マルチテクスチャの場合は、テクスチャの枚数分のSetTextureを呼び出して
設定してもらう必要があります。
マルチテクスチャ(2枚使用)のSetTextureの例:
SetTexture(0, 1枚目のテクスチャのポインタ);
SetTexture(1, 2枚目のテクスチャのポインタ);
■抜き
抜きとは画像における透明な領域の通称のことです。
絵が抜けて背景などが見えることからきており、完全な透明部分(アルファ値が0)を
指していることが多いです。
●抜き色
24bitや256色の画像ファイルなどのアルファ値を持つことができない画像では
特定の色を指定してその色が使用されている部分はアルファ値0として扱い、
描画を行わないという方法がよく使われています。
このアルファ値0として扱われる特定の色のことを抜き色と呼んでいます。
抜き色は緑(R:0 G:255 B:0)やマゼンダ(R:255 G:0 B:255)のような
あまり使用されない色が指定されています。