当方VC++とDXライブラリを用いて3Dゲームの製作を試みているのですが、製作したモデルのテクスチャの読み込みで行き詰っています。
Blenderにて製作したモデルを用いているのですが、テクスチャのパスまで書き出してくれない(○○.jpgとだけ)為に、モデルと同じ階層にテクスチャ画像を置かないと、マテリアルそのままのモデルが表示されてしまいます。
同じ場所に置けば上手く表示してくれますが、出来ればモデルならData\Model テクスチャならData\Texture と言う風にフォルダ分けしたいのです。
こちらで試みた手段は、
1.エクスポートしたモデルファイル(xファイル)のテクスチャのパスを直に書き換えてやる
2.DXライブラリのMV1SetTextureGraphHandle関数を用いて、グラフィックハンドルを指定したいテクスチャにする
の二つなのですが、
1はxファイルの階層下にテクスチャファイルが無ければ認識してくれない、モデルをエクスポートする都度書き換えるのは手間、と言う問題があり、
2のMV1SetTextureGraphHandle関数はテクスチャの画像サイズが2のn乗でなければちゃんと表示されない為、
関数の仕様を留意してテクスチャファイルを作らなければならない&UVマッピングしなければならない、と言う制約があります。
どうにかVC++側で、モデルにテクスチャのパスを渡す事はできないでしょうか。
DXライブラリからゲーム製作に入ったモノで、DirectXについてはまるで知らない状態です。
DXライブラリ側でのテクスチャの読み込み
Re: DXライブラリ側でのテクスチャの読み込み
MV1LoadModelが自動でやってくれるモデルやテクスチャ、モーションの読み込みを手動で行いたいときはMV1LoadModelFromMemを使います。
独自の読み込み関数を定義すれば、任意の場所からテクスチャを読み込むことができます。
独自の読み込み関数を定義すれば、任意の場所からテクスチャを読み込むことができます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ側でのテクスチャの読み込み
> 1はxファイルの階層下にテクスチャファイルが無ければ認識してくれない、モデルをエクスポートする都度書き換えるのは手間、と言う問題があり、
相対パス指定とテキスト置換ツールなどで自動書き換えで解決できると思います。
相対パス指定とテキスト置換ツールなどで自動書き換えで解決できると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ側でのテクスチャの読み込み
>h2so5様
ご教授頂きありがとうございます。ただ、関数を教えて貰ってから三日ほど調べてみたのですが、結局読み込み用の関数の作り方がわかりませんでした。
FileReadFuncの引数FilePathに直接画像ファイルのパスを渡して見ると、別のテクスチャ画像を設定したメッシュも含めて、全てのメッシュにパスを渡した画像が貼り付けられる(半透明でしたが)ので、ここにパスを渡せばよいとは思うのですが、ただフォルダのパスを渡すだけではダメでした。
具体的にどのように読み込んで渡せば良いのでしょうか?
>softya様
申し訳ありません、手動でのファイルパスの書式にミスがありました(¥と/を間違えていました…)。階層別のフォルダでも普通に読み込んでくれました。
ただ、この方法で設定できるのはテキスト形式で編集できるファイルの場合のみかと思うので(現状扱うのはxファイルのみの予定なので問題ありませんが)、上記の関数が理解できなかった場合にこちらの方法にしようかと思います。
ご教授頂きありがとうございます。ただ、関数を教えて貰ってから三日ほど調べてみたのですが、結局読み込み用の関数の作り方がわかりませんでした。
MV1LoadModelFromMem( *FileImage, FileSize, (* FileReadFunc )( *FilePath, **FileImageAddr, *FileSize, *FileReadFuncData ),
(* FileReleaseFunc )( *MemoryAddr, *FileReadFuncData ), *FileReadFuncData ) ;
具体的にどのように読み込んで渡せば良いのでしょうか?
>softya様
申し訳ありません、手動でのファイルパスの書式にミスがありました(¥と/を間違えていました…)。階層別のフォルダでも普通に読み込んでくれました。
ただ、この方法で設定できるのはテキスト形式で編集できるファイルの場合のみかと思うので(現状扱うのはxファイルのみの予定なので問題ありませんが)、上記の関数が理解できなかった場合にこちらの方法にしようかと思います。
Re: DXライブラリ側でのテクスチャの読み込み
長らく放置してしまいました…。
とりあえず、xファイルのテクスチャのパスを書き換えた上で、MV1LoadModelFromMemを使って読み込めば(MV1LoadModelではダメでした…)指定のフォルダからテクスチャを読み込んでくれるようなので、この方法で行きたいと思います。
softya様、 h2so5 様、有難うございました。
とりあえず、xファイルのテクスチャのパスを書き換えた上で、MV1LoadModelFromMemを使って読み込めば(MV1LoadModelではダメでした…)指定のフォルダからテクスチャを読み込んでくれるようなので、この方法で行きたいと思います。
softya様、 h2so5 様、有難うございました。
Re: DXライブラリ側でのテクスチャの読み込み
MV1SetTextureGraphHandle関数に渡すテクスチャの画像を読み込む前にても さんが書きました:2のMV1SetTextureGraphHandle関数はテクスチャの画像サイズが2のn乗でなければちゃんと表示されない為、
関数の仕様を留意してテクスチャファイルを作らなければならない&UVマッピングしなければならない、と言う制約があります。
SetUseDivGraphFlag(FALSE);
とすると2のn乗でなくてもちゃんと表示されるようになるかもしれません。
テクスチャは2のn乗サイズにしておいたほうが何かと効率が良いですが。