Microsoft DirectX 8.0 (C++)

シングルテクスチャ シェーダ

ここでは、位置とテクスチャ座標を持つ単純な頂点シェーダを初期化および使用するために必要なステップについて説明する。

最初のステップでは、位置とテクスチャ座標を格納する構造体を宣言する。これを、次のサンプル コードに示す。

struct XYZBuff
{
    D3DVALUE x, y, z;
};

struct TEX0Buff
{
    D3DVALUE tu, tv;
};

#define XYZBUFF  (D3DFVF_XYZ)
#define TEX0BUFF (D3DFVF_TEX1)

次のステップでは、頂点シェーダ宣言を作成する。これを、次のサンプル コードに示す。

DWORD decl[] =
{
    D3DVSD_STREAM(0),
    D3DVSD_REG( D3DVSDE_POSITION, D3DVSDT_FLOAT3 ),
    D3DVSD_STREAM(1),
    D3DVSD_REG( D3DVSDE_TEXCOORD0, D3DVSDT_FLOAT2 ),
    D3DVSD_END()
};

次のステップでは、IDirect3DDevice8::CreateVertexShader メソッドを呼び出して頂点シェーダを作成する。

g_d3dDevice->CreateVertexShader( decl, NULL, &vShader, 0);

CreateVertexShader の第 2 パラメータに NULL を渡して、この頂点シェーダで固定機能パイプラインを使用することを Direct3D に指示する。

頂点バッファと頂点シェーダは、作成後はいつでも使用できる。次のサンプル コードは、頂点シェーダの設定方法、ストリーム ソースの設定方法、および新しい頂点シェーダを使用する三角形リストの描画方法を示している。

g_d3dDevice->SetVertexShader( &vShader );
g_d3dDevice->SetStreamSource( 0, xyzbuf, 4 * sizeof(FLOAT));
g_d3dDevice->SetStreamSource( 1, tex0buf, 2 * sizeof(FLOAT));
g_d3dDevice->SetIndices( pIB, 0 );
g_d3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, max - min + 1, 0, count / 3 );