テクスチャはりはり(3Dデータ)
最初のサンプルではテクスチャを使わなかったので、以下のような定義でしたが
//頂点フォーマット struct D3DVERTEXCOR { float x,y,z; // 座標 DWORD color; // 頂点カラー enum { FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE } ; };
テクスチャを扱う場合、テクスチャのUV値が必要になり、以下のようになりました
//頂点フォーマット struct D3DVERTEXTEX1 { float x,y,z; // 座標 float u1,v1; // テクスチャのUV値 enum { FVF = D3DFVF_XYZ | D3DFVF_TEX1 } ; };
「d3d9types.h」に記述されている部分です。
// Flexible vertex format bits // #define D3DFVF_RESERVED0 0x001 #define D3DFVF_POSITION_MASK 0x400E #define D3DFVF_XYZ 0x002 #define D3DFVF_XYZRHW 0x004 #define D3DFVF_XYZB1 0x006 #define D3DFVF_XYZB2 0x008 #define D3DFVF_XYZB3 0x00a #define D3DFVF_XYZB4 0x00c #define D3DFVF_XYZB5 0x00e #define D3DFVF_XYZW 0x4002 #define D3DFVF_NORMAL 0x010 #define D3DFVF_PSIZE 0x020 #define D3DFVF_DIFFUSE 0x040 #define D3DFVF_SPECULAR 0x080 #define D3DFVF_TEXCOUNT_MASK 0xf00 #define D3DFVF_TEXCOUNT_SHIFT 8 #define D3DFVF_TEX0 0x000 #define D3DFVF_TEX1 0x100 #define D3DFVF_TEX2 0x200 #define D3DFVF_TEX3 0x300 #define D3DFVF_TEX4 0x400 #define D3DFVF_TEX5 0x500 #define D3DFVF_TEX6 0x600 #define D3DFVF_TEX7 0x700 #define D3DFVF_TEX8 0x800 #define D3DFVF_LASTBETA_UBYTE4 0x1000 #define D3DFVF_LASTBETA_D3DCOLOR 0x8000 #define D3DFVF_RESERVED2 0x6000 // 2 reserved bits
だいたい、この辺だけを覚えておけば、良さそうですね
D3DFVF_XYZ :頂点座標(変換前) (D3DFVF_XYZRHW フラグと共に使うことはできない) D3DFVF_XYZRHW :頂点座標(変換後) (D3DFVF_XYZ フラグと共に使うことはできない) D3DFVF_NORMAL :頂点法線ベクトル (D3DFVF_XYZRHW フラグと共に使うことはできない) D3DFVF_DIFFUSE :ディフューズ色 D3DFVF_SPECULAR:鏡面反射色(スペキュラ色) D3DFVF_TEX0-8 :テクスチャのUV値
以前、マルチテクスチャの実験をしたとき
D3DFVF_TEX1 | D3DFVF_TEX2
と書くのだと勘違いした時もありました「D3DFVF_TEX2」だけでよいですね
各フラグの情報です。
D3DFVF_XYZ :float x,y,z; D3DFVF_XYZRHW :float x,y,z,rhw; D3DFVF_NORMAL :float nx,ny,nz; D3DFVF_DIFFUSE :DWORD color; D3DFVF_SPECULAR :DWORD specular; D3DFVF_TEX0-8 :float u1,v1;
全部入りの場合は、こんな感じですかね
//頂点フォーマット struct D3DVERTEXTEX1 { float x,y,z; // 座標 float nx,ny,nz; // 法線 DWORD color; // ディフューズ色 DWORD specular; // スペキュラ色 float u1,v1; // テクスチャのUV値 enum { FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1 } ; };