ReachとHiDef
XNA Game Studio 4.0ではReach(リーチ)とHiDef(ハイデフ)の二つのプロファイルがあり、細かなCapsビットを調べる必要が無くなりました。Reachプロファイルはその名のとおり、多くのプラットフォームで動作するプロファイルとなっています。このプロファイル向けに作られたゲームはXbox 360上ではもちろん、多くのWindows PC上で動作し、更にはWindows Phone 7シリーズのデバイスでも動作します。
対してHiDefプロファイルはXbox 360とミドル~ハイエンドGPUを搭載したWindows PC向けのプロファイルです。
他には
- 以下の表で黒文字で表記されているものは全プラットフォーム、ハードウェアで同じ動作をする
- 赤文字で表記されているものはプラットフォーム、ハードウェア間で完全な互換性を持たない
- HiDefはReachプロファイルのスーパーセット
- 太文字で表記されているものはHiDefのみで使えるフォーマット
- Reachプロファイル向けに作ったゲームはHiDefプラットフォームで動作させた場合でもReachプロファイルの規則に従う。これはHiDef対応プラットフォーム上でWindows Phone向けのゲームの開発をしている時に間違ってHiDef機能を使った場合に例外として知らせるようになっているためです。
Reach |
HiDef |
|
対応プラットフォーム | Windows Phone 7シリーズ Xbox 360 シェーダーモデル2.0に対応したWindows PC | Xbox 360 DirectX 10対応GPU(詳細は後述)が搭載されたWindows PC |
シェーダーモデル | 2.0 (ただし、Windows Phoneではカスタムシェーダー未対応) | 3.0+ (Xbox 360はvFetch命令など、Windowsでは使えない命令が使える) |
最大テクスチャサイズ | 2048 | 4096 |
最大キューブマップテクスチャサイズ | 512 | 4096 |
最大ボリュームテクスチャサイズ | × | 256 |
2のn乗以外のサイズのテクスチャ | △、アドレッシングモードがWrapや、ミップマップ、DXTでは使えない | ○ |
2のn乗以外のサイズのキューブテクスチャ | × | ○ |
2のn乗以外のサイズのボリュームブテクスチャ | × | ○ |
最大テクスチャサンプラー数 | 16 | 16 |
テクスチャフォーマット | Bgr565 Bgra4444 Bgra5551 Color Dxt1 Dxt3 Dxt5 NormalizedByte2 NormalizedByte4 | Alpha8 Bgr565 Bgra4444 Bgra5551 Color Dxt1 Dxt3 Dxt5 HalfSingle HalfVector2 HalfVector4 NormalizedByte2 NormalizedByte4 Rg32 Rgba1010102 Rgba64 Single Vector2 Vector3 Vector4 |
最大頂点テクスチャサンプラー数 | × | 4 |
頂点テクスチャフォーマット | × | HalfSingle2 HalfSingle4 Single Vector2 Vector4 |
レンダーターゲットフォーマット | 可変(詳細後述) | 可変(詳細後述) |
マルチレンダーターゲット | × | 4つまで 全てのレンダーターゲットは同じビット深度である必要がある。 アルファブレンディング |
最大頂点ストリーム数 | 16 | 16 |
最大頂点ストライド | 255バイト | 255バイト |
頂点要素フォーマット | Byte4 Color NormalizedShort2 NormalizedShort4 Short2 Short4 Single Vector2 Vector3 Vector4 | Byte4 Color HalfVector2 HalfVector4 NormalizedShort2 NormalizedShort4 Short2 Short4 Single Vector2 Vector3 Vector4 |
インデックスバッファ | 16bit | 16bit 32bit |
オクルージョンクエリー | × | ○ |
セパレートアルファブレンディング | × | ○ |
Blend.SourceAlphaSaturation | SourceBlendとしてのみ指定可 | ○ |
GraphicsDevice.GetBackBufferData | × | ○ |
HiDefプロファイルに必要なGPUとしてDirectX 10対応のGPUとなっていますが、XNA Game Studio 4.0はDirectX 10で動作している訳ではなく、DirectX 9上に実装されています。ですから、厳密に言えばHiDefプロファイルはDirectX 9対応GPUで上記の条件を満たしていれば動作します。また、DirectX 9で実装されているのでWindows 7、Windows Vistaに加えてWindows XP上でも動作するようになっています。
では、なぜDirectX 10対応GPUと記述してあるかというと、HiDefプロファイルにはXbox 360相当のGPU能力、つまりDirectX 9GPUではオプションとなっている機能が求められるからです。例えば浮動小数点フォーマットのMRTや頂点バッファのサポートはDirectX 9GPUではオプション扱いとなっています。
さて、ここで問題ですが「XNAで作ったHiDefゲームを遊ぶのに必要なものはなに?」と聞かれた時になんと答えるべきでしょうか?もし答える相手が技術に詳しい人であれば「DirectX 9対応GPUで、シェーダーモデル3.0、浮動小数点のMRTに対応していて…」と答えても問題ありませんが、相手が技術的なことに詳しくない場合には混乱させてしまうだけです。
ですから、DirectX 9GPUではオプションとなっている機能が必須となっているDirectX 10GPUが使える環境であればHiDefプロファイルは問題なく動作するので、「HiDefゲームはXbox 360かDirecX 10GPUの搭載しているPCで動作する」と答えるのが現実的です。
レンダーターゲットで対応するフォーマットは全てのプラットフォームで統一されているわけではありません。これはレンダーターゲットに使用可能、不可能なフォーマットの組み合わせが大量にあるためです。その代わりに、4.0ではGraphicsAdapter.QueryTargetFormatとGraphicsAdapter.QueryBackBufferFormatメソッドが追加されました。このメソッドは使いたいカラーフォーマットと深度バッファフォーマットを指定すると、使えるフォーマットの中からもっとも近いフォーマットを返します。
このメソッドはバックバッファやRenderTarget2Dなど作るときに自動的に呼び出されるので、どのフォーマットがサポートされているかを気にすることが無くなりました。例えば、Windows PhoneでサポートされているBgra5551フォーマットは16ビットレンダーターゲットの使えないXbox 360では自動的にColorフォーマットが適用されるようになっています。
XNA Game Studio 4.0ではColor型のバイトオーダーが以前のBGRAからRGBAへと変わりました。殆どの場合はこの変化には気づきません。なぜなら、単にColor型のバイトオーダーを変更しただけではなく、テクスチャや頂点宣言生成部分のコードも更新したからです。例外として、Color[]としてではなく、Byte[]として自前でバイト単位にデータを扱っているコードはBとRのバイトをスワップするように書き換える必要があります。
XNA Game Studio 4.0では以下の頂点フォーマットはサポートされなくなりました。
- Rgb32
- Rgba32
- Rgba64
- UInt101010
- Normalized101010
また、以下のテクスチャフォーマットはサポートされなくなりました。
- Dxt2
- Dxt4
- Bgr555
- Bgr444
- Bgra2338
- Bgr233
- Bgr24
- Bgr32
- Bgra1010102
- Rgba32
- Rgb32
- NormalizedShort2
- NormalizedShort4
- Luminance8
- Luminance16
- LuminanceAlpha8
- LuminanceAlpha16
- Palette8
- PalatteAlpha16
- NormalizedLuminance16
- NormalizedLuminace32
- NormalizedAlpha1010102
- NormalizedByte2Computed
- VideoYuYv
- VideoUyVy
- VideoGrGb
- VideoRgBg
- Multi2Bgra32
サポートされなくなったフォーマットのいくつかは殆どのハードウェアでサポートしていない、もしくは全くサポートされていないフォーマットで、それ以外は同じ機能だがビットフォーマットが違うなどの冗長な部分を簡略化しました。例えばRGBとBGRの二つのフォーマットは同じ機能なので両方のフォーマットを持つ必要はありません。
元ネタ
http://blogs.msdn.com/b/shawnhar/archive/2010/03/12/reach-vs-hidef.aspxにリリース版の情報を加味しました。