locked
XNA 4.0 でのテクスチャ保存形式に関して RRS feed

  • 質問

  • Texture2Dクラスで、テクスチャ保存が、
    ・SaveAsPng
    ・SaveAsJpeg
    この2つの関数になっているようです。

    以前は、下記の9つのフォーマットでセーブできていましたが、この機能は消滅してしまったのでしょうか。
    せめて、DDSとBMPは、残してほしいです。

        public enum ImageFileFormat
        {
            Bmp = 0,
            Jpg = 1,
            Tga = 2,
            Png = 3,
            Dds = 4,
            Ppm = 5,
            Dib = 6,
            Hdr = 7,
            Pfm = 8,
        }


    2010年10月21日 19:10

回答

  • ありがとうございます。確かにツール製作を主眼とした場合は有効なシナリオだと思います。

    ただ、XNA Game Studioはあくまでゲーム製作を主眼としているので、ゲーム製作をする上で大事な多種多様なファイルフォーマットからの読み込みはコンテント・パイプラインを通して行い、その拡張方法はインポーターを作るという設計になっています(PSDインポーターなどが良い例)。パイプラインという名が関するように、データの流れは一方通行になっていて多様なファイルフォーマットへの書き込みはサポートしていません。

    Takeshi Sasameさんの投稿を読んでいると必要なのは画像コンバートライブラリではないでしょうか?それであれば、ImageMagickなどのライブラリを使用するのが向いていると思います。
    また、SourceForceにはx2y(http://x2y.sourceforge.net/features.html)のようにDDSに対応したものもあるようです。

    現状、XNAチームでは画像コンバートライブラリはXNAが目指すべきものではないという見解です。その最もたる理由のひとつとしては画像コンバートライブラリは開発/テスト/サポートに多大なコストが掛かり、それに見合うだけの効果が得られないという状況があります。もちろん、それに見合うだけの理由と効果が期待されるのであれば将来的にはサポートされる可能性もあります。

    ただ、時間と人材は限られているので、XNAチーム内では大量にある追加したい新機能リストの中からリリースごとに追加する新機能を取捨選択するトリアージというプロセスがあります。
    このプロセスの中ではそれぞれの新機能を追加するのに掛かるコストと、その効果などを比べ優先度を決めることになり、画像コンバートライブラリの優先度は低いのが現状です。ですから、画像コンバートライブラリを将来的に提供するにはTakeshi Sasameさんや他の人達からも実装するのに確固たる理由が必要となります。


    まとめると、現状で多くのテクスチャフォーマットをツール上で扱いたいという要望に対しての解決方法は以下のいずれかになると思います。
    1. コンテント・パイプラインを使用し、必要であればインポーターを用意する
    2. XNAの再配布ランタイムにはD3DX.dllが含まれるので、ネイティブDLLを作りP/Invokeで呼び出すか、C++/CLIなアセンブリファイルを作る
    3. ImageMagick等のネイティブライブラリを使い、P/Invokeで呼び出すか、C++/CLIなアセンブリファイルを作る
    4. C#で画像コンバーターを作る
    と、いったことになると思います。
    2010年10月28日 21:05

すべての返信

  • Takeshi Sasame wrote:
    "
    Texture2D class, save the texture
    · SaveAsPng
    · SaveAsJpeg
    Seems to be a function of the two.

    In the past, had made nine saves in the format below, this feature is what's disappeared.
    At least, DDS and BMP is, I want to leave."



    If i understand your question right

    do this to save 

    using (FileStream savedstream = new FileStream(path, FileMode.Create))
    {
           temptex.SaveAsPng(savedstream, temptex.Width, temptex.Height);

    I used a translator so I dont know if this is what you wanted

    私はあなたの質問の権利を理解していれば

    これは保存してください

    (のFileStream savedstream =新しいFileStream(パス、FileMode.Create))を使用して
    {
    (savedstream、temptex.Width、temptex.Height)temptex.SaveAsPng;
    }

    私は知らないので、私は翻訳を使用して、これはあなたが何を望むかされている場合
    2010年10月21日 19:17
  • I want to save the texture with DDS and BMP.
    With XNA4.0.


    私は、テクスチャをDDSやBMPで保存したい。
    XNA4.0で。
    2010年10月21日 19:58
  • As far as I know, there are no XNA methods that will save your texture as a bmp.

    What is wrong with png or jpeg?

    You can just convert and compress the file with another program.


    2010年10月21日 21:31
  • Because I was making the 3D tool, it would be better to have been able to output it by various formats.

    TGA and DDS are buried under the model data output from the tool, these data cannot be read.

    It is necessary to give up making the tool correspond to XNA4.0 if these files cannot be read.



    私は、3Dツールを作っているので、色々なフォーマットで出力できた方が良かった。

    ツールから出力するモデルデータにも、TGA,DDSを埋め込んでいるので、これらのデータを読み込むこともできない。

    もし、これらのファイルを読み込めないのであれば、ツールをXNA4.0に対応させるのをあきらめなければならない。

    2010年10月22日 0:02
  • Takeshi Sasameさんへ

    この件では開発担当のShawn氏がブログで「4.0からは共通の方法で読み込みできるようにし、独自の拡張もできるようにと考えました」的発言をされています。
    読み込みは汎用的にストリームからできるんですけど、書き込みが確かにストリーム経由ではできないんですよね。
    これについてはコメントで他の方も反対意見もわりと見受けられてます。
    (この変更で得するのってsilverlight = 実質WP7だけじゃないか、みたいな)
    http://blogs.msdn.com/b/shawnhar/archive/2010/05/10/image-codecs-in-xna-game-studio-4-0.aspx

    ツール作成ということはWindows用のツールということで良いのでしょうか?
    私自身の場合だったら、の考えですが、いままで3.1で動かしていたのを今のWindowsのXNA4.0に無理に移行するメリットが思いつかないので、
    次のメジャーバージョンアップの情報か破壊的な何かが起きるまで3.1を使い続けると思います。
    もちろん他の機能のためにどうしても4.0が必要なら・・・必要な分を独自で作る形で移行すると思いますが。


    あと予断ですが、件ブログコメントの「サンプルコードはcat.pngなのに、なんで写真が犬なんだ!」てツッコミには吹きました。
    たしかにっ。
    2010年10月22日 9:21
  • 読み込みは汎用的にストリームからできるんですけど、書き込みが確かにストリーム経由ではできないんですよね。


    試したんですが、TGA,DDSは読み込みもできないですね。エラーになります。



    ツール作成ということはWindows用のツールということで良いのでしょうか?
    私自身の場合だったら、の考えですが、いままで3.1で動かしていたのを今のWindowsのXNA4.0に無理に移行するメリットが思いつかないので、
    次のメジャーバージョンアップの情報か破壊的な何かが起きるまで3.1を使い続けると思います。

    はい。Windows用のツールです。
    自分自身は、Windows用のゲーム、ツール、XBOX用のゲーム、WindowsPhone7用のゲームも作っていきたいと思っています。

    確かに、メリットが思いつかないですね。
    しかし、ツールプログラムのライブラリ部分は、ゲームプログラムでも使用したいと考えています。
    それでもって、下記のページにあるように、XNA3.1のゲームはいずれ出せなくなるとすると、ライブラリは変更するしかないという考えになります。

    http://blogs.msdn.com/b/ito/archive/2010/10/12/xna-game-studio-4-0-submissions.aspx

    だから、頼むから今まであったテクスチャ読み書きは対応してくれ!!
    頼む!!

    って思います。
    Windows版のみの拡張要素で良いので。


    もちろん他の機能のためにどうしても4.0が必要なら・・・必要な分を独自で作る形で移行すると思いますが。

    できれば、自分で作ることに時間をかけたくないですが。
    公開されているライブラリとかないでしょうか。
    他に、何か簡単に組み込める方法とか。





    2010年10月22日 12:53
  • こんばんわ、Takeshi Sasameさん。

    試したんですが、TGA,DDSは読み込みもできないですね。エラーになります。


    ヘルプを見る限り、ストリームで対応してるのは、以下の三種類だけのようです。
    .gif、
    .jpg
    .png

    ただ、Contentへの登録では使えるので、完全に使えないと言う事ではないです。
    基本的には、リソースはContentPipelineでって事ですね。

    それで、Windowsのみでだけでも使用したい場合は、以下のどちらかの方法になるかと思います。

    Load及び、Saveを自作
    D3DXCreateTextureFromFile 及び、D3DXSaveTextureToFileの使用(または、他のライブラリ)

    どちらにしても、手間がかかるのが欠点ですが、恐らくは要望を出しても対応されるのは、早くてもXNA5.0となると思いますので、XNA4.0でのこれ以外の方法は無いかと思います。

    PS.
    今回、WindowsPhone7やXbox360の制限に、Windowsを合わせた為に窮屈になってしまったのは、WindowsPhone7で全く新規の開発者が入ってくるのが一つの要因かと思います。
    「WindowsPhone7で使おうと思った機能が、散々調べた挙句Windowsのみの機能だった」と言うのを避けるために、大鉈を振ったのかと。

    2010年10月22日 17:43
  • Texture2D.FromFileの歴史的背景は以下のURLに書いてありますが、もともとTexture2D.FromFileは時間節約の為にWindows限定という問題があるのを承知で実装したものでした。
    http://blogs.msdn.com/b/ito/archive/2010/06/01/image-codecs-in-xna-game-studio-4-0.aspx


    XNAの目標は全てのプラットフォームで一貫性を保つことで、Texture2D.FromFileはWindows上のみで動作する機能というこの目標に反するものだったので今回を機に対応する全てのプラットフォームで動作する画像コーデックを採用することになりました。ですから、以前はできなかったXbox 360上での画像ファイルの保存や読み込みができるようになったのはプラスになっています。対応ファイルフォーマットが少ないのはゲーム内で保存/読み込みに必要なファイルフォーマットはそんなに多くないということと、時間的制約(今までリトルエンディアンCPU用に書かれたコードをビッグエンディアンであるXbox 360上に移植するのには時間が掛かります)からきたものです。

    ただし、今回のTakeshi Ssameさんが遭遇した問題のように、Windows用のツールを作っている人達にとっては今までサポートされていたファイルがサポートされなくなったという問題があります。XNAチームとしてはこの問題について、Windows限定の場合は他のライブラリなどを併用するかコンテント・パイプラインを使用してくださいというのが現状です。

    次バージョン設計の為に参考として知りたいのは以下についてです。
    1. BMPやDDSファイルはゲーム内で読み込み/保存する必要があるのか、あるとすればどんな時に必要になるのか?
    2. BMPやDDSファイルの読み込み/保存はツール用のみに必要なのか?
    3. DDSファイルをサポートする場合、どんな画像フォーマットをサポートする必要があるのか?

    以上、よろしくお願いします。

    2010年10月22日 23:15
  • DARLさん

    D3DXCreateTextureFromFile 及び、D3DXSaveTextureToFileの使用(または、他のライブラリ)


    なるほど、DirectXライブラリにありましたね。
    しかし。

    たとえば、LAスタジオという3DCGソフトがあります。
    http://www.drf.co.jp/liveanimation/

    XNAで作られている奴です。
    このソフトを使うには、
    Microsoft .NET Framework 4
    Microsoft XNA Framework Redistributable 3.1
    の2つをインストールする必要があるわけです。

    このソフトをXNA4.0に対応させようと思った場合。
    このソフトのモデルデータ内にDDSや、TGAが埋め込まれているので、モデルデータの下位互換を保つためにはXNA4.0のライブラリだけでは駄目になりますね。
    そうなると、上記2つに加えて、DirectXもインストールしなくてはならない。もしくは、C#とXNA4.0ライブラリをインストールしなくてはならない。
    3つも、4つもインストーラーを実行しなければならないので、使うまでにメチャクチャ時間と手間がかかるようになってしまいます。

    こういった事例もあるので、過去のバージョンで使えた機能がなくなるのは非常に困ります。
    なんらかの、代替手段を用意してほしいと、切実に思います。

    他にも、今まで作ったXBOXのインディーズゲームの中で、セーブデータ内にDDSや、TGAを保存していた場合はどうでしょう。
    ゲームのバージョンアップ版を作ることができなくなってしまうのではないでしょうか。

    ということなので、DDSやTGA入出力に対応したXNA4.1を用意してもらえると、非常にうれしいです。


    2010年10月22日 23:22
  • HigeNekoさん

    Higenekoさんと、投稿がかぶってしまって、上の投稿はHigenekoさんの投稿を読む前のものです。


    1. BMPやDDSファイルはゲーム内で読み込み/保存する必要があるのか、あるとすればどんな時に必要になるのか?
    2. BMPやDDSファイルの読み込み/保存はツール用のみに必要なのか?
    3. DDSファイルをサポートする場合、どんな画像フォーマットをサポートする必要があるのか?


    ゲームでは別に、必要じゃないです。
    よく考えてみれば、PNGとJPGで十分な気がします。(ゲームの場合は)

    単純に、以前あったものがなくなったことが問題です。


    作っているものがツールなので、色々なフォーマットに対応しておいたほうが良いというのはあります。
    たとえば、3Dギャラリーや、TurboSquidなどのデータをツールでは、そのまま読み込めたほうが便利ですね。
    http://sketchup.google.com/3dwarehouse/
    http://www.turbosquid.com/

    わざわざ、PhotoShopなどで、ファイルフォーマットを変換したり、3Dツールから出力しなおしたりするより、そのままツールに読み込めるようにしたいです。

    あとは上の投稿にあるとおり、無くなると困るんです。
    2010年10月22日 23:38
  • >3つも、4つもインストーラーを実行しなければならないので、使うまでにメチャクチャ時間と手間がかかるようになってしまいます。
    複数のライブラリを使うことが必ずしもエンドユーザーに複数のインストーラーを強いる訳ではありません。XNAランタイムは3.0の時からインストーラー用のコンポーネントも付属するようになったのでインストーラーを作ることによって、エンドユーザー側からは一つのインストーラーに見えるけど、内部では複数のインストーラーを実行するということができます。また、インストーラーを作るのが面倒だという場合でもClickOnceを作ることによって、ユーザー側からすればその名の通りに自分のサイトにアップしたゲームをワンクリック(セキュリティの確認画面を除けば)でインストールすることができます。

    参考 URL: ClickOnce その1
    http://blogs.msdn.com/b/ito/archive/2008/10/17/clickonce-01.aspx

    また、3.0からは再配布用のパッケージにDirectXランタイムも含まれているのでDirectXを別途インストールする必要はなくなりました。この中にはD3DXのd3dx9_33.dllとd3dx9_41.dllのも含まれているので、Windows限定であればInteropやP/Invokeを使う必要がありますが、インストーラーを増やすことなく、今まで使っていたファイルの読み書きができるでしょう。


    >他にも、今まで作ったXBOXのインディーズゲームの中で、セーブデータ内にDDSや、TGAを保存していた場合はどうでしょう。
    >ゲームのバージョンアップ版を作ることができなくなってしまうのではないでしょうか。

    これは前の投稿であったように、Xbox 360上ではもともとTexture2D.FromFileなどは使えなかったので問題ありません、逆に4.0では画像の読み込み/書き込みができるようになっています。
    2010年10月23日 1:12
  • ヘルプに書いてはありますが、このフォーラムでのやりとりだけを見て、もしかすると、勘違いする人も出るかも知れないので、ちょっと、まとめておきます。

    ・Texture2D.FromStream の対応フォーマット

    .gif、.jpg または .png。

    ・TextureImporter (コンテンツパイプライン)の対応フォーマット

    .bmp、.dds、.dib、.hdr、.jpg、.pfm、.png、.ppm、および .tga

    ですので、現状、ツール作成では問題が生じますが、ゲームで使用する場合に関しては、コンテンツパイプラインで多くのフォーマットが使用できるので、問題はほぼ生じないと言う事になります。

    無いとは思いますが、テクスチャが.gifの場合は、変換して下さいと言う事で……。
    2010年10月23日 11:57
  • HigeNeko さん

    質問に答えていただきありがとうございます。

    色々、考えた結果、
    C#からDirectXを呼び出して、画像のセーブ、ロード関数を作るしかあるまいという考えになりました。


    また、3.0からは再配布用のパッケージにDirectXランタイムも含まれているのでDirectXを別途インストールする必要はなくなりました。この中にはD3DXのd3dx9_33.dllとd3dx9_41.dllのも含まれているので、Windows限定であればInteropやP/Invokeを使う必要がありますが、インストーラーを増やすことなく、今まで使っていたファイルの読み書きができるでしょう。


    これのサンプルコードなど無いでしょうか。
    C#からDirectXを使って、dds,tga,bmpなどの読み込みをしているようなもののサンプル。

    今まで、普通のXNAのプログラムの組み方でしかやってこなかったので、外部ライブラリの関数呼び出しとか全然わからないんです。
    ネットで調べてみているのですが、イマイチよくわからないです。

    http://dora.bk.tsukuba.ac.jp/~takeuchi/index.php?%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%2F%A3%C3%A1%F4%2FDirect3D%A4%F2%BB%C8%A4%C3%A4%BF2D%C9%C1%B2%E8

    これが、参考になりそうだと思って読んでいるのですが、
    Direct3Dのデバイスを作らなきゃいけないのか? とか
    Direct3Dのテクスチャから、XNAのTexture2Dに変換するのはどうやるんだ?
    っていう辺りがわからないのですが。
    2010年10月27日 23:50
  • もう少し作っているツールの具体的な用途が判ればもっと的確な助言ができると思います。例えば作っているツールがレベルエディタなどで使う人がXNA Game Studioを使っているという前提であれば、コンテントパイプラインを使うというのが一番楽に開発できる方法だと思われます。この場合、読み込みは今まで通りのファイル形式からできます。

    また、ファイルの書き込みをする場合ddsやbmp形式のファイルに書き出すことが必要になってくるケースをお教え願えないでしょうか?ちなみに3.1の時でも.tga,.ppmファイルへの書き込みはできません。
    2010年10月28日 5:35
  • > たとえば、LAスタジオという3DCGソフトがあります。
    > http://www.drf.co.jp/liveanimation/

    これを作っています。

    使っている人に、C#やらをインストールしてもらうのは、抵抗があります。

    3.1で、PPMは、書き込みできないようですが、TGAは読み書きできています。(私の環境だけでしょうか?)


    また、ファイルの書き込みをする場合ddsやbmp形式のファイルに書き出すことが必要になってくるケースをお教え願えないでしょうか?

    書き込みに関しては、絶対必要というわけではありません。
    しかし、今までスナップショットや、レンダリング時にDDSや、BMP、TGA,JPG,PNGで出力できていたのに、それができなくなるのはツールとしてイマイチです。


    読み込みに関しては、
    モデルデータ内に、テクスチャを含めていたので今からPNG限定にしたとしても過去のデータが読めなくなるので必要です。

    市販の3Dツール、XSI,MAX,MAYAなどから出力されたデータのテクスチャは、DDSや、BMP,TGA,PSDなど様々なフォーマットで出力されます。
    そのため、それを読み込むのは必要です。
    PSDも対応したいぐらいなのです。(Zブラシでも対応しているので)

    できるだけ多くのフォーマットに対応できているほうが望ましいです。
    2010年10月28日 13:53
  • ありがとうございます。確かにツール製作を主眼とした場合は有効なシナリオだと思います。

    ただ、XNA Game Studioはあくまでゲーム製作を主眼としているので、ゲーム製作をする上で大事な多種多様なファイルフォーマットからの読み込みはコンテント・パイプラインを通して行い、その拡張方法はインポーターを作るという設計になっています(PSDインポーターなどが良い例)。パイプラインという名が関するように、データの流れは一方通行になっていて多様なファイルフォーマットへの書き込みはサポートしていません。

    Takeshi Sasameさんの投稿を読んでいると必要なのは画像コンバートライブラリではないでしょうか?それであれば、ImageMagickなどのライブラリを使用するのが向いていると思います。
    また、SourceForceにはx2y(http://x2y.sourceforge.net/features.html)のようにDDSに対応したものもあるようです。

    現状、XNAチームでは画像コンバートライブラリはXNAが目指すべきものではないという見解です。その最もたる理由のひとつとしては画像コンバートライブラリは開発/テスト/サポートに多大なコストが掛かり、それに見合うだけの効果が得られないという状況があります。もちろん、それに見合うだけの理由と効果が期待されるのであれば将来的にはサポートされる可能性もあります。

    ただ、時間と人材は限られているので、XNAチーム内では大量にある追加したい新機能リストの中からリリースごとに追加する新機能を取捨選択するトリアージというプロセスがあります。
    このプロセスの中ではそれぞれの新機能を追加するのに掛かるコストと、その効果などを比べ優先度を決めることになり、画像コンバートライブラリの優先度は低いのが現状です。ですから、画像コンバートライブラリを将来的に提供するにはTakeshi Sasameさんや他の人達からも実装するのに確固たる理由が必要となります。


    まとめると、現状で多くのテクスチャフォーマットをツール上で扱いたいという要望に対しての解決方法は以下のいずれかになると思います。
    1. コンテント・パイプラインを使用し、必要であればインポーターを用意する
    2. XNAの再配布ランタイムにはD3DX.dllが含まれるので、ネイティブDLLを作りP/Invokeで呼び出すか、C++/CLIなアセンブリファイルを作る
    3. ImageMagick等のネイティブライブラリを使い、P/Invokeで呼び出すか、C++/CLIなアセンブリファイルを作る
    4. C#で画像コンバーターを作る
    と、いったことになると思います。
    2010年10月28日 21:05
  • まとめると、現状で多くのテクスチャフォーマットをツール上で扱いたいという要望に対しての解決方法は以下のいずれかになると思います。
    1. コンテント・パイプラインを使用し、必要であればインポーターを用意する
    2. XNAの再配布ランタイムにはD3DX.dllが含まれるので、ネイティブDLLを作りP/Invokeで呼び出すか、C++/CLIなアセンブリファイルを作る
    3. ImageMagick等のネイティブライブラリを使い、P/Invokeで呼び出すか、C++/CLIなアセンブリファイルを作る
    4. C#で画像コンバーターを作る



    ありがとうございます。
    2か、3を試してみようと思います。
    2010年10月31日 19:45