2012/12/26
半加算合成が間違っていたので修正

今回は、エフェクトってほどのものではありませんが加算合成をやります

加算合成はすでに書かれている色に対して
これから描こうとしている色を
通常は塗りつぶしに対して、
加算合成の場合は色を足します

今回使うファイルは次のようになってます。どぞー(-ω-)つ旦
filedirect3d.h
filedirect3d.cpp
filetexture.h
filetexture.cpp
filesprite.h
filesprite.cpp
fileeffect.cpp(WinMain関数があるアプリケーション本体)
今回使う画像はこちら
・bomb.png
bomb.png
(↑右クリックで画像保存)

zipでほしい人はこちら
fileeffect.zip

爆発などの表現に使われます
というのは
コンピュータ上での色は
0x00000000は真っ黒に対して、0xffffffffは真っ白になります
つまり色を足すことで白に近づきます
あまり足しすぎると真っ白になるので注意しましょう

DirectX講座16回でやったSetRenderState関数をdirect3d.hに持っていきます

#pragma once

// Direct3Dクラスは同じなので略

// レンダーステートの設定
enum RENDERSTATE
{
	RENDER_DEFAULT,		// デフォルト(不透明)
	RENDER_ALPHATEST,	// αテスト
	RENDER_HALFADD,		// 半加算合成
	RENDER_ADD		// 加算合成
};

// レンダーステートの変更
void SetRenderState(IDirect3DDevice9* pD3DDevice,RENDERSTATE RenderState);

direct3d.cppでSetRenderState関数を拡張します

#include "direct3d.h"

// Direct3Dクラスのメンバ関数は同じなので略

// レンダーステートの変更
void SetRenderState(IDirect3DDevice9* pD3DDevice,RENDERSTATE RenderState)
{
	switch(RenderState)
	{
	case RENDER_DEFAULT:
		{
			// 不透明オブジェクト
			pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);		//アルファテストの無効化
			pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);		//アルファブレンディングの無効化
		}
		break;
	case RENDER_ALPHATEST:
		{
			// αテストによる透明領域の切り抜き
			pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);			//アルファテストの有効化
			pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x80);					//アルファ参照値
			pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);	//アルファテスト合格基準
			
			pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);			//アルファブレンディングの無効化
		}
		break;
	case RENDER_HALFADD:
		{		
			pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);			//アルファテストの無効化
			pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);			//アルファブレンディングの有効化
			pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );			//Zバッファへの書き込みを無効にする。
			//pD3DDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );			//Zテストを行わない			
			//pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );				//ライティングしない
			pD3DDevice->SetRenderState(D3DRS_BLENDOP,  D3DBLENDOP_ADD );		//ブレンディングオプション加算
			pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);		//SRCの設定
			pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);			//DESTの設定
		
		}
		break;
	case RENDER_ADD:
		{
			// 全加算合成
			pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);		//アルファブレンディングの有効化
			pD3DDevice->SetRenderState(D3DRS_BLENDOP,  D3DBLENDOP_ADD );	//ブレンディングオプション加算
			pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);		//SRCの設定
			pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);		//DESTの設定
			pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);		//アルファテストの無効化
		}
		break;
	}
}

effect.cppでSetRenderState関数を使います
DirectX講座16回と同様、描画直前に描画方法の指定をします

///////////////////////////////////////////////////////////////////////////////////////////////

			// 描画開始
			if(SUCCEEDED(direct3d.pDevice3D->BeginScene()))
			{
				DWORD ClearColor = 0xff808080;	// 背景クリア色
				// 背景クリア
				direct3d.pDevice3D->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, ClearColor, 1.0f, 0 );
				
				// 加算合成
				SetRenderState(direct3d.pDevice3D,RENDER_ADD);

				// コマセット
				sprite.SetUVNum(anim[frame % 16].numU,anim[frame % 16].numV);
				// スプライト描画
				sprite.Draw(direct3d.pDevice3D,bombtex.pTexture);
			
				// 描画終了
				direct3d.pDevice3D->EndScene();
			}
			// 描画反映
			direct3d.pDevice3D->Present( NULL, NULL, NULL, NULL );

			// フレーム更新
			frame++;
///////////////////////////////////////////////////////////////////////////////////////////////

今回の実行結果は次のようになります
発光して爆発っぽさが出ていると思います
effect.png

説明は省きますがSetRenderState関数の引数をRENDER_HALFADDに変更すると半加算合成をします

前:DirectX講座18回
次:DirectX講座20回

ふたえのきわみアッー6
ガトチュゼロスタイル2
「」[2

添付ファイル: fileeffect.png 850件 [詳細] fileeffect.zip 810件 [詳細] filetexture.h 828件 [詳細] filetexture.cpp 798件 [詳細] filesprite.h 1057件 [詳細] filesprite.cpp 710件 [詳細] fileeffect.cpp 1117件 [詳細] filedirect3d.h 826件 [詳細] filedirect3d.cpp 844件 [詳細] filebomb.png 990件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-05-07 (日) 16:20:12