Hatena::ブログ(Diary)

Karu_gamoのXNAゲーム開発日誌

2008-05-31-土

karu_gamo2008-05-31

移転しました。>

FC2移転しました。

新しいアドレスこちらです。

[]モデリング頑張る

ピンポイント仕事が忙しくなり平日は身動きできなくなっていまいました。いろいろと予定が変わり今週末はのんびりできそうなので、いまのうちにモデルを進める。キャラモデルはこのゲーム用にすでに3回目のリテイクになる。最初はリアル等身だったけど、徐々に等身が下がってきました。今回のは等身は抑えて、末端の誇張を強くしてみました。といってもまだ50%程度ですが…。UVはもう1回切りなおさないと…。シンドイ…。

2008-05-27-火

[]シェーダー周りに着手

本当はビルボードやろうと思っていましたが、考えていたら、気になったきたのでシェーダー周りに手を付け始めました。やる前はとっつきが悪い印象でしたが、やってみると意外と簡単ですね。いや、今どきな派手なエフェクトってなると相当大変そうだけどね…。とりあえずRenderMonkeyとFXComposerを試してみる。どちらかというとRenderMonkeyの方がとっつきやすい印象でした。サンプルも豊富だし、テンプレートシンプルなものからできるので、チョコチョコと弄るだけでも楽しいです。んで、早速やろうと思ってたUVのオフセット値を指定できるようにしてみた。シェーダー自体は簡単だが、実装の方でつまづく…。SkinningSampleではContentPipelineの方でEffectを設定しているようなので、本来はリソースバイナリ化の前に片付ける問題なんだろうけど、面倒なので…Modelの読み込み段階でBasicEffectから自前エフェクトに乗せ変えるようにしてみた。XNAのModelクラスはD3DXのMeshクラスと違い、テクスチャーを勝手に管理してくれちゃってる。そのため、自前エフェクトにテクスチャーをどうやって設定していいのやら…。手間が少ないのは良いのですが、こういう時には困っちゃいます。どうしよう??? いろいろ調べてみたら、EffectParameter.GetValueTexture2Dで取れました。(ヘルプによるとEffect.Parameters["Texture"]みたいにやるより、EffectParameteで指定した方が圧倒的にパフォーマンスがいいらしいです)というわけで、Effect.Parameters["BasicTexture"];をEffectParameterに設定してからTexture2Dの配列に入れ、描画時に指定するようにしました。う〜んこれで良いのか不安…。まぁ、とりあえずUV値は指定できるようになりました。これで目パチとか、シンプルな水表現なんかは対処できそう。つか、シェーダー周りは楽しそうだったので、水面とかはシェーダーでやってみたいなぁ〜とか思った。たぶん、CGツールとプログラムで試行錯誤するよりかは、シェーダーでやった方が早いしキレイでしょうし…。

明日は水泳だ!

2008-05-25-日

[]仕分けもだいたい完了

正直、IListとかよくわからなかったので、勉強しながらメッシュの仕分けをする仕組みを作ってみた。たぶん問題なく動いているはず!? ヌキはまだ正常ではなかったっぽい。調べてみたら、比較処理が適切でなかったぽい? 以下のようにしたら正常に描画された。

device.RenderState.AlphaTestEnable = true;

device.RenderState.ReferenceAlpha = 128;

device.RenderState.AlphaFunction = CompareFunction.Greater;

128は妥当な数値なのかどうかわからないが、まぁとりあえず動いているので良しとします…。後は半透明関係のZソートさえできればこの辺は一段落つきそう。

ソート実装完了。適当に書いたのにしっかり動いてくれた。感動!最適化はいずれ…ということで、次はビルボード辺りでもやるかな〜。

2008-05-24-土

[]カメラはなんとかなったぽい

昨日の解決しないまま放置していたカメラの続きをやる。行列の掛け算の結果がイメージしきれない。移動して回転…!? 回転して移動…!?とか唸りながらいろいろ試してみるも、結果が伴わない。一つ気づいたのが、行列の掛け算でMtrx1 *= Mtrx2;という書き方がダメっぽい!? ちゃんと確認していないが、書き直したらうまくいった。う〜ん、適当な展開。

ブレンド周りも正常になったので、いよいよメッシュの仕分けに取り掛かる。要は全部の描画予定モデルキューに溜めて、不透明→ヌキ→半透明関係という順でメッシュを描画していきたいわけだ。半透明関係は描画する前にZソートして、それ以外は適当な順に描画。本当はスキンモデルインスタンスを実装してからの方が良い気もするのだが(ていうかインスタンスの使い方はあってるのか?)、そっちの方はまだ実装のイメージができていない…。AnimationPlayerを複数持てば同じリソースで複数描画できるとこまでは試したが、それって正しいやり方なのかな? メッシュの仕分けも考慮すると…、例えば、不透明・ヌキ・半透明の3種のメッシュが含まれているモデルは1フレームにつき3回頂点の更新をする必要がある。モデルを2体描画すると以下のように6回更新することになる。モデルA【不透明】→モデルB【不透明】→モデルA【ヌキ】→モデルB【ヌキ】→モデルA【半透明】→モデルB【半透明】。ありえないな…。頂点の更新はUpdate時に1回だけにして、描画の時は対象のメッシュだけを描画するような流れがスマートだとは思うのだが…。う〜ん、VertexBuffer周辺をコピーとかすんのかな?

2008-05-23-金

[]ブレンド周りを実装

ありもののエクスポーターでは対応しきれない細かい情報(まずはブレンドの種類とビルボード)はメッシュの名前でやりとりすることにした。読み取りは簡単にできたので、実装を進める。まずはブレンドから。半透明、加算合成、乗算合成、ヌキの4種類あれば問題ないかと思う。リクエストに対してステート変更が必要かどうかをチェックする仕組みを作ってみる。仕組み自体は問題なく動作しているようだが、ヌキがちゃんと出てないっぽい。アルファテストか、Z書き込みがうまくいってないのか? まぁ、大した問題ではないでしょう。今までスキンサンプルをそのまま使っていたため、カメラもサンプルのものをそのまま使っていた。この辺も使いづらかったので、FPS的なカメラを作ってみる。が…うまくいかない…。C++でやってたときは難なくできたのに…。次回はC++のソースでも眺めながら再挑戦してみようかと思います。

そういえばUVのアニメーションを調べないと。固定機能パイプラインの時はテクスチャーに行列が設定できたので、簡単にできたが、今回はシェーダーやらないとダメかな〜? 今回XNAをやるに当たってシェーダー周りはテーマと思っているので、一段落したら挑戦してみようと思う。

2008-05-22-木 今日は3D関連の更新

[]階層情報(スキンではない)の描画

階層情報を持ったモデル(スキンではない)の描画をしたところ、いろんなところに配置したはずのメッシュが全部中央で描画されてしまった。effectで各メッシュにWorld行列を設定しないといけないようだ。メッシュ全体のものかと思い、何も考えずに単位行列入れてました…。さて、どこから行列を取ってこれるのか? いろいろ試したところ『mesh.ParentBone.Parent.Transform』で正常に描画されたっぽい。めでたしめでたし

さて次はメッシュ名からフラグを取ってきて、ブレンドの種類の決定、ビルボードなんかもやっつけちゃいたい。メッシュ名は簡単に取れるから、問題は半透明関係を描画後半に持っていって、描画順番の管理とかその辺かな。

プリキュアは等身違いとか描いたりしてみる。イマイチ可愛く描けない…。一応走るパターンも作ってみて、自作テストゲームに乗せ変えたりしてみた。

泳ぎすぎて肩と股関節周りが筋肉痛…。

2008-05-21-水 水泳で疲れた

[]久しぶり!

久々にプールにいく。最近暖かくなってきたので、混んでいるかと思ったが、19時30分という時間のせいか、結構空いていた。久しぶりということで、最初は25mごとに体を休めながら、徐々に距離を伸ばしていく。後半は150mほど泳いでみた。泳いでいるときは楽なのだが、陸に上がると体が重く感じる。2時間ほど泳いでから家に帰る。途中腕が重かった。明日大丈夫か…!?

ドット絵勉強も兼ねて、娘がハマってるプリキュアのドット絵を描く。動くだけでも楽しんでくれるので、5歳児が喜ぶゲームテーマに軽めのプリキュアゲームでも作ってみるつもり。

練習用ギター(DIGI像ハイパー)のアダプタ接続部分が接触不良気味。演奏中(というかギターを動かすと)突然リセットする。まだ買ってから、半年しか経ってないのに…。扱いが悪いせいか? ギターは壁に立てかけているのだが、その状態だとアダプターの接触部分にもろ負荷が掛かってしまう。ストラップエンドを換装したので、アダプターに直接負荷が掛からなくはなったが、遅かったようだ。調べてみたところ、問題があるのは本体側ではなく、アダプター側の様子。ホッ。新しいアダプターを買おうかどうか検討中

Connection: close