【DirectX/メタセコイア】モデルを半透明に描画する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
パトラッシュ
記事: 6
登録日時: 13年前

【DirectX/メタセコイア】モデルを半透明に描画する方法

#1

投稿記事 by パトラッシュ » 13年前

メタセコイアで作成したモデルをXファイルで読み込み、半透明のオブジェクトとして描画したいのですが上手くいきません。
不透明度を調整しても真っ白になってしまいます。
【実装手順】
メタセコイア製の板ポリゴンを読み込んでいます。(材質設定は参考画像1を参照してください。)

コード:

 
 // バッファのクリア//
 if(FAILED(m_pD3DDevice->Clear(0,NULL, 
					D3DCLEAR_TARGET |
					D3DCLEAR_ZBUFFER,
					D3DCOLOR_XRGB(0,0,255),
					1.0f,
					0))) {
	return;
 }

// Xファイルの読み込み//
	//--------------------------------------
	if(FAILED( D3DXLoadMeshFromX( TEXT("ita.x"),
						D3DXMESH_SYSTEMMEM,
						pD3DDevice,
						NULL,			
						&m_pD3DXMtrlBuffer,
						NULL,
						&m_numMtrl,
						&m_pMesh ))) {
		return E_FAIL;
	}

//レンダリング設定//
 pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
//ライト設定(TRUEにしても結果は変わらず)
 pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
 pD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
 pD3DDevice->SetRenderState( D3DRS_DITHERENABLE,   TRUE );
  
 pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
 pD3DDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );
 pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );	

//座標変換関数//
Transform(LPDIRECT3DDEVICE9 pD3DDevice)
 
 if(pD3DDevice == 0) {
		return;

 D3DXMatrixIdentity(&m_view);

 // カメラ設定
 D3DXMatrixLookAtLH(&m_view, 
			&D3DXVECTOR3( 0.0f, 0.0f, -12.0f),	// カメラの位置
			&D3DXVECTOR3( 0.0f, 0.0f, 0.0f),	// カメラの方向を向ける点
			&D3DXVECTOR3( 0.0f, 1.0f, 0.0f));	// カメラの上の方向
 pD3DDevice->SetTransform(D3DTS_VIEW, &m_view);
		
 //射影設定
 D3DVIEWPORT9    vp;
 if(FAILED(pD3DDevice->GetViewport(&vp))) {
		return;
 }

 float aspect;
 aspect = (float)vp.Width / (float)vp.Height;
 D3DXMatrixIdentity(&m_proj);
 D3DXMatrixPerspectiveFovLH(&m_proj, 
			D3DXToRadian(45.0f),
			aspect,
			1.0f,
			1000.0f);
 
pD3DDevice->SetTransform(D3DTS_PROJECTION, &m_proj);
}

//描画//
 Transform(pD3DDevice);

 D3DXMatrixIdentity(&m_world);
 pD3DDevice->SetTransform(D3DTS_WORLD, &m_world);

 D3DMATERIAL9	mMaterial;
 D3DXMATERIAL* mD3DXMaterials = (D3DXMATERIAL*)m_pD3DXMtrlBuffer->GetBufferPointer();
 for( DWORD i =0; i<m_numMtrl; i++){
	mMaterial = mD3DXMaterials[i].MatD3D;
	pD3DDevice->SetMaterial( &mMaterial);
	m_pMesh->DrawSubset( i );
 }

モデルを半透明に描画する方法が知りたいです。(青い背景に緑のモデルを半透明に合成したい)
一日悩みましたが、なぜ半透明にならずに白になるのかさっぱり分からず困っています。
ちなみに材質設定の自己照明を1に近づければ、モデルは白から緑にはなりますが半透明にはなりません。
ご教授のほどよろしくお願いします。

■環境  
OS : WindowsXP
コンパイラ名 : VC++ 2008EE
添付ファイル
settei.png
settei.png (20.27 KiB) 閲覧数: 8106 回
meta.png
gamen.png
gamen.png (5.72 KiB) 閲覧数: 8106 回

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 【DirectX/メタセコイア】モデルを半透明に描画する方法

#2

投稿記事 by softya(ソフト屋) » 13年前

出来ればコンパクトにした上で動く形でソースコードとモデルをZIP添付でお願いします。
ところで、DirectX9ですよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

パトラッシュ
記事: 6
登録日時: 13年前

Re: 【DirectX/メタセコイア】モデルを半透明に描画する方法

#3

投稿記事 by パトラッシュ » 13年前

>> softya(ソフト屋) さん
はい、DirectX9です。
すみません、メタセコの元ファイルを保存し忘れていたので作り直しました。ほんのちょっぴり座標が動いています。(zipに入れてあります)
よろしくお願いします。ちなみにとあるサンプルソースを弄ったものです。
添付ファイル
test.zip
(4.38 MiB) ダウンロード数: 164 回

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 【DirectX/メタセコイア】モデルを半透明に描画する方法

#4

投稿記事 by softya(ソフト屋) » 13年前

ちゃんと回答する時間が無いので速報だけ。
レンダーステートが半透明を許可していないのが原因のようです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

パトラッシュ
記事: 6
登録日時: 13年前

Re: 【DirectX/メタセコイア】モデルを半透明に描画する方法

#5

投稿記事 by パトラッシュ » 13年前

softya(ソフト屋) さんが書きました:レンダーステートが半透明を許可していないのが原因のようです。
返信ありがとうございます。
//
pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
//
にしているんですが、これじゃ駄目なのでしょうか。無知で申し訳ございません。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 【DirectX/メタセコイア】モデルを半透明に描画する方法

#6

投稿記事 by ISLe » 13年前

とりあえず、材質の自己照明を1にして、Xファイルに出力するとき『UVマッピング』と『頂点カラー』のチェックを外すと良いようです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 【DirectX/メタセコイア】モデルを半透明に描画する方法

#7

投稿記事 by softya(ソフト屋) » 13年前

ISLe さんが書きました:とりあえず、材質の自己照明を1にして、Xファイルに出力するとき『UVマッピング』と『頂点カラー』のチェックを外すと良いようです。
失礼しました。
昨日テストできなかったんで、今日テストしてみましたが確かに自己照明が1じゃないと半透明になりません。[誤字修正]
パトラッシュ さんが書きました:返信ありがとうございます。
//
pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
//
にしているんですが、これじゃ駄目なのでしょうか。無知で申し訳ございません。
初期化にあったんですね。
半透明などのレンダーステートは初期化と言うより毎度設定したほうが良いのでDrawの方にあったほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

パトラッシュ
記事: 6
登録日時: 13年前

Re: 【DirectX/メタセコイア】モデルを半透明に描画する方法

#8

投稿記事 by パトラッシュ » 13年前

>>ISLe さん、ソフト屋さん

完全に思い込みでUVと頂点カラーにチェックして保存していました。
とてつもなく助かりました、ありがとうございました。

  >半透明などのレンダーステートは初期化と言うより毎度設定したほうが良いのでDrawの方にあったほうが良いと思います。

そうなのですか、以後そういう風にしてみます。

閉鎖

“C言語何でも質問掲示板” へ戻る