24 December 2010 0 Comments

メタセコイアとKeynoteとXNAとMkxエクスポーター

前回 はメタセコイアのモデルファイルであるMQOファイルを直接読み込むことのできるインポーターを含んだメタセコイア・パイプラインを紹介しました。 モデルが読み込めたら、次はアニメーションデータを使いたくなります。メタセコイア自体にはアニメーション機能は付いていないのですが、プラグインによってアニメーションを付けてしまおうというのが Keynote です。Keynoteを使っている時にモデルデータをセーブすると、.mqoファイルと一緒に.mqxというプラグイン用のファイルが出力されます。 理想的には、この.mqxファイルにあるアニメーションデータをメタセコイア・パイプラインで直接読み込めると良いのですが、以下の問題がありました。 Keynoteが出力する.mqxにはアニメーションのキーフレーム情報しか出力されない ボーン情報が.mqxに含まれていない。 メッシュのボーンウェイト情報が.mqxに含まれていない これらの情報はKeynote内でモデルデータから生成されているのですが、その生成方法が判らないとインポートすることができません。同じ理由でMqoファイルインポーターでも一般に良く知られているCatmull-Clark曲面は実装できましたが、曲面タイプ1と2は実際にメタセコイアがどのような計算をしているのかが判らないと実装できないので、これらの曲面タイプはサポートされていません。 さて、これは困ったなぁと、数日間試行錯誤することとなりました。幸い、Keynoteには他のプラグインからKeynoteで生成した情報にアクセス出るAPIが提供されていたので、それを使うためにメタセコイア用のプラグインを作り、そこからメタセコイア・パイプラインで読めるファイル形式の形にして出力する方法が使えると言うことが判りました。 ただ、独自ファイルフォーマットを作るには時間が掛かるし、アニメーションデータを読むだけの為にわざわざ新しいファイルフォーマットを作るのには抵抗がありました。そこで、メタセコイア・パイプライン内にはMqoファイルから読み込んだ情報を一旦DOM(データ・オブジェクト・モデル)形式として保持するようになっているので、このDOM自体をXNAコンテント・パイプラインのIntermediateSerializerを使ってデシリアライズする方法をとることにしました。こうすることでMqoファイルを読むときもDOM形式でデシリアライズするときも全く同じ処理をすることができるので作業量が減り、メンテナンス性が上がり、バグの可能性も大幅に減らすことができるようになります。 と、いう経緯でできたのが Mkxファイルフォーマット です。MkxはMetasequoia,Keynote,XNAの略でデータの流れを表しています。実際にはXMLファイル形式となっています。   メタセコイア用プラグイン、Mkxエクスポーター 前置きが長くなりましたが、今回はMkxエクスポーターを紹介します。以下のURLからダウンロードできるようになっています。ファイルの使い方に関する情報は付属しているReadme.txtファイルを参照してください。 プラグインのインストール方法はメタセコイアのマニュアルを参照してください。このプラグインはWindows XP SP2以降のOS標準の機能しか使っていないので、プラグインを使用する際はXNA Frameworkランタイムを始め、VC++用のランタイムなどは 必要ありません 。 Mkxエクスポーター本体(MkxExporter.dll) http://higeneko.net/hinikeni/sample/xna40/MkxExporter-1.0.101222.0-bin.zip Mkxエクスポーターのソースコード(Visual Studio 2010用プロジェクト) http://higeneko.net/hinikeni/sample/xna40/MkxExporter-1.0.101222.0-src.zip これらは私個人で仕事時間外に作ったものなので、Microsoft社やXNAチームは一切関与してません。ですから、バグあってもConnectとかに連絡しても相手にしてくれないでしょう。バク報告や要望などがあればAppHub内のフォーラム(XNA開発者によるコミュニティフォーラムです)か support@higeneko.com へメールしてください。   Mkxエクスポーターの機能 Mkxエクスポーターには以下の機能があります。 日本語完全対応 Keynoteで作成したボーン情報、スキニング情報、複数アニメーション出力 Keynoteを使っている時におきる問題の検出と対処方法の表示 オブジェクト出力モード Catmull-Clark曲面やミラーリング使用時のボーンウェイト生成(インポート時) Keynoteで作成した情報を出力するにはKeynoteをアクティブの状態、つまり「ボーン」コマンドボタンが押された状態で「ファイル/上書き保存」を選び、ファイル種類を「MKXファイル(*.mkx)」を選んで保存することでできます。 Keynoteによる名前変更が原因で名前衝突が起きる場合、Mkxエクスポーターは名前衝突が起きない名前へと変更します。この処理が発生した場合、エクスポート終了後に下図のようなメッセージが表示され、どの名前を変更したのかが表示判るので容易に修正できるようになっています。 また、設定ミスによってできてしまう、どのボーンにも属さない頂点を見つけたときには、XNA側で正しくインポート出来るように孤立した頂点用のボーンを自動生成するようになっています。この場合もエクスポート終了後に下図のようなメッセージが表示され、どのオブジェクトに孤立した頂点があるのかが表示されるので容易に修正できるようになっています。 オブジェクト出力機能は私がデバッグ時に使用していた物で、Keynoteを非アクティブ、もしくはインストールされていない状態でMkxファイルを出力すると、このモードでファイルが出力されます。この時に出力されるのはMqoファイル形式で出力されるものと同じ物が出力されます。メタセコイア・パイプラインにはMqoファイルを直接読み込む機能があるので、必要性は殆どありません。強いて言うならMqoファイルで出力するより15~50%程ファイルサイズが小さくなることくらいです。   Mkxファイルの使い方 Mkxファイルをゲームプロジェクトへ追加する方法は 前回 紹介したMqoファイルのインポート方法と同じように MetasequoiaPipeline.dllをコンテントプロジェクトの参照設定で追加する インポートしたいMkxファイルを追加する だけです、この時、自動的にMkx形式メタセコイア モデルインポーター(MkxImporter)が設定されます。   アニメーションサンプル(SkinningSample) 前回 紹介したサンプルの中にはMkxファイルをインポートしてアニメーションさせるサンプルが同梱されています。このプロジェクトを実行すると、下図のようにeynoteに付属しているサンプルのキャラクターアニメーションを見ることができます。 このプロジェクトはAppHubにある Skinned Modelサンプル(英語版) のコメントを日本語に訳し、以下の2つの変更を加えたものです。 SkinnedModelProcessorをModelProcessorではなく MqModelProcessor から派生させた 実行時、テクスチャが指定されていないSkinnedEffectに白いテクスチャを設定 SkinnedEffectはテクスチャなしの状態だと実行時にエラーとなるので、それを回避する為に1×1の白いテクスチャを生成して設定するようにしました。 以上のように既存のサンプルからの変更点は皆無に等しいので、簡単にMkxファイルフォーマットへと移行することが判ると思います。   まとめ 今回のメタセコイア特集連載(第一弾?)の最後に、この場を借りてメタセコイアの作者である水野様、サンプルで使用したモデル制作者であるKT爺様、そしてKeynoteの作者でありエクスポーター制作時には私の不躾な質問に快く答えてくださったmqdl様に感謝の意を表します。   さて、 前々回 のまとめではメタセコイアでモデルを出力する際にはFBXエクスポーターを使い、幾つかの注意点に留意する必要があると述べました。この注意点はメタセコイア・パイプラインとMkxエクスポーターの組み合わせを使った場合にどうなるか見てみましょう。 曲面タイプ1と2を使っている場合はエクスポート前にフリーズする必要がある と、なります。私がテスト用にダウンロードした中で曲面タイプ1や2を使っているケースは100個中3個と少なく、キャラクターモデリングの場合はCatmull-Clark曲面を使用する傾向にあるようです。ですから、この注意点が大きな問題となることは殆どないと思われます。また、問題が起きた場合、それはメタセコイア・パイプラインとMkxエクスポーターのバグである可能性が高く、その場合でもソースコードが公開されているのでデバッグ、修正することができます。もちろん、バグが出た場合は私の方でもできうる限りの対応はするようにしますので気軽に連絡ください。   XNAを使って3Dゲームを作りたい、3Dゲーム制作というのはどんな物なのか知りたいという人にとって、初めての3Dゲーム制作の為にいきなり高額な3Dモデリングツールを買うというのは敷居が高すぎます。そんな人達の多くが一度は触れるのがメタセコイアなのではないでしょうか?今までの記事で述べてきたように、以前はメタセコイアで作られたモデルをXNAで使うには細かい注意点が必要でした。この細かな注意点に貴重な時間を奪われてしまうのは勿体ないことです。 メタセコイア・パイプラインとMkxエクスポーターがそんな人達の力に少しでもなれることを願います。

23 December 2010 0 Comments

メタセコイアのモデルファイルをXNAで直接読み込む「メタセコイア・パイプライン」

前回は「問題箇所を特定するのが難しい」という問題を解決する為にメタセコイアファイルとXNAデータの間に入る変換プロセスはなにか?というところで終わりました。 プロのゲーム開発でもこの「問題箇所を特定するのが難しい」というのは非常に大きな問題です。なぜならこの問題を解決するのに時間が掛かるのはもちろん、いつ問題が発生するのか判らないという、スケジュールへの悪影響があるからです。ですから、ゲーム制作の中で重要な3Dモデルデータの場合、使用するモデリングツール専用のプラグインや変換ライブラリを作ることが多くなります。他社で提供されたものを使う場合でも、慎重に検証するのはもちろん、そのソースコードとコンパイル環境があるかが採用する際の重要な決め手となります。 XNAでは、この「モデリングツール専用の変換ライブラリ」に相当するのがインポーターです。 もちろん、インポーターを作るのにも時間が掛かりますが、一旦完成させると開発効率が飛躍的に向上します。私が Game Buildingの時 に5日間でゲームっぼい物を作ることができたのも、自作したLightwaveインポーターによるところが大きいです。 そこで、今回はメタセコイアファイルを直接読み込むことのできるインポーターを含んだコンテント・パイプライン用アセンブリ、メタセコイア・パイプラインを紹介していきます。 今回紹介するメタセコイア・パイプラインは以下のURLからダウンロードできるようになっています。XNA Game Studio 4.0向けに書かれています。ファイルの使い方に関する情報は付属しているReadme.txtファイルを参照してください。 メタセコイア・パイプラインを使ったサンプル(アセンブリファイルも含む) http://higeneko.net/hinikeni/sample/xna40/MetasequoiaPipeline-1.0.101222.0-sample.zip メタセコイア・パイプライン: コンテント・パイプライン用アセンブリファイル http://higeneko.net/hinikeni/sample/xna40/MetasequoiaPipeline-1.0.101222.0-bin.zip メタセコイア・パイプライン: ソースコードとプロジェクト http://higeneko.net/hinikeni/sample/xna40/MetasequoiaPipeline-1.0.101222.0-src.zip これらは私個人で仕事時間外に作ったものなので、Microsoft社やXNAチームは一切関与してません。ですから、バグあってもConnectとかに連絡しても相手にしてくれないでしょう。バク報告や要望などがあればAppHub内のフォーラム(XNA開発者によるコミュニティフォーラムです)か support@higeneko.com へメールしてください。   メタセコイア・パイプライン(MetasequoiaPipeline.dll) このパイプライン・アセンブリには以下のインポーターとプロセッサーが含まれています。 メタセコイア モデルインポーター(MqImporter) MKX形式メタセコイア モデルインポーター(MkxImporter) メタセコイア モデルプロセッサー(MqModelProcessor) メタセコイア モデルインポーター(MqImporter)では以下のメタセコイアファイル内情報をインポートします。 日本語を含んだオブジェクト名、マテリアル名、そしてテクスチャファイル名 オブジェクト(階層構造、可視、スムージング等) マテリアル情報(模様、透明、凸凹テクスチャ情報を含む) メッシュデータ(頂点、UV座標、頂点カラー) Catmull-Clark曲面(インポート時にポリゴン面へ変換される) ミラーリング(分割、接続、接続距離制限、ローカル座標) 回転体 メッシュ分割機能(16Bitインデックスバッファに収まるようにする) このインポーターはMQOファイルに書かれている文字列をSJISとして処理するので、オブジェクト名、マテリアル名、そしてテクスチャ名全てに日本語文字列を使うことができます。Windows、Windows Phone 7では日本語ファイル名をサポートしているのでMQOファイルやテクスチャファイル名に日本語があっても問題ありません。Xbox 360は日本語ファイル名をサポートしていませんが、テクスチャファイル名はコンテント・パイプライン内ではモデルから参照されているテクスチャファイル名を英数字へ変換するので問題ありません。日本語ファイル名のMQOファイルをインポートする場合、プロパティのアセット名を英数字にするだけで元のファイル名はそのままでインポートすることができる、つまりコンテント生成時にはなにも気にせずに日本語を使うことができるということです。 インポート自体は可視オブジェクトのみをインポートするので、ゲームに関係の無いオブジェクトを不可視設定にするだけで同じMQOファイルをそのままゲームプロジェクトへ追加することができます。 メッシュ分割機能はReachプロファイルでもモデルを表示できるようにするのが主な目的ですが、HiDefでも32Bitインデックスより16Bitインデックスの方が描画効率が良いので常に16Bitインデックスバッファへ変換するようになっています。   MKX形式メタセコイアモデルインポーターの機能については次回説明します。   メタセコイア モデルプロセッサー(MqModelProcessor)は標準のModelProcessorから派生したもので、以下のメタセコイア特有の情報を処理します。 模様、透明テクスチャの合成 アルファブレンドが必要かどうかの自動判定(ModelMeshPart.Tagへ格納される) 通常、ゲーム内では不透明のメッシュを描画してから、半透明のメッシュを描画するようにして不透明、半透明のメッシュ間での視覚的問題がでないようにします。この処理をする為にはどのメッシュが不透明で半透明なのかが判らないとできません。そこで、このプロセッサー内ではアルファ値の使用状況をマテリアルのアルファ値、頂点カラー、そしてテクスチャのピクセル情報から自動的に判定するようになっています。 半透明処理が必要なアルファ値、つまり255以外の値を使っている場合、このプロセッサーはModelMeshPart.TagへInt32値で1を格納するようになっています。ですから、ゲーム内で(ModelMeshPart.Tag != null)という判別式でこのメッシュが半透明処理が必要かどうかを判定することができるようになっています。サンプルプロジェクト内のDrawModelメソッドではこの処理を行っているので、そのコードが参考になると思います。   メタセコイア・パイプライン  サンプル サンプルパッケージには以下のものが含まれています。 メタセコイア・パイプライン、アセンブリファイル(MetasequoiaPipelineフォルダ内) モデルインポートサンプル(ModelImportSampleフォルダ内) アニメーションサンプル(SkinningSampleフォルダ内) メタセコイア・パイプライン アセンブリファイルはバイナリパッケージにあるもと同じものです。アニメーションサンプルについては次回説明します。 モデルインポートサンプルでは実際にインポートしたメタセコイアモデルを表示するサンプルとなっています。ここではKT爺様(「萌えろ!CG道場+」 http://ktg.sblo.jp/ )からダウンロードしたものを使用させてもらいました。このモデルは見た目も素晴らしく、データ的にもオブジェクト階層構造、ミラーリング、Catmull-Clark曲面、そして透明テクスチャとメタセコイアの主要な機能のデモには最適のモデルでした。この場を借りてKT爺様に感謝の意を表します。 サンプルを実行させると以下のような画面になります。 モデルファイルがダウンロードできるページ の最後にある画像と比べると、XNA上でも同じものが表示されているのがわかると思います。また、Windows, Xbox 360, Windows Phone 7の全てのプラットフォームで動作し、Windows Phone 7のプロジェクトは実機とエミュレーター上で動作しているのを確認しました。 このサンプルの中では、前述のように半透明メッシュであることを表す(ModelMeshPart.Tag!=null)という判別式を使って、不透明メッシュを描画してから、半透明メッシュを描画するようになっています。この処理で不透明メッシュと半透明メッシュ間の描画順による視覚的問題は解決しています。また、このモデルでは笹の葉部分に半透明メッシュ同士の重なった部分があるので、実行時に半透明メッシュをAlphaTestEffectへと変換することで対応しています。このモデルの場合は特に問題にはなりませんが、AlphaTestEffectにはライティング設定ができないので、実際のゲームではライティングが必要な半透明メッシュと区別する必要があります。   気軽に使える では、実際に自分作ったゲームにメタセコイアファイルを追加するにはどうしたら良いのでしょうか? MetasequoiaPipeline.dllをコンテントプロジェクトの参照設定で追加する インポートしたいMqoファイルを追加する だけです。これだけで下図のようにインポーターやプロセッサーがメタセコイア・パイプライン用のものが自動的に設定されます。テクスチャファイルを使っている場合はプロジェクトに追加するのではなく、コンテントフォルダ内へファイルをコピーするのを忘れないでください。   まとめ 今回はメタセコイア・パイプラインを紹介しました。この60KB足らずのアセンブリファイルを追加するだけで、メタセコイアで生成したモデルを簡単にゲーム内で使えるようになりました。その利点としては 日本語が使える 無償版のメタセコイアLE版が使える ネットでダウンロードしたモデルをそのまま使える(ライセンスには気をつけて) ミスや問題の起こりやすい変換作業要らず ミラーリング、回転体、Catmull-Clark曲面に対応しているのでいちいちフリーズする必要がない オブジェクトやマテリアル名もインポートするので、その名前を使ったゲーム向けの処理をすることができる が挙げられるでしょう。 さて、モデルがインポ��トできるようになったら、次はアニメーションです。 つづく……

26 March 2010 0 Comments

消えたRenderState

カテゴリ分けされたレンダーステート XNA Game Studio 3.1では描画するときに欠かせないレンダーステート情報を変更するには、GraphicsDevice.RenderStateプロパティを介する必要がありました。プロパティ化したことにより、デバッガ上で即座にレンダーステートを確認できるというのはC++でDirectXを使っていた時よりも格段に使いやすくなっていました。 ですが、RenderStateクラスには実に70近いプロパティがあり、中には複数のプロパティを正しく設定しないと思い通りに描画できないといった問題があったり、Visual Studio上で編集しているときでもインテリセンスに表示される候補が多すぎるという問題がありました。また、パフォーマンス的にも複数のレンダーステートを設定するのは時間が掛かってしまいます。さらにコードのメンテナンスしやすさの面から見ても、これだけの量のレンダーステートを人力で管理するのは難しく、かといって安易にStateBlockを使用すると更なるパフォーマンス低下の原因になってしまうという問題がありました。 そこで、XNA Framework 4.0ではこれらの問題を解決する為に、レンダーステートを以下の4つのステートにカテゴリ分けしています。 BlendState 半透明処理など、カラーブレンディングに関するステート DepthStencilState 深度バッファやステンシルバッファに関するステート RasterizerState ポリゴンのフィルモード、マルチサンプル設定などラスタライズ時に関するステート SamplerState テクスチャのサンプリングフィルターやアドレスモードなどのステート また、GraphicsDeviceにはBlendFactorプロパティがあり、BlendState.BlendFactorと同じものです。これはBlendFactorを使用するBlendStateを設定した後にBlendFactorの値だけを変えたい時の為に用意されています。GraphicsDevice.ReferenceStencilとDepthStencilState.ReferenceStecilの関係も同じものです。 各ステートの初期化と設定方法 それぞれのレンダーステートはあらかじめオブジェクトとして生成する必要があります。例えばBlendStateの場合は以下のように生成します。 // 一般的な半透明ステートオブジェクトを生成する BlendState myState1 = new BlendState (); myState1.ColorSourceBlend = Blend .SourceAlpha; myState1.AlphaSourceBlend = Blend .SourceAlpha; myState1.ColorDestinationBlend = Blend .InverseSourceAlpha; myState1.AlphaDestinationBlend = Blend .InverseSourceAlpha; もしくは、C# 3.0から使えるようになった オブジェクト初期化子 を使用して BlendState myState2 = new BlendState { ColorSourceBlend = Blend .SourceAlpha, AlphaSourceBlend = Blend .SourceAlpha, ColorDestinationBlend = Blend .InverseSourceAlpha, AlphaDestinationBlend = Blend .InverseSourceAlpha, }; のように書くこともできます。この書き方のが一行ごとにオブジェクト名を書かなくて良いのですっきりとした感じになります。 こうしてできたステートオブジェクトはGraphicsDeviceクラスのプロパティに設定することでレンダーステートを変更することができます。 GraphicsDevice.BlendState = myState1; あらかじめ宣言されたステート このままだと、レンダーステートを設定する時にあらかじめ使用するステートオブジェクト作らないといけないので、それらを管理する手間が増えてしまいます。確かに、その方がパフォーマンス的には有利なのですが、良く使われるレンダーステートくらいは直ぐに使いたいと思う人が多いでしょう。 そこで、それぞれのレンダーステートクラスには良く使われるステートの組み合わせが静的プロパティとしてあらかじめ用意されています。 BlendStateであらかじめ宣言されているBlendStateプロパティ プロパティ名 意味 設定値 Addtive 加算半透明用ブレンドステート ColorSourceBlend = Blend.SourceAlpha, AlphaSourceBlend = Blend.Blend.SourceAlpha, ColorDestinationBlend = Blend.One, AlphaDestinationBlend = Blend.One, AlphaBlend 半透明用ブレンドステート (アルファ値乗算済み) ColorSourceBlend = Blend.One, AlphaSourceBlend = Blend.One, ColorDestinationBlend = Blend.InverseSourceAlpha, AlphaDestinationBlend = Blend.InverseSourceAlpha, NonPremultiplied 半透明用ブレンドステート (一般的な半透明) ColorSourceBlend = Blend.SourceAlpha, AlphaSourceBlend = Blend.SourceAlpha, ColorDestinationBlend = Blend.InverseSourceAlpha, AlphaDestinationBlend = Blend.InverseSourceAlpha, Opaque 不透明用ブレンドステート(規定値) ColorSourceBlend = Blend.One, AlphaSourceBlend = Blend.One, ColorDestinationBlend = Blend.Zero, AlphaDestinationBlend = Blend.Zero, DepthStencilStateであらかじめ宣言されているDepthStencilStateプロパティ プロパティ名 意味 設定値 Default 規定値、深度バッファの読み込み、更新あり DepthBufferEnable = true, DepthBufferWriteEnable = true, DepthRead 読み込みのみ 深度バッファとの比較はするが、深度バッファの更新はしない。パーティクル等の半透明描画時に使用する DepthBufferEnable = true, DepthBufferWriteEnable = false, None 深度バッファを使用しない DepthBufferEnable = false, DepthBufferWriteEnable = false, RasterizerStateであらかじめ宣言されているRasterizerStateプロパティ プロパティ名 意味 設定値 CullClockwise 時計方向回りのプリミティブをカリングする CullMode = CullMode.CullClockwiseFace, CullCounterClockwise 反時計方向回りのプリミティブをカリングする(規定値) CullMode = CullMode.CullCounterClockwiseFace, CullNoneNone カリングなし CullMode = CullMode.None, SamplerStateであらかじめ宣言されているSamplerStateプロパティ プロパティ名 意味 設定値 AnisotropicClamp アニソトロピックフィルタリング(異方向性フィルタリング)、クランプ Filter = TextureFilter.Anisotropic, AddressU = TextureAddressMode.Clamp, AddressV = TextureAddressMode.Clamp, AddressW = TextureAddressMode.Clamp, AnisotropicWrap アニソトロピックフィルタリング(異方向性フィルタリング)、ラッピングあり Filter = TextureFilter.Anisotropic, AddressU = TextureAddressMode.Wrap, AddressV = TextureAddressMode.Wrap, AddressW = TextureAddressMode.Wrap, LinearClamp リニアフィルタリング、クランプ Filter = TextureFilter.Linear, AddressU = TextureAddressMode.Clamp, AddressV = TextureAddressMode.Clamp, AddressW = TextureAddressMode.Clamp, LinearWrap リニアフィルタリング、ラッピングあり(規定値) Filter = TextureFilter.Linear, AddressU = TextureAddressMode.Wrap, AddressV = TextureAddressMode.Wrap, AddressW = TextureAddressMode.Wrap, PointClamp ポイントフィルタリング、クランプ Filter = TextureFilter.Point, AddressU = TextureAddressMode.Clamp, AddressV = TextureAddressMode.Clamp, AddressW = TextureAddressMode.Clamp, PointWrap ポイントフィルタリング、ラッピングあり Filter = TextureFilter.Point, AddressU = TextureAddressMode.Wrap, AddressV = TextureAddressMode.Wrap, AddressW = TextureAddressMode.Wrap, レンダーステートの管理が簡単になった これら四種類のレンダーステートオブジェクトにカテゴリ分けと、あらかじめ用意されているステートの組み合わせを使用することでレンダーステートの管理がしやすくなりました。どれぐらい簡単になったかというと、例えば全てのレンダーステートを初期値に戻したいという場合があったとします(普段はあまりないけれど)。このケースの場合は以下の数行を書き加えるだけで実現することができます。 // レンダーステートを初期値に戻す GraphicsDevice.BlendState = BlendState .Opaque; GraphicsDevice.DepthStencilState = DepthStencilState .Default; GraphicsDevice.RasterizerState = RasterizerState .CullCounterClockwise; // サンプラーステート数はReach、HiDefともに16個 for ( int i = 0; i < 16; ++i) GraphicsDevice.SamplerStates[i] = SamplerState .LinearWrap;

23 July 2009 0 Comments

日本でXNA クリエーターズ クラブ オンラインサイトが開設

XNA クリエーターズ クラブ オンラインサイトが更新 今日(北米時間の7月23日)にクリエーターズ・クラブ・オンラインサイトが更新されました。新しくなった内容は以下のとおりです。 日本語サイトの開設 ラーニング用のサンプルも日本語化 日本語版フォーラムの開設 Xbox LIVE インディーズ ゲームに名称変更 日本を含む新しい地域からのゲーム投稿受付開始 ゲーム販売価格の変更 遂に 日本語サイト がオープンしました。サイトのインターフェースの他にもサンプルコードも日本語化されています。また、 日本語フォーラム も開設されたので、日本語でXNA Game Studio、クリエーターズクラブに関する技術的な質問や要望をやり取りすることができます。 新地域の追加 本日付けでXbox Liveコミュニティゲームから 「Xbox Liveインディーズゲーム」 へと名称が変更され、配信可能な地域に 日本 、ドイツ、シンガポール、そしてスウェーデンの四カ国が新たに追加され、今までに配信可能だった米国、英国、イタリア、カナダ、スペイン、フランスの計十カ国で配信可能となりました。 日本地域向けゲームのピアレビュー開始 新しく追加された地域向けのゲーム投稿は本日からできるようになっています。ですが、実際にユーザーがゲームを購入できるようになるのは8月11日(北米時間)のXbox 360 ダッシュボードアップデート後になります。今日から8月11日までの三週間弱の期間中にピアレビューを通過したゲームは8月11日に遊べることになります。 Xbox Live インディーズゲームの価格変更 インディーズゲームの価格が以下のように変更されました。 400ポイント 240ポイント 80ポイント(容量が50MB以下のゲームのみ) 世界から、そして世界へ向けてのゲーム配信 今回のアップデートで日本に住んでいる人達が日本向けのゲームを配信できるようになった訳ですが、日本だけでなく、他の国へのゲーム配信もできるので、是非、日本以外の地域へのゲーム配信にも挑戦してみてください。逆に他の国から日本地域へのゲーム配信も可能になった訳ですから、8月11日には日本からではなく海外から投稿されたゲームも遊べるようになることでしょう。

6 July 2009 0 Comments

Imagine Cup 2009レポートその5(7/5)

Imgine Cup 2009世界大会も3日目となり、各競技部門でファイナルラウンドが行われました。 ファイナルラウンドのプレゼンテーションとQ&Aの様子は、大ホールに生中継され、 Imagine Cup参加者全員が見ることができます。 朝9時にゲーム開発部門(ファイナルは3チーム)からスタートし、 組み込み開発部門(ファイナリストは6チーム)、ソフトウエア開発部門(ファイナリストは6チーム)と 夕方の6時30分まで、各競技部門のファイナリストたちのプレゼンテーションとQ&Aが続きました。 数々のファイナリストの中で、私が一番衝撃を受けたのは、組み込み部門の韓国チームのプレゼンでした。 詳細は、 こちらから ご覧ください。 来年のリベンジ(?)に向けて、最前列でビデオを設置して、ファイナリストのプレゼンを見るチームNISLab++。 写真部門など引き続き競技が行われている部門がありますが、ほとんどの競技は本日で終了となり、後は審査結果を待つのみです。 夜は、ホテルのとなりにある中東最大のショッピングモールの8Fで、ディナー(エジプト料理)となりました。     明日はCultural Dayと言って、Imagine Cup参加者全員でピラミッド訪問となります。 私のレポートは明日は休載の予定です。

2 July 2009 0 Comments

.NET RIA Services、XNA Game Studio、SQL Server などなど。。。

おはようございます、窪田です。 あっという間に 7 月ですねえー。マイクロソフトでは 7 月が年度のはじまりとなり、組織替えやらなんやらでバタバタしています。 このバタバタでいくつかご紹介が遅れてしまったドキュメントがありますので、まとめてご紹介します。 1. Microsoft .NET RIA Services の概要 – May 2009 Preview http://msdn.microsoft.com/ja-jp/silverlight/dd920272.aspx .NET RIA Services って何?という方も多いもしれず、ちょっと量があるのでおなかいっぱいになってしまうかもしれませんが、日本語で読めるものとしてはわりとわかりやすく書かれたコンテンツですので、お時間のある時に目を通していただければ、と。 .NET RIA Services はこちらからダウンロードできます。 Microsoft .NET RIA Services May 2009 Preview http://www.microsoft.com/downloads/details.aspx?FamilyID=76bb3a07-3846-4564-b0c3-27972bcaabce&displaylang=en…( read more )

30 June 2009 0 Comments

XNA Game Studio 3.1のSoundEffect変更点

XNA Game Studio 3.1のSoundEffect ゲームで使用する効果音を簡単に再生するためにXNA Game Studio 3.0で導入されたSoundEffect機能がありますが、この機能は以下の二つのシナリオを実現するようにデザインされました。 簡易再生(Fire & forget) : プログラムは単にPlayメソッドを呼ぶだけ。後は効果音が鳴り終わった後に自動的にメモリ開放処理をしてくれる機能 生成と設定(Create & configure): 効果音を鳴らしている間に、音量、再生ピッチ、パンなどのさまざまなパラメーターを自由に設定できる機能。細かい設定ができる代わりに、プログラム側で再生中のインスタンスの保持、管理をする必要がある この二つのシナリオを実現する為に、XNA GS 3.0では SoundEffect.Play 、 SoundEffect.Play3D メソッドは SoundEffectInstance オブジェクトを返すようになっていました。再生中に設定を変更したい場合は、このインスタンスに対して処理をします。簡易再生させたい場合はインスタンスを保持しないでおきます。この場合、次にガーベージコレクション(GC)が発生した時に再生が終了したインスタンスを破棄するようになっていました。 この方法には以下の二つの問題がありました。 Play/Play3Dメソッドには、プログラムが簡易再生をしたいのか、細かい設定をしたいのかを知る術がないので常にSoundEffectInstanceを生成していました。これは簡易再生をしている場合に常に不必要なメモリ確保が起きていることになります。 確保されたSoundEffectInstanceはGCが発生された時に再生が終了しているインスタンスを自動的に破棄されるようになっています。GCがいつ発生するかはゲームがどのようにメモリを確保するかによって左右されます。GCの不必要な発生はゲームのパフォーマンスに影響するので、極力GC発生を抑えるようにプログラミングするのが望ましいのですが、GC発生数が少ないと、SoundEffectinstanceを開放する機会が減るのことになるので、最終的には同時再生できる効果音の上限に達してしまいます。 XNA GS 3.1では、この二つのシナリオを明確に分けることで、この問題を解決しました。 SoundEffect.Playメソッドは簡易再生専用のメソッドとなり、SoundEffectInstanceではなく、bool値を返すようになりました。このbool値は単純に再生が成功したかを示します。これで不必要なメモリ確保がなくなりました。また、このメソッドを使った場合はループ再生ができないようになっています。 生成と設定のシナリオ用に SoundEffect.CreateInstance メソッドが追加されました。このメソッドはSoundEffectInstanceを返すので、このオブジェクトを介して音量、ピッチ、パンなどを設定することができます。 SoundEffect.Play3Dメソッドは無くなりました。3Dサウンドを再生する場合は、SoundEffect.CreateInsntaceメソッドを使い、 SoundEffectInstance.Apply3D メソッドを使用します。3Dサウンドは簡易再生することができません。 また、XNA GS 3.0では再生数が上限に達したときに更に効果音を再生しようとするとInstancedPlayLimitException例外が発生しました。XNA GS 3.1でもCreateInstanceメソッドを使った場合には同じように例外が発生しますが、簡易再生の場合は例外を発生せずに単にbool値を返すようになっています。ですから、簡易再生時にいちいちtry~catchブロックを書く必要がなくなりました。 原文: http://blogs.msdn.com/shawnhar/archive/2009/06/12/soundeffect-changes-in-xna-game-studio-3-1.aspx

25 June 2009 0 Comments

クリエーターズ クラブ 公報 27

今週、 XNA クリエーターズ クラブ フォーラム は大忙しでした。プレイテストとピア レビューに多くの新人さんが参加してくれたからです。しかし、参加者の中には、何が問題で何がそうでないのかを判断しかねている人もいるようでした。ここでもう一度復習しておきましょう。ピア レビューは、参加者全員がルールを尊重してこそ機能するものです。そして、最も大切なルールは、「ピア レビューは主観的なプロセスではない」ということです。ピア レビューに参加するときは、ゲームに対する個人的な意見は脇へ置いておいてください。そのようなフィードバックはプレイテストで行ってください。クリエーターズ クラブのプレミアム メンバーとしてゲームを投稿したいときは、必ず最初にプレイテストに提出してください。プレイテスト中に得られたフィードバックを積極的に取り入れるようにすれば、ピア レビューで山積する問題に悩まされることはありません。ピア レビューに参加する MVP の皆さんは、 The “Evil” Checklist と Not so “Evil” Checklist の 2 スレッドをぜひブックマークしておいてください。ピア…( read more )