【Direct3D による画面表示について。】

g_lpD3DDEV->SetRenderState( D3DRS_ALPHABLENDENABLE,   TRUE );
g_lpD3DDEV->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );
g_lpD3DDEV->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

上の部分は、アルファブレンディング(半透明描画)を使用するように設定しています。

    if (g_bCanGreaterEqual){
        g_lpD3DDEV->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
        g_lpD3DDEV->SetRenderState( D3DRS_ALPHAREF,        0x08 );
        g_lpD3DDEV->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
    }

アルファブレンディングは、描画処理の負荷が比較的高いので、
アルファ値比較関数を使って、透明部分のピクセルについては、
描画を行わないような処理にしています。

続いて次の部分を見てみよう。

    //    アニメーションの為の座標計算
    int    x,y;
    static double d1=0,d2=0;
    d1 += 0.07*timeElapsed;
    d2 += 0.05*timeElapsed;
    if (d1 > (D3DX_PI*2))
        d1 -= D3DX_PI*2;

    if (d2 > (D3DX_PI*2))
        d2 -= D3DX_PI*2;

    y = (int)(100*sin(d1));
    y += 240;
    x = (int)(200*sin(d2));
    x += 320;

三角関数を2つ組み合わせて簡単なリサージュ(Lissajous)曲線を生成させている。


続いて次の部分。

    int    sz = 48;
    //    四角形の頂点の設定
    TLVERTEX2D    pV[4];
    float    ru = g_fTexImageWidth;
    float    bv = g_fTexImageHeight;
    pV[0].x = (float)x;pV[0].y=(float)y;pV[0].z=0.0f;pV[0].rhw=1.0f;
    pV[0].tu = 0.0f;pV[0].tv=0.0f;pV[0].color=D3DCOLOR_XRGB(255,255,255);
    pV[1].x = (float)(x + sz);pV[1].y=(float)y;pV[1].z=0.0f;pV[1].rhw=1.0f;
    pV[1].tu = ru;pV[1].tv=0.0f;pV[1].color=D3DCOLOR_XRGB(255,255,255);
    pV[2].x = (float)(x + sz);pV[2].y=(float)(y + sz);pV[2].z=0.0f;pV[2].rhw=1.0f;
    pV[2].tu = ru;pV[2].tv=bv;pV[2].color=D3DCOLOR_XRGB(255,255,255);
    pV[3].x = (float)x;pV[3].y=(float)(y + sz);pV[3].z=0.0f;pV[3].rhw=1.0f;
    pV[3].tu = 0.0f;pV[3].tv=bv;pV[3].color=D3DCOLOR_XRGB(255,255,255);

ここで、4つの頂点を設定している。頂点は(x,y)で示される左上の点から、
(x+48,y+48) で示される右下の点までの矩形になっていて、頂点の設定は、
時計回りになっている。
また、それぞれの頂点にテクスチャ座標(0,0)-(1.0,1.0) の矩形を設定している。

頂点フォーマットは、d3dmain.h で設定していて、以下のとおりである。
struct	TLVERTEX2D{
	float	x,y,z;
	float	rhw;
	D3DCOLOR	color;
	float	tu,tv;
};
#define	FVF_TLVERTEX2D	(D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1)

次の部分は実際に描画を行っている部分である。

    //    描画の実行
    g_lpD3DDEV->SetTexture(0,g_pTexture);
    g_lpD3DDEV->SetVertexShader(FVF_TLVERTEX2D);
    g_lpD3DDEV->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,pV,sizeof(TLVERTEX2D));


以下、解説。
    g_lpD3DDEV->SetTexture(0,g_pTexture);

まず、ここで使用するテクスチャを設定。

    g_lpD3DDEV->SetVertexShader(FVF_TLVERTEX2D);

頂点フォーマットを設定

    g_lpD3DDEV->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,pV,sizeof(TLVERTEX2D));

ポリゴン描画の実行。



戻る