locked
XNA3.1→XNA4.0の移行に関して RRS feed

  • 質問

  • 不明な点が多いので、色々質問させてください。
    (Windowsでのツール、ゲーム、XBOXゲーム、WindowsPhone7ゲームを作ろうとしています)


    ■アルファテストに関して
    RenderState.AlphaTestEnableと、device.RenderState.ReferenceAlphaは、どこに行ってしまったのでしょうか。
    アルファテストを使いたいんですが。

    ■ミップマップ生成に関して
    TextureCreationParametersは、なくなってしまったのでしょうか。
    それと、Texture2Dの、GenerateMipMapsメソッドも見当たりません。
    動的にミップマップ生成をしたいので。

    ■Modelの頂点バッファ、インデックスバッファ取得
    Modelの頂点バッファ、インデックスバッファ取得ができなくなっているようですが、インターフェイスが消滅したのでしょうか。
    確か、ロボットゲームのコリジョンを参考にして、作っていたのですが、頂点バッファがとれなくなっているようで、使えなくなりました。
    http://create.msdn.com/ja-JP/education/catalog/sample/robot_game

    ■シェーダー
    max関数でエラーがでます。なぜでしょう。
    代替になる関数などあったら、教えてください。
    (PixelShaderとか、VertexShaderというシェーダー名だとエラーになるようです。これはどうでもいいですが。)

    ■グラフィックス性能を調べる奴
    GraphicsAdapter.DefaultAdapter.GetCapabilities
    GraphicsAdapter.DefaultAdapter.CheckDeviceMultiSampleType
    これらの関数がなくなっています。代替になる関数はあるのでしょうか。


    ★要望
    ・今まであったテクスチャのセーブ、ロードは残してほしい(DDS,BMP,TGAなど)
    ・Windows版では、HiDefの制限に縛られず、自由にグラフィックス性能の最高まで使いたい
    ・できれば、シェーダーモデル5.0まで使いたい
    ・上記の、アルファテスト、ミップマップ生成がもし無い場合は、絶対必要なので入れてほしい

    WindowsPhone7用に機能制限が必要なのはわかりますが、Windowsアプリに関しては自由にやらせてほしいです。
    開発環境としては、とても作りやすいし、いまさらC++でDirectXには戻りたくないので。
    それでもって、ライブラリは共通にしたいので、ゲーム制作のことも考えると、XNA4.0に移行する必要があります。
    (XNA3.1では、ゲームが提出できなくなるようなので)

    2010年10月22日 14:38

回答

  • XNA Game Studio 4.0になってからグラフィクスAPIに関しては大幅なリファクタリングが行われました。
    http://blogs.msdn.com/b/ito/archive/2010/03/24/xna-game-studio-4-0-refactoring.aspx

    >■アルファテストに関して
    レンダーステートとしてのアルファテストは廃止されました。4.0で新しく追加されたビルトイン・エフェクトのAlphaTestEffectを使用するか、ピクセルシェーダー内でclip命令を使ってピクセルを破棄するようにしてください。アルファテストはDX10/11でも廃止されています。これはピクセルシェーダー処理の後に入るROPとしてハードウェア上に実装するより、ピクセルシェーダー内で早いうちにピクセルを破棄した方がパフォーマンスが上がるためです。

    参考URL: XNA Game Studio 4.0で追加された新しいビルトイン・エフェクト
    http://blogs.msdn.com/b/ito/archive/2010/05/13/new-built-in-effects-in-xna-game-studio-4-0.aspx

    >■ミップマップ生成に関して
    TextureCreationParametersは廃止されました。代わりにTexture2DやRenderTarget2DのコンストラクタにはmipMapを使用するかどうかを指定する引数を使用してください。
    動的ミップマップもRenderTarget2DのコンストラクタにmipMapフラグをtrueに設定すると自動的にmipMapを生成してくれます。

    参考URL: XNA Game Studio 4.0におけるRenderTargetの変更点
    http://blogs.msdn.com/b/ito/archive/2010/05/07/rendertarget-changes-in-xna-game-studio-4-0.aspx

    >■Modelの頂点バッファ、インデックスバッファ取得
    ModelのVertexBuffer、IndexBufferはModelMeshクラスではなくModelMeshPartで宣言されています。

    参考URL: XNA Game Studio 4.0における頂点データ
    http://blogs.msdn.com/b/ito/archive/2010/05/05/vertex-data-in-xna-game-studio-4-0.aspx


    >■シェーダー
    >max関数でエラーがでます。なぜでしょう。
    どんなエラーメッセージがでているのでしょうかお教え願えないでしょうか?

    >■グラフィックス性能を調べる奴
    Capsは廃止され、DX10/11と同じようにプロファイルベースになりました。ただし、レンダーターゲットについて使える機能についてはGraphicsAdapter.QueryTargetFormatGraphicsAdapter.QueryBackBufferFormatメソッドを使って調べることができます。

    参考URL: ReachとHiDef
    http://blogs.msdn.com/b/ito/archive/2010/09/26/reach-and-hidef.aspx

    ★要望
    >・今まであったテクスチャのセーブ、ロードは残してほしい(DDS,BMP,TGAなど)
    4.0では新しい画像コーデックになりました。ファイルからの読み込みはTexture2D.FromStream、書き込みはTexture2D.SaveAsJpeg、Texture2D.SaveAsPngが使用できます。

    参考URL: XNA Game Studio 4.0の画像コーデック
    http://blogs.msdn.com/b/ito/archive/2010/06/01/image-codecs-in-xna-game-studio-4-0.aspx

    >・Windows版では、HiDefの制限に縛られず、自由にグラフィックス性能の最高まで使いたい
    これだけではどの機能をすれば良いのか判りません。あなたの言う「最高のグラフィクス性能」とは何か、またそれを実現するために必要な機能を教えてください。

    >・できれば、シェーダーモデル5.0まで使いたい
    XNA 4.0はDX9上に実装されているのでシェーダーモデル5.0は使用できません。
    2010年10月22日 22:24
  • こういうエラーがでます。
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model


    これは既知の問題で、シェーダーコンパイラーがpow(0,e)という命令をexp(log(0) * e)というものに展開し、この結果がexp(-inf * e)となてしまうことに起因します。
    max(0,x)の0の部分を0.00001fなどの0にはならないが0に非常に近い数にすることでコンパイルエラーを回避できます。

    http://forums.create.msdn.com/forums/p/32167/184067.aspx


    私のグラフィックスカードの本来の性能では、XNA3.1のときはテクスチャは8192まで、アンチエイリアスは8サンプリングまで使えますが、XNA4.0では設定できなくなっています。


    残念ながら、これはプロファイルベースへ移行したことへの弊害のひとつです。プロファイルベースでは規定された条件を満たしているのであれば動作が保証されるという利点があり、特にエンドユーザーが直面する問題を減らすことになっています。例えば「私のPCで動きますか?」という回答に掛かるコストが大幅に削減することができ、開発者のビデオカードに「条件」以上の性能があり、何も知らずに使ってしまい。いざ、ゲームを配布してみたら「動かない」という連絡がユーザーから来るということがなくなります。

    ですが、このことはTakeshi Sasameさんが指摘しているように、条件以上の性能があった場合でも、それらを使うことができないという問題があります。

    XNAではゲームを作ることも大事ですが、作ったゲームを気軽に遊んでもらえる環境を提供することも同じように大事だと考え、4.0ではこのような仕様になっていることをご理解ください。
    2010年10月23日 1:50

すべての返信

  • XNA Game Studio 4.0になってからグラフィクスAPIに関しては大幅なリファクタリングが行われました。
    http://blogs.msdn.com/b/ito/archive/2010/03/24/xna-game-studio-4-0-refactoring.aspx

    >■アルファテストに関して
    レンダーステートとしてのアルファテストは廃止されました。4.0で新しく追加されたビルトイン・エフェクトのAlphaTestEffectを使用するか、ピクセルシェーダー内でclip命令を使ってピクセルを破棄するようにしてください。アルファテストはDX10/11でも廃止されています。これはピクセルシェーダー処理の後に入るROPとしてハードウェア上に実装するより、ピクセルシェーダー内で早いうちにピクセルを破棄した方がパフォーマンスが上がるためです。

    参考URL: XNA Game Studio 4.0で追加された新しいビルトイン・エフェクト
    http://blogs.msdn.com/b/ito/archive/2010/05/13/new-built-in-effects-in-xna-game-studio-4-0.aspx

    >■ミップマップ生成に関して
    TextureCreationParametersは廃止されました。代わりにTexture2DやRenderTarget2DのコンストラクタにはmipMapを使用するかどうかを指定する引数を使用してください。
    動的ミップマップもRenderTarget2DのコンストラクタにmipMapフラグをtrueに設定すると自動的にmipMapを生成してくれます。

    参考URL: XNA Game Studio 4.0におけるRenderTargetの変更点
    http://blogs.msdn.com/b/ito/archive/2010/05/07/rendertarget-changes-in-xna-game-studio-4-0.aspx

    >■Modelの頂点バッファ、インデックスバッファ取得
    ModelのVertexBuffer、IndexBufferはModelMeshクラスではなくModelMeshPartで宣言されています。

    参考URL: XNA Game Studio 4.0における頂点データ
    http://blogs.msdn.com/b/ito/archive/2010/05/05/vertex-data-in-xna-game-studio-4-0.aspx


    >■シェーダー
    >max関数でエラーがでます。なぜでしょう。
    どんなエラーメッセージがでているのでしょうかお教え願えないでしょうか?

    >■グラフィックス性能を調べる奴
    Capsは廃止され、DX10/11と同じようにプロファイルベースになりました。ただし、レンダーターゲットについて使える機能についてはGraphicsAdapter.QueryTargetFormatGraphicsAdapter.QueryBackBufferFormatメソッドを使って調べることができます。

    参考URL: ReachとHiDef
    http://blogs.msdn.com/b/ito/archive/2010/09/26/reach-and-hidef.aspx

    ★要望
    >・今まであったテクスチャのセーブ、ロードは残してほしい(DDS,BMP,TGAなど)
    4.0では新しい画像コーデックになりました。ファイルからの読み込みはTexture2D.FromStream、書き込みはTexture2D.SaveAsJpeg、Texture2D.SaveAsPngが使用できます。

    参考URL: XNA Game Studio 4.0の画像コーデック
    http://blogs.msdn.com/b/ito/archive/2010/06/01/image-codecs-in-xna-game-studio-4-0.aspx

    >・Windows版では、HiDefの制限に縛られず、自由にグラフィックス性能の最高まで使いたい
    これだけではどの機能をすれば良いのか判りません。あなたの言う「最高のグラフィクス性能」とは何か、またそれを実現するために必要な機能を教えてください。

    >・できれば、シェーダーモデル5.0まで使いたい
    XNA 4.0はDX9上に実装されているのでシェーダーモデル5.0は使用できません。
    2010年10月22日 22:24
  • HigeNeko さん

    数多くの返答をありがとうございます。


    >■シェーダー
    >max関数でエラーがでます。なぜでしょう。
    どんなエラーメッセージがでているのでしょうかお教え願えないでしょうか?


    こういうエラーがでます。
    Error 224 Errors compiling C:\(略)\aaaa.fx:
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model
    ID3DXEffectCompiler: Compilation failed C:\(略)\aaaa.fx 194 5 aa_Content


    こういう関数のところで、エラーがでているようです。

    float CalcSpecularPowerSetP(float3 Normal,float3 DirFromLight,float3 EyeToVertex,float power)
    {
        float3 R=normalize(reflect(DirFromLight,Normal));
        return pow(max(0,dot(R,-EyeToVertex)),power);
    //    return pow(dot(R,-EyeToVertex),power);        // maxをなくしたこちらにすると、エラーがでない
    }


    >・Windows版では、HiDefの制限に縛られず、自由にグラフィックス性能の最高まで使いたい
    これだけではどの機能をすれば良いのか判りません。あなたの言う「最高のグラフィクス性能」とは何か、またそれを実現するために必要な機能を教えてください。


    XNA3.1でできていた、テクスチャサイズや、アンチエイリアスの設定です。
    私のグラフィックスカードの本来の性能では、XNA3.1のときはテクスチャは8192まで、アンチエイリアスは8サンプリングまで使えますが、XNA4.0では設定できなくなっています。
    それを設定できるように戻してほしいです。

    リアルタイムレンダリングツールなどを作っている場合、できるだけクォリティーをあげたいので。


    >・できれば、シェーダーモデル5.0まで使いたい
    XNA 4.0はDX9上に実装されているのでシェーダーモデル5.0は使用できません。


    了解です。
    XNA、C#の開発環境は、今まで開発してきた中でもっとも使いやすく、もう他の開発環境に変えがたいです。
    なので、今後の発展を期待したいです。




    2010年10月23日 0:05
  • こういうエラーがでます。
    MultiMaterial.fx(194,5): error X4579: NaN and infinity literals not allowed by shader model


    これは既知の問題で、シェーダーコンパイラーがpow(0,e)という命令をexp(log(0) * e)というものに展開し、この結果がexp(-inf * e)となてしまうことに起因します。
    max(0,x)の0の部分を0.00001fなどの0にはならないが0に非常に近い数にすることでコンパイルエラーを回避できます。

    http://forums.create.msdn.com/forums/p/32167/184067.aspx


    私のグラフィックスカードの本来の性能では、XNA3.1のときはテクスチャは8192まで、アンチエイリアスは8サンプリングまで使えますが、XNA4.0では設定できなくなっています。


    残念ながら、これはプロファイルベースへ移行したことへの弊害のひとつです。プロファイルベースでは規定された条件を満たしているのであれば動作が保証されるという利点があり、特にエンドユーザーが直面する問題を減らすことになっています。例えば「私のPCで動きますか?」という回答に掛かるコストが大幅に削減することができ、開発者のビデオカードに「条件」以上の性能があり、何も知らずに使ってしまい。いざ、ゲームを配布してみたら「動かない」という連絡がユーザーから来るということがなくなります。

    ですが、このことはTakeshi Sasameさんが指摘しているように、条件以上の性能があった場合でも、それらを使うことができないという問題があります。

    XNAではゲームを作ることも大事ですが、作ったゲームを気軽に遊んでもらえる環境を提供することも同じように大事だと考え、4.0ではこのような仕様になっていることをご理解ください。
    2010年10月23日 1:50
  • これは既知の問題で、シェーダーコンパイラーがpow(0,e)という命令をexp(log(0) * e)というものに展開し、この結果がexp(-inf * e)となてしまうことに起因します。
    max(0,x)の0の部分を0.00001fなどの0にはならないが0に非常に近い数にすることでコンパイルエラーを回避できます。


    判りました。
    ありがとうございます。



    XNAではゲームを作ることも大事ですが、作ったゲームを気軽に遊んでもらえる環境を提供することも同じように大事だと考え、4.0ではこのような仕様になっていることをご理解ください。


    理解しました。
    納得しました。
    2010年10月23日 14:33