Re: モデルビューアと同じ描画結果にしたい ( No.1 ) |
- 名前:管理人 日時:2025/04/06 06:36
DX.SetUseLighting(DX.TRUE);
DX.SetLightEnable(DX.TRUE);
DX.SetGlobalAmbientLight(DX.GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ));
DX.MV1SetMaterialEmiColor(handle,i,DX.GetColorF(1,1,1,1));
DX.MV1SetEmiColorScale(handle, DX.GetColorF(0,0,0,1));//真っ黒
↑
こちらの2行目を DX.SetLightEnable(DX.FALSE); にするとモデルビューアで
ライトを無効化した時と同じ状態になるかと思いますので、よろしければお試しください m(_ _)m
|
Re: モデルビューアと同じ描画結果にしたい ( No.2 ) |
- 名前:ケロリン 日時:2025/04/06 19:10
DX.SetLightEnable(DX.FALSE);
にしたところ一部グレーでほどんど白になってしまいます・・・
|
Re: モデルビューアと同じ描画結果にしたい ( No.3 ) |
- 名前:管理人 日時:2025/04/07 00:14
> DX.SetLightEnable(DX.FALSE);
> にしたところ一部グレーでほどんど白になってしまいます・・・
DX.SetUseLighting(DX.TRUE);
DX.SetLightEnable(DX.FALSE);
DX.SetGlobalAmbientLight(DX.GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ));
DX.MV1SetMaterialEmiColor(handle,i,DX.GetColorF(1,1,1,1));
DX.MV1SetEmiColorScale(handle, DX.GetColorF(0,0,0,1));//真っ黒
↑
こちらの5行目の DX.MV1SetEmiColorScale(handle, DX.GetColorF(0,0,0,1)); は不要だと
思いますのでコメントアウト又は削除してください
あと、4行目の DX.MV1SetMaterialEmiColor(handle,i,DX.GetColorF(1,1,1,1)); が
自己発光の色設定となっていますので、こちらを真っ白( GetColorF(1,1,1,1) )ではなく
希望される色を設定するようにしてみてください m(_ _)m
|
Re: モデルビューアと同じ描画結果にしたい ( No.4 ) |
- 名前:ケロリン 日時:2025/04/07 13:18
MV1SetMaterialEmiColorのみにしても、どの色を指定しても白になりました・・・
|
Re: モデルビューアと同じ描画結果にしたい ( No.5 ) |
- 名前:管理人 日時:2025/04/07 21:59
すみません、見落としていたのですが 4行目の
DX.MV1SetMaterialEmiColor(handle,i,DX.GetColorF(1,1,1,1));
こちらの中の第二引数の i にはどのような値が入っていますでしょうか?
こちらの i に自己発光色を変更したいマテリアルの番号が入っていないと意図した結果には
なりませんのでご確認ください m(_ _)m
あと、手元でDXライブラリのパッケージに入っている3Dモデル DxChara.x を使用して
自己発光色のみで表示されるテストプログラムを組んでみましたので、
よろしければ参考にしてみてください ( C++ のプログラムですが… )
( 実行するとデフォルトでは真っ黒の胴体部分が緑色で表示されます )
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// 背景色はグレー
SetBackgroundColor( 64, 64, 64 ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 3Dモデルを読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// カメラの座標と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 668.0f, -710.0f ), VGet( -0.0f, 377.0f, 0.0f ) );
// カメラの Near, Far を設定
SetCameraNearFar( 15.0f, 3800.0f );
// デフォルトライトを無効化
SetLightEnable( FALSE ) ;
// グローバル環境光を無効化
SetGlobalAmbientLight( GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ) ;
// 1番のマテリアルの自己発光色を緑にする
MV1SetMaterialEmiColor( ModelHandle, 1, GetColorF( 0.0f, 1.0f, 0.0f, 1.0f ) ) ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen() ;
// 3Dモデルを描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
 |
Re: モデルビューアと同じ描画結果にしたい ( No.6 ) |
- 名前:ケロリン 日時:2025/04/09 17:00
管理人さんのテストコードは正常に描画されました
ですが自分のコードの場合は動作しませんでした
MV1SetMaterialEmiColorのi部分ですが
MV1GetMaterialNumのサンプル部分と同じコードにしているので間違っていないと思います。
var materialNum = DX.MV1GetMaterialNum(handle);
for (var i = 0; i < materialNum; i++)
{
DX.MV1SetMaterialEmiColor(handle,i,DX.GetColorF(1.0f,0,0,1.0f));
}
スケールに関しては色が適用されるのでモデルハンドルも正しいものを渡しているはず....
と投稿する直前にふと
DX.SetUseDirect3DVersion(DX.DX_DIRECT3D_9EX);
をコメントアウトしたところ正常に動くようになりました。
DX_DIRECT3D_9EXだと動作しない(グレーになる)のは仕様でしょうか?
|
Re: モデルビューアと同じ描画結果にしたい ( No.7 ) |
- 名前:管理人 日時:2025/04/11 04:23
> と投稿する直前にふと
> DX.SetUseDirect3DVersion(DX.DX_DIRECT3D_9EX);
> をコメントアウトしたところ正常に動くようになりました。
すみません、失念していたのですが、Direct3D 9 では『有効なライトが一つも無い状態』になると
自動的に『ライティングOFF』の状態となり、マテリアルの自己発光の色などが無視され頂点カラーや
マテリアルの拡散光の色となるのでした…
> DX_DIRECT3D_9EXだと動作しない(グレーになる)のは仕様でしょうか?
はい、仕様となります
因みにライトの影響を無視して指定した色で描画したい、とのことでしたら
自己発光を使用するよりも SetUseLighting( FALSE ); でライティングの処理を無効にして、更に
MV1SetUseVertDifColor( ModelHandle, FALSE ) ; // 頂点拡散光カラー無効化( マテリアルの拡散光カラーを使用する )
MV1SetUseVertSpcColor( ModelHandle, FALSE ) ; // 頂点反射光カラー無効化( マテリアルの反射光カラーを使用する )
MV1SetMaterialSpcColor( ModelHandle, 0, 0, 0, 0 ); // マテリアルの反射光を真っ黒に設定
↑こちらの3行で頂点カラーと反射光カラーを無効にした上で
MV1SetMaterialDifColor による拡散光の設定で描画してから MV1DrawModel で描画すると
MV1SetMaterialDifColor で設定した色そのままで描画されます
No.5 のサンプルをライティングを無効にするコードに変更すると以下のようになります
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// 背景色はグレー
SetBackgroundColor( 64, 64, 64 ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 3Dモデルを読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// カメラの座標を設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 668.0f, -710.0f ), VGet( -0.0f, 377.0f, 0.0f ) );
// カメラの Near, Far を設定
SetCameraNearFar( 15.0f, 3800.0f );
// ライティングを無効化
SetUseLighting( FALSE ) ;
// 反射光カラーを真っ黒に設定
MV1SetMaterialSpcColor( ModelHandle, 1, GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ) ;
// 3Dモデルの頂点カラーを使用せず、マテリアルカラーを使用するように設定
MV1SetUseVertDifColor( ModelHandle, FALSE ) ;
MV1SetUseVertSpcColor( ModelHandle, FALSE ) ;
// 1番のマテリアルの拡散光色を緑にする
MV1SetMaterialDifColor( ModelHandle, 1, GetColorF( 0.0f, 1.0f, 0.0f, 1.0f ) ) ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen() ;
// 3Dモデルを描画
MV1DrawModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
よろしければお試しください m(_ _)m
 |
Re: モデルビューアと同じ描画結果にしたい ( No.8 ) |
- 名前:ケロリン(解決) 日時:2025/04/15 16:49
>Direct3D 9 では『有効なライトが一つも無い状態』になると
>自動的に『ライティングOFF』の状態となり
Direct3D 9だとそのような制約があるのですね・・・知りませんでした。
>因みにライトの影響を無視して指定した色で描画したい、とのことでしたら
>自己発光を使用するよりも SetUseLighting( FALSE ); でライティングの処理を無効にして、更に
> MV1SetUseVertDifColor( ModelHandle, FALSE ) ; // 頂点拡散光カラー無効化( マテリアルの拡散光カラーを使用する )
> MV1SetUseVertSpcColor( ModelHandle, FALSE ) ; // 頂点反射光カラー無効化( マテリアルの反射光カラーを使用する )
> MV1SetMaterialSpcColor( ModelHandle, 0, 0, 0, 0 ); // マテリアルの反射光を真っ黒に設定
まさにやりたいことです。
てっきり自己発光でないとできないと思っていました。
いただいたサンプルを組み込んで無事やりたいことができました、ありがとうございます!
返答をいただいていたのに返信が遅くなってしまい申し訳ないです。
すべての疑問の答えをいただいたので解決にします。
ありがとうございました。
|
|