Re: MV1 についてのお願い ( No.1 ) |
- 名前:管理人 日時:2024/10/05 01:43
> 頂点データとインデックスデータから MV1 形式のハンドルが
> 得られるような関数はありますでしょうか
今のところありません
> 自分では見つけられず、現在は一度テキスト形式の x 形式に変換しメモリからMV1を生成する関数
> を利用しているのですが、x 形式への変換でコストパフォーマンスが非常に悪く難儀しております
MV1形式は xファイルより複雑なので仮に MV1の読み込み関数を作成するとなると x形式への変換より
面倒な処理を書かなければいけなくなると思いますので、x形式にした後に読み込むほうが
簡単だと思いますが、『コストパフォーマンス』とは具体的には何を指しているのでしょうか?
|
Re: MV1 についてのお願い ( No.2 ) |
- 名前:レモン 日時:2024/10/06 00:02
お返事ありがとうございます
また言葉が足りず申し訳ありません
パフォーマンスに関してですが、
テキスト形式 の x フォーマットに変換する際
大量の頂点座標やインデックスの数値を数字( 文字列への変換 )をしておりまして
そこが速度的なボトルネックになっておりまして
数値から直接 MV1 を生成できないかと
x フォーマットのバイナリ形式も考慮したのですが、調べてもフォーマットが
わからず、やむを得ずテキスト形式にしておりました
|
Re: MV1 についてのお願い ( No.3 ) |
- 名前:管理人 日時:2024/10/07 00:11
> パフォーマンスに関してですが、
> テキスト形式 の x フォーマットに変換する際
> 大量の頂点座標やインデックスの数値を数字( 文字列への変換 )をしておりまして
> そこが速度的なボトルネックになっておりまして
> 数値から直接 MV1 を生成できないかと
速度という意味では仮に頂点情報などの配列から直接 MV1 を生成するための関数を用意した場合、
xファイルに変換してから MV1LoadModel で読み込むよりは高速になると思いますが
渡された頂点情報を解析して MV1 データに変換する処理もそれなりに工程がある処理なので
頂点バッファーにデータを転送した後 DrawPrimitiveIndexed3D_UseVertexBuffer で直ぐに描画できる
場合と比べるとかなり遅いという点は予めご了承ください
ご要望の『剛体メッシュの情報から MV1 を生成する関数』ですが、MV1 には頂点情報の他に
マテリアル情報とテクスチャー情報が必要になります
そして一つの MV1 に複数のマテリアル、テクスチャー、頂点情報を含めることができるのですが、
これらを全て一つだけ渡して MV1 を生成する簡易的な関数で良いということでしょうか?
|
Re: MV1 についてのお願い ( No.4 ) |
- 名前:レモン 日時:2024/10/07 00:53
ありがとうございます
速度面の件承知いたしました
> ご要望の『剛体メッシュの情報から MV1 を生成する関数』ですが、MV1 には頂点情報の他に
> マテリアル情報とテクスチャー情報が必要になります
> そして一つの MV1 に複数のマテリアル、テクスチャー、頂点情報を含めることができるのですが、
> これらを全て一つだけ渡して MV1 を生成する簡易的な関数で良いということでしょうか?
はい、そちらで問題ございません。
お手数をお掛けして大変恐縮ですがよろしくお願いできればと思います
|
Re: MV1 についてのお願い ( No.5 ) |
- 名前:管理人 日時:2024/10/07 21:30
了解しました
実装してみますので、数日ほどお待ちください m(_ _)m
|
Re: MV1 についてのお願い ( No.6 ) |
- 名前:管理人 日時:2024/10/09 00:22
 |
Re: MV1 についてのお願い ( No.7 ) |
- 名前:レモン 日時:2024/10/09 23:49
お忙しい中での実装本当にありがとうございます
さっそく使用して速度差など計測のうえご報告したいと思います
|
Re: MV1 についてのお願い ( No.8 ) |
- 名前:レモン 日時:2024/10/10 01:30
速度テストのご報告
縦横に100分割した板ポリ( 三角分割 約1万頂点 )での速度計測を行いました
私の環境での結果となりますが
[ デバッグモード ]
x 形式への変換 280 〜 350ms
MV1CreateSimpleModel での生成 35 〜 50ms
[ リリースモード ]
x 形式への変換 170 〜 210ms
MV1CreateSimpleModel での生成 35 〜 50ms
x 形式への変換と比較して劇的に高速化されました、本当にありがとうございます。
デバッグとリリースで MV1CreateSimpleModel の速度差はあまり出ない結果となりましたが
これは元々がかなり最適化をしてくださった結果と思ってよいでしょうか
速度とは別になりますが、気になる点が3点ございましたので質問させてください
1点は MV1CreateSimpleModel の最後の引数を DX_NONE_GRAPH としてハンドルを生成後
MV1SetTextureGraphHandle でのテクスチャの再設定が無効となるようですがこちらは仕様と考えてよろしいでしょうか
※ あえて DX_NONE_GRAPH ではなく 0 を設定し、MV1SetTextureGraphHandle を実行したところ再設定できました
2点めは MATERIALPARAM に設定した値が反映されず、ハンドル生成後に MV1SetMaterialEmiColor などを使用して
マテリアルの再設定を行っても反映されませんでした ( エミッシブを GetColorF(1,1,1,1) に設定してみても変わりませんでした )
3点めは x形式で生成した MV1 とライティングが異なって( 全体的に暗く ) 見えているのですが、こちらもマテリアルに
関係していますでしょうか ディレクショナルライトの設定は ChangeLightTypeDir(VGet(0.0f, -1.0f, 0.0f)); としていて
立方体などは側面が真っ黒に描画されております
以上となります、よろしくお願いいたします
|
Re: MV1 についてのお願い ( No.9 ) |
- 名前:管理人 日時:2024/10/11 00:42
無事高速化されたようで何よりです
> デバッグとリリースで MV1CreateSimpleModel の速度差はあまり出ない結果となりましたが
> これは元々がかなり最適化をしてくださった結果と思ってよいでしょうか
DXライブラリはデバッグのライブラリも最適化を行っていますので、デバッグとリリースの速度差はありません
> 1点は MV1CreateSimpleModel の最後の引数を DX_NONE_GRAPH としてハンドルを生成後
> MV1SetTextureGraphHandle でのテクスチャの再設定が無効となるようですがこちらは仕様と考えてよろしいでしょうか
> ※ あえて DX_NONE_GRAPH ではなく 0 を設定し、MV1SetTextureGraphHandle を実行したところ再設定できました
DX_NONE_GRAPH とした場合はモデルにテクスチャが一枚もない状態となりますので、MV1SetTextureGraphHandle ではなく
MV1AddTextureGraphHandle を使用する必要があります
// モデルで使用するテクスチャを追加する( グラフィックハンドルをテクスチャとして追加 )
// MHandle : 3Dモデルハンドル
// Name : 名前
// GrHandle : グラフィックハンドル
// SemiTransFlag : テクスチャに半透明のピクセルが存在するかどうか( TRUE:存在する FALSE:存在しない )
// AddressModeU, AddressModeV : テクスチャアドレスモード
// FilterMode : テクスチャフィルタリングモード
int MV1AddTextureGraphHandle(
int MHandle, char *Name, int GrHandle, int SemiTransFlag,
int AddressModeU = DX_TEXADDRESS_WRAP, int AddressModeV = DX_TEXADDRESS_WRAP,
int FilterMode = DX_DRAWMODE_ANISOTROPIC ) ;
また、メッシュのマテリアルにもテクスチャを使用する設定がされていない状態なので、MV1SetMaterialDifMapTexture で
マテリアルが使用するテクスチャの番号を指定する必要があります
なので、MV1CreateSimpleModel の内部では、GrHandle が DX_NONE_GRAPH 以外の場合は、以下のような処理を行っています
MV1AddTextureGraphHandle( MHandle, _T( "Texture" ), GrHandle, FALSE ) ;
MV1SetMaterialDifMapTexture( MHandle, 0, 0 ) ;
> 2点めは MATERIALPARAM に設定した値が反映されず、ハンドル生成後に MV1SetMaterialEmiColor などを使用して
> マテリアルの再設定を行っても反映されませんでした ( エミッシブを GetColorF(1,1,1,1) に設定してみても変わりませんでした )
>
> 3点めは x形式で生成した MV1 とライティングが異なって( 全体的に暗く ) 見えているのですが、こちらもマテリアルに
> 関係していますでしょうか ディレクショナルライトの設定は ChangeLightTypeDir(VGet(0.0f, -1.0f, 0.0f)); としていて
> 立方体などは側面が真っ黒に描画されております
すみません、3Dモデルにマテリアルを追加する処理は書いたのですが、そのマテリアルを
『メッシュが使用するマテリアル』として指定するコードが抜けていてデフォルトマテリアルが
適用される状態となっていました…
修正版をアップしましたので、お手数で申し訳ありませんがこちらをお試しください m(_ _;m
https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 12 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース
(中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
 |
Re: MV1 についてのお願い ( No.10 ) |
- 名前:レモン ( 解決 ) 日時:2024/10/12 10:03
修正版に差し替えたところ正常にマテリアルが適用されていることが確認できました
シャドウマップ等も正常に適用されているようです
今回も本当にありがとうございました。
|