ページ 11

【DirectXプログラミング】加算合成について

Posted: 2010年6月30日(水) 23:12
by シエル
いつもお世話になります。
DirectXプログラミングでの、加算合成について質問があります。
ある画像を明るくするために、下記のような関数を作りました。
下記の関数の中のDrawPrimitiveの呼び出し回数を増やせば増やすほど、画像が明るくなっていったのですが、
加算合成の方法として、これは正しい方法なのでしょうか?

void Draw()
{
LPVOID lpvwrite;

VERTEX Triangle[4]={
{200.0f,0.0f,0.0f,1.0f,D3DCOLOR_ARGB(200,0,200,200),1.0f,0.0f},
{200.0f,200.0f,0.0f,1.0f,D3DCOLOR_ARGB(200,0,200,200),1.0f,1.0f},
{0.0f,0.0f,0.0f,1.0f,D3DCOLOR_ARGB(200,200,0,200),0.0f,0.0f},
{0.0f,200.0f,0.0f,1.0f,D3DCOLOR_ARGB(200,0,200,200),0.0f,1.0f}
};

lpd3dvb9->Lock(NULL,sizeof(VERTEX)*4,&lpvwrite,0);
memcpy(lpvwrite,Triangle,sizeof(VERTEX)*4);
lpd3dvb9->Unlock();

lpd3dv9->SetStreamSource(0,lpd3dvb9,0,sizeof(VERTEX));

lpd3dv9->SetTexture(0,lpd3dtex9);

lpd3dv9->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
lpd3dv9->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);

lpd3dv9->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
lpd3dv9->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);

lpd3dv9->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
lpd3dv9->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ONE);
lpd3dv9->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);

lpd3dv9->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);//これを増やす
lpd3dv9->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);//これを増やす
}


また、別の質問なのですが、
透明度の設定を↓のようにした場合、テクスチャの透明度が設定されると思いますが、
この透明度の「値」はどこで設定するものなのでしょうか?
(画像を段々消えていくようにしたいと思っています。)
lpd3dv9->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
lpd3dv9->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);

Re:【DirectXプログラミング】加算合成について

Posted: 2010年6月30日(水) 23:57
by Justy
>加算合成の方法として、これは正しい方法なのでしょうか?
 何を以て正しいというのかによって判断が変わってきますが、動いているなら正しいのではないかと。
 ちなみに私は SRCBLENDは D3DBLEND_SRCALPHA、DESTBLENDは D3DBLEND_ONEで加算することが多いです。


>この透明度の「値」はどこで設定するものなのでしょうか?
 ALPHAOPを D3DTOP_SELECTARG1にしないで D3DTOP_MODULATEなどにした上で D3DTSS_ALPHAARG2を
指定すればいいです。

 例えば
[color=#d0d0ff" face="monospace] lpd3dv9->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
lpd3dv9->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
lpd3dv9->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
[/color]
とすればテクスチャのアルファとディフューズカラーのアルファを掛け合わせたものが
表示されます。

Re:【DirectXプログラミング】加算合成について

Posted: 2010年7月01日(木) 00:02
by シエル
Justyさん!ありがとうございます!

>とすればテクスチャのアルファとディフューズカラーのアルファを掛け合わせたものが
>表示されます。
このテクスチャの「アルファ」とディフューズカラーの「アルファ」の「値」の設定方法が
知りたいのです。

テクスチャのアルファはグラフィックソフトで設定しているのでしょうか?
ディフューズカラーのアルファは、↓のD3DCOLOR_ARGBで設定しているアルファ値のことですか?
VERTEX Triangle[4]={
{200.0f,0.0f,0.0f,1.0f,D3DCOLOR_ARGB(200,0,200,200),1.0f,0.0f},
{200.0f,200.0f,0.0f,1.0f,D3DCOLOR_ARGB(200,0,200,200),1.0f,1.0f},
{0.0f,0.0f,0.0f,1.0f,D3DCOLOR_ARGB(200,200,0,200),0.0f,0.0f},
{0.0f,200.0f,0.0f,1.0f,D3DCOLOR_ARGB(200,0,200,200),0.0f,1.0f}
};

Re:【DirectXプログラミング】加算合成について

Posted: 2010年7月01日(木) 00:07
by Justy
>グラフィックソフトで設定しているのでしょうか?
 そうです。


>D3DCOLOR_ARGBで設定しているアルファ値のことですか
 そうです。

Re:【DirectXプログラミング】加算合成について

Posted: 2010年7月01日(木) 00:08
by シエル
いつもありがとうございます!
これにて解決にさせていただきます!