ウィンドウを透過した時に3Dモデルの輪郭線が消える

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
an

ウィンドウを透過した時に3Dモデルの輪郭線が消える

#1

投稿記事 by an » 9年前

件名の通りですが、ウィンドウを透過した時に3Dモデルの輪郭線が消えます。

初めは、元より輪郭線が表示出来ていないと思い、標準のウィンドウに戻し、画面に白いボックスを表示して確認を行いました。
又、元より輪郭線が描かれていないのかも、と思いMMDでも確認を行いました。

確認の結果、しっかり輪郭線は表示されている事が確認出来ました。
確認の為に用いたコードを載せておきます。

コードのコメント部分を有効にすると、ウィンドウが透過するのですが、これを有効にすると輪郭線が消えます。

コード:

include "DxLib.h"

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
	ChangeWindowMode(TRUE) ; // ,SetWindowPosition( 840 , 412),SetGraphMode( 500, 500, 32 ), SetWindowStyleMode( 2 ), SetUseBackBufferTransColorFlag(true);
	if ( DxLib_Init( ) == -1 ) return -1;

	const float kScale = 50.0f;
	int ModelHandle = MV1LoadModel( "dat/imarine/imarine_nomal.pmd" );

	MV1SetPosition( ModelHandle, VGet( 320.0f, -240.f, 600.f ) );
	MV1SetScale( ModelHandle, VGet( kScale, kScale, kScale ) );

	int MaterialNum = MV1GetMaterialNum( ModelHandle );
	for ( int i = 0; i < MaterialNum; i++ ) {
		float DotWidth = MV1GetMaterialOutLineDotWidth( ModelHandle, i );
		MV1SetMaterialOutLineDotWidth( ModelHandle, i, DotWidth / kScale );
	}

	SetDrawScreen( DX_SCREEN_BACK );
	while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
		ClearDrawScreen( );
		DrawBox(0,0,640,480,GetColor(255,255,255),TRUE);
		MV1DrawModel( ModelHandle );
		ScreenFlip( );
	}
	DxLib_End( );
	return 0;
}

ru-pu

Re: ウィンドウを透過した時に3Dモデルの輪郭線が消える

#2

投稿記事 by ru-pu » 9年前

SetUseUpdateLayerdWindowFlagとUpdateLayerdWindowForSoftImageを使う方式にすると綺麗に透過されます。

コード:

#include "DxLib.h"
 
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
	ChangeWindowMode(TRUE) ; 
	SetWindowPosition( 840 , 412);
	SetGraphMode( 500, 500, 32 );
	SetWindowStyleMode( 2 );
	SetUseBackBufferTransColorFlag(true);

	//UpdateLayerdWindowForSoftImageを使用する指定
	SetUseUpdateLayerdWindowFlag(true);
	if ( DxLib_Init( ) == -1 ) return -1;
 
	//αチャンネル付き画面作成
	int ScreenHandle = MakeScreen( 500, 500, TRUE );

	//キャプチャ用のSoftImage作成
	int SoftImageHandle = MakeARGB8ColorSoftImage( 500, 500 ); 

	const float kScale = 50.0f;
	int ModelHandle = MV1LoadModel( "dat/imarine/imarine_nomal.pmd" );
 
	MV1SetPosition( ModelHandle, VGet( 320.0f, -240.f, 600.f ) );
	MV1SetScale( ModelHandle, VGet( kScale, kScale, kScale ) );
 
	int MaterialNum = MV1GetMaterialNum( ModelHandle );
	for ( int i = 0; i < MaterialNum; i++ ) {
		float DotWidth = MV1GetMaterialOutLineDotWidth( ModelHandle, i );
		MV1SetMaterialOutLineDotWidth( ModelHandle, i, DotWidth / kScale );
	}
 
	//描画先を設定
	SetDrawScreen( ScreenHandle );
	while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
		ClearDrawScreen( );
		MV1DrawModel( ModelHandle );

		//描画先をキャプチャ
		GetDrawScreenSoftImage( 0, 0, 500, 500, SoftImageHandle );

		//キャプチャしたSoftImageを使用して透過ウインドウを更新
		UpdateLayerdWindowForSoftImage( SoftImageHandle );

		// 少し待つ
		Sleep( 12 );
	}
	DxLib_End( );
	return 0;
}

an

Re: ウィンドウを透過した時に3Dモデルの輪郭線が消える

#3

投稿記事 by an » 9年前

>> ru-pu様

無事解決致しました。有難うございました!

閉鎖

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