サンプルコードをXNA 4.0向けに更新

09/18/2010追記、AMD/ATI RADEON系のビデオカードでGameFest Japen 2008デモ内のインスタンス描画部分が表示されないという不具合がありました。修正したものに差し替えておきました。これ以前にダウンロードした人はダウンロードし直すか、DemoContent/GameModel/InstancedModel.fx内の最後の方にあるテクニック宣言部分をvs_3_0、ps_3_0のようにシェーダーモデル3.0を使うようにしてください。

 

今まで紹介してきたサンプルコードをXNA 4.0用に更新しました。GameFest Japan 2008以外のサンプルは大体5~10分程度で更新することができました。GameFest Japan 2008のデモコードは8,000行とそれなりの量があったので、更新には2時間程掛かりました。

実際の更新内容としては殆どが簡素化されたAPIに合わせて要らないコードを削っていくという作業でした。中にはソースファイル丸ごと要らなくなったというケースもありました。また、修正するべき箇所はコンパイラーがエラーとして教えてくれるので、コンパイルエラー箇所を修正するだけでそのまま動くというのが大半でした。

もちろん、なかには知らないと嵌ってしまう箇所もありますが、その紹介は追々しますので、今回は更新したプロジェクトの公開と、主な変更点を紹介します。

 

日本語メッセージサンプル

簡単(かもしれない)日本語表示

vtan

http://higeneko.net/hinikeni/sample/xna40/SimpleMessage.zip

  • Windows Phone版プロジェクトの追加。画面タッチでメッセージを切り替えます。

デバッグサンプル

デバッグサンプル

d1md

http://higeneko.net/hinikeni/sample/xna40/DebugSample.zip

  • Winndows Phone版プロジェクトを追加、フリックジェスチャーでデバッグウィンドウの表示/非表示。タップでソフトウェアキーボードを表示してコマンドを入力することができます。
  • デバッグウィンドウをプログラム側から表示/非表示するためのDebugCommandUI.Show/Hideメソッドの追加
  • IsFixedTimeStepにtrueを設定した状態で処理落ちしている場合にTimerRulerの描画部分の測定結果が表示されない問題を修正
  • 平均測定時間を返すTimerRuler.GetAverageTimeメソッドの追加
  • TimeRulerのログ表示部分に各マーカーの色表示を追加
  • StringBuilderExtensionsで桁グループ区切り文字表示位置がおかしくなるバグを修正

クォータニオン・スキニングサンプル

クォータニオンでスキンアニメーション

http://higeneko.net/hinikeni/sample/xna40/QuatSkinningSample.zip

  • シェーダーのみの変更
  • シェーダーコンパイラーが新しくなり、VertexSahder,PixelShaderは予約語となっているので、頂点シェーダとピクセルシェーダー名を変更
  • SM 2.0だとテンポラリレジスタが足りなくなってしまうので、SM 3.0に変更、つまりHiDefのみの対応
  • クォータニオンからスキニング用行列変換メソッドの簡素化

頂点テクスチャスキニングサンプル

頂点テクスチャでスキンアニメーション

http://higeneko.net/hinikeni/sample/xna40/TexSkinningSample.zip

  • Texture2Dのコンストラクタ引数が変わったので、それにあわせてFlipTexture2Dヘルパークラスを修正

vFetchスキニングサンプル

vFetchでスキンアニメーション

http://higeneko.net/hinikeni/sample/xna40/vFetchSkinningSample.zip

  • RenderHelper.csの削除。以前はVertexDeclarationに複数のストリームの情報を書かないといけなかったので、対象となるモデルのVertexDecalrationにインスタンス用のVertexDeclrationを組み合わせる必要があります。4.0ではストリーム毎にVertexDecalrationを持つことができるようになったので、こういった組み合わせ処理は必要なくなりました。
  • WriteableVertexBufferを4.0用にアップデート。4.0ではXbox 360上でSetDataOptions.Discardが実装されたので、簡素な仕組みになりました。
  • 4.0ではModelクラスのVertexBufferやIndexBufferがModelMeshからModelMeshPartに移ったので、その修正。

GameFest Japen 2008デモ

Gamefest Japan 2008 デモプログラム

jbn 

http://higeneko.net/hinikeni/sample/xna40/GamefestJapan2008Demo.zip

  • XNA 4.0ではXbox 360でもハードウェアインスタンスがサポートされ、またSM 2.0でも動作するようになったので、シェーダーインスタンスやXbox 360上でvFetchを使ったインスタンス描画コードが要らなくなりました。ですから、インスタンス関連の処理をする7つソースファイルを削除、シェーダーの簡素化、またインスタンス描画用のコンテントプロセッサも単にカスタムシェーダーを指定するだけの非常に単純なものになりました。
  • vFetchスキニングサンプルと同じようにIVertexTypeの実装、WritableVertexBufferの簡素化等を施しました。
  • このデモにはArrayListを使うと駄目だよというコードがあるのですが、現状ではXbox 360/Windows Phone上ではArrayListが使えないなので変わりにList<object>で代替しています。