プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
槍兵再作成10
BasicEffectマテリアル設定をXNA側でカスタムエフェクトに差し替えた。今回の改修でマテリアル設定はカンペキ??



◎現状調査と改修計画

こちらの手法でBasicEffectパラメータ全リストを確認したら、前回の一覧と一緒でした。今回はこれらを一通りサポートします。

まずはSoftimage付属HLSLのグローバル変数を抜粋し、BasicEffectパラメータ一覧と比較しながら、どのパラメータをどの変数に受け渡すべきか検討しましょう。

Softimage付属HLSLグローバル変数抜粋(暫定版)

BasicEffectパラメータの例(PDF)

Softimage付属HLSLではフォグ/アルファ(透明度)/EmissiveColor(発行光源)がサポートされていないようです。BasicEffectのソースを参考にすれば機能実装可能かもしれませんが、当面不要なので今回はパスします。

では、‘対応状況’が空白の項目を埋めていきましょう。



◎ライトの設定

DiffuseColorは前回実装したので、同様にAmbientLightColor/SpecularColor/SpecularPowerを追加します。この辺は問題無いですね。

続いてDirLight0~2を受け渡そうとしたら、エラーになりました。最初は配列受け渡しミスかと思ったのですが、HLSLを改めて見直すと、xsi_lightdef9.hlslはピクセルシェーダでインクルードされており、中身はxsi_lightlist9.hlslで以下のようにセットされています。

string SasBindAddress = "Sas.PointLights[0].Position";

どうやら、シーンファイルに定義したライト設定がSoftimageランタイム経由で受け渡されて来るようです。下手にいじる必要は無さそうですね。



◎テクスチャ不在

その後ワールド座標等も一応受け渡して、改修作業は一段落しました。しかし、見た目が全然変わりません。テクスチャが無い部分の色が、Softimageと違います。何でかな~?

槍兵再作成07

そもそもSoftimageで指定した色はDiffuseColorなのか?と確認したら、やはりDiffuseColorでした。さらに、その値は描画時に至るまで確実に受け渡されていることを確認しました。にも拘わらず、見た目に反映されない理由がわかりません。

もしかして、DirLight0~2が必要なのか?しかしオリジナルマテリアルの値を調べると全て0でした。やはりこれはシーンファイル参照でDiffuseColorとは無関係ですね。

…そんなこんなで原因調査に悩みまくりましたが、HLSLを見ると、DiffuseColor算出時にテクスチャサンプラを使用してました。

つまり、テクスチャ不在マテリアルのBasicEffectパラメータはnullなので、正常なテクスチャサンプラがセットされず、色計算がおかしくなっていたのでした。原因が判明すれば、対処は簡単です(コードは後述)。

ちなみに、試行錯誤中はコードを5倍ぐらい記述しましたが、最後はかなりスマートになりました。もっと短時間でここまで出来たら言うことないのですが…まだまだスキル不足ですね(汗)



◎チラチラします

色の問題は解決しましたが、エフェクトに関してはもう一つ問題があります。静止画だとわかりませんが、実際にはライトが光速移動しているらしく、テカリ(光の反射による光沢)が遷移ループして、チラチラします。

ライトだけ簡易アニメしているのでしょうか?しかしSoftimageのモデル内ライトやシーン内のライト&カメラ、いずれも固定です。そもそも、Playback state(アニメ開始終了フラグ)をFalseにしてもチラつくので、Softimageのアクションとは無関係ですね。う~ん…。



◎チラチラ解消

他のモデルの表示状態を確認すると、テストモデルが左半身だけチラチラします。メッシュやマテリアル設定に左右の区切りは無かったはずだけど…念のためシーンファイルを確認すると、エクスプローラ階層上にメッシュが存在しません。ノードが存在しないのにSoftimage上でアニメするって、どーゆーこと??

(上記に関しては、テストモデルのシーンファイルを無意識のうちに壊してしまったようで、PublishしたらXNAで読み込めなくなってました。)

他にもScene_Data.xsiを調べたりで原因調査に時間がかかりましたが、結局これもテクスチャサンプラの問題でした。Softimge付属HLSLは、albedoMapの他にAmbientMapとNormalMapも渡す必要があったのですが、これを渡してなかったのでチラチラしてました。

NormalMapが無いと反射光がおかしいのはわかりますが、なんでチラチラした(フレームによって変化した)んですかね?…理屈はよくわかりませんが、直すのはカンタンです。

BasicEffectをカスタムエフェクトに差し替える

槍兵再作成09   槍兵再作成10
Phong.fx(左図)とLambert.fx(右図)

問題のチラチラは解決しました。
右側のLambertがシブめでいい感じですね。
Phongはテカりすぎですが、値の調整は可能です。

ついでにコードを改善し、エフェクトは一個所で切り替え可能としました(Phong.fxはセマンティクスのみ追加しました)。

従来はSoftimageでマテリアル設定を数十か所変更する必要がありましたが、凄くカンタンになりました。この方式なら自作エフェクトへの切り替えも容易ですね^^



◎動かない!?

これでマテリアルはカンペキ!

…と思ったら、いつのまにか動かなくなってました。
今回の改修は自信あるので、これが原因ではないと思うのですが…。

実は以前からこの現象は頻繁に発生してました。原因は不明で、Softimageでマテリアルやアクションを付け直すと復活したりしなかったり…。全てシャドウリグ関連の不具合(シャドウリグをXNA向けに設定しきれていない)だと考えるようにしていたのですが、シャドウリグをやめてもこの現象は発生するようです。

今回はアクションを付け直しても動かないので、先日のテストモデルを1から作り直して試すと…これも動かず。何故だ~!!



◎原因判明

リグモデルは、ボーンを直接動かさずにコントローラだけ動かした方が綺麗なモーションになります。

注:コントローラ情報はXNAに渡されないらしく、ボーンとコントローラを併用するとXNAではおかしくなることが多い。

しかしコントローラのみ動かした場合、(Softimage上はコントローラに連動してボーンが動くのに)XNAアニメとしてPublishする際にアニメデータが更新されないようです(アニメーションマネージャのUpdate Action Clipを押してもダメ)。

…これってPublish機能のバグじゃないの??お陰でXNA連携開始当初からさんざん悩まされましたよ(泣)


ちなみに、どこか1箇所でもボーンを直接動かしてからUpdate Action Clipを押すと、他のコントローラアニメもXNAで動くようになります。なので、適当なボーンを少しだけ動かすとこの問題は回避できます。

テストモデル再作成   槍兵再作成11

アニメフレームの途中の補完がおかしい部分もあります(腕など)が、これは多分プログラムの問題ではなくて、エンベロープウエイト設定やモーション作成(IK/FK併用)をきちんとやれば綺麗になると思います。



◎マテリアル変更テスト

全ての問題点が解消したので、マテリアル変更テストを行います。SoftimageのPreset Managerを開いて、適当なマテリアルサンプルをドラッグ&ドロップで適用します。

プリセットマネージャ

…って、エラーになりますね。この操作はあまりやったことないんでSoftimageのルールがよくわかりません。

どうやら、クラスタ化されたメッシュに直接ドラッグ&ドロップはできないらしく、エクスプローラ上のマテリアルにドラッグ&ドロップすると適用できるようです。(スクリプトの都合でエラーになることもある)

クラスタ配下のマテリアルにドラッグ&ドロップする   槍兵再作成12

腕、鎧、靴の3箇所のマテリアルを変更してPublishすると…。

槍兵再作成13

腕の色は反映されましたが、鎧の色はSoftimageと少し違うように見えます。靴の色は変わってないような…?

マテリアル設定を確認すると、設定変更前と変更後でパラメータがかなり変わってました。

マテリアル設定変更前   マテリアル設定変更後
マテリアル設定変更前(左図)と変更後(右図)

つまり、マテリアルの種類によっては、それに見合ったカスタムエフェクトを個別に用意してパラメータを引き継がないとXNAでうまく再現されない、というわけですね。こればかりは仕方無いので諦めましょう。


最後に、Softimage上で従来のカラーパラメータ値を変更した際に、XNAへ適用されるか確認します。

テスト結果反映(PDF)

エフェクトパラメータ変更テスト01   エフェクトパラメータ変更テスト02

DiffuseColorやSpecularColorが正常に反映されて、Softimageと同じ色がXNAに反映されました。Phong、Lambert共にOKです。



◎次回予告

プログラム改修は今回で一段落です。

次回はボーン追加、エンベロープウエイト設定、モーション作成を行います。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。