• ベストアンサー

DirectX9でのテクスチャフォーマットについて

いつもお世話になります。 VC6.0&WIN2000、DirectX9.0でプログラムを作っています。 D3DXCreateTextureFromFileInMemoryEx関数でテクスチャを読み込んだあと、テクスチャのメンバ関数のGetLevelDescを行ってみました。 すると、フォーマットの返り値が必ず D3DFMT_A8R8G8B8 になります。 D3DXCreateTextureFromFileInMemoryEx関数で指定したフォーマットと違うのですが、これは何故でしょうか? また上記のせいか、元々の画像ファイルのサイズよりも、多くのメモリを使用しています。 おそらく、1ピクセルを D3DFMT_A8R8G8B8 の大きさでメモリを確保してしまうからだと思うのですが、本来の画像フォーマットの大きさで確保する方法はないでしょうか? それでは、どうぞ宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • aho0xff
  • ベストアンサー率12% (218/1771)
回答No.2

補足有難うございます。再び回答してみます。 もっともこれ以上詳しくなると久しぶりな分もあって私のほうがウソついて しまってるかも知れませんが・・・・ 私が気にしてるのは、(D3DFMT_P8,D3DFMT_A8P8)のフォーマットでそもそも テクスチャが作れるビデオカードなのか?という点です。16、24ビットも 画面モードとしての話ではなく、あくまでもテクスチャのフォーマットとして D3DFMT_R8G8B8 D3DFMT_R5G6B5 D3DFMT_X1R5G5B5 D3DFMT_A1R5G5B5 D3DFMT_A4R4G4B4 これらが使えるかどうかはビデオカードによるということです。もともと作れないテクスチャは 吐き出さないつくりになっているはずです。なので使えないなら一番そのビデオカードで近いフォーマット が選び出されているはずなのです。 DirectX(特に3D)はプログラムコードとしては非常に多機能ですが、その個々の機能が使えるか どうかはほぼ間違いなくビデオカードに左右されます。D3DX_系の関数はそれらハードウェアに 左右される部分をある程度よろしくやってしまう(つまり使えないなら「代わり」を使用する)関数群のはずです。

amoban
質問者

お礼

お答え有難うございます。 また大変返事が遅くなり、申し訳ありませんでした。 質問の件は、やはりaho0xffさんのおっしゃるように、ビデオカード依存によるもので、プログラムでは回避できないのかなと思い、 結局、画像データのサイズを小さくすることで、できる限り読み込み後のサイズを小さくすることにしました。 どうも有難うございました。

その他の回答 (2)

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.3

>本来の画像フォーマットの大きさで確保する方法はないでしょうか? 基本的にVRAM上には無理です。デバイスに依存します。 最新のDirectX9対応のグラフィックカードの傾向としては高速、しかしVRAM大量消費という時代です。 (ハイグレードなカードだとVRAM512M、またIndex Colorに対応しないカードもあります。) VRAMに展開する以上は最初に作成したデバイスにフォーマットは依存します。 既出ですが、DirectX9で定義されている全てのフォーマットにビデオカード が対応しているわけではありません。 もし全てのフォーマットに対応した仕組みを用意するとなるとハードウェアのコストパフォーマンスは悪くなります。 それよりもVRAMを多く積んだ方が現実的なのです。 独自に管理するメモリにおいておく方法もありますがメインメモリ→VRAMは激重です。 少なくともループの中で何度も行うようなものではありません。 (RPG等の場合、自分が移動してる間に メインメモリ→VRAMに内容を入れ替えていくという方法はよく使われます。 そうすれば少ないVRAMのカードでも上手くごまかす事ができます。)

amoban
質問者

お礼

お答え有難うございます。 また大変返事が遅くなり、申し訳ありませんでした。 質問の件は、下記の回答者様とかさなるのですが、 画像データのサイズを小さくすることで、できる限り読み込み後のサイズを小さくすることにしました。 それと、本体のRAM容量を512Mから1Gに増やすと、劇的に実行速度が向上しました。 それだけ、テクスチャに取っていた容量が大きかったようです。 どうも有難うございました。

  • aho0xff
  • ベストアンサー率12% (218/1771)
回答No.1

DirectXから離れてしばらくの私ですが、がんばって回答してみます。 元の画像フォーマット・・・・ってもしかして*.jpgとか*.pngのこと言ってますか? だとしたら、それは無理です。 で、それは違う。D3DFORMATを別で指定している!!というのなら、その指定したフォーマットが あなたの環境のビデオカードでは使用できない可能性があるかも知れません。 特に16,24ビットフォーマットはビデオカードに左右される部分が大きいハズですので 初期化時に使用できるフォーマットをきちんと確認し、覚えておく必要があると思います。 それも違うというのなら・・・・これ以上は私では分かりません。 D3DXCreateTextureFromFileInMemoryEx()ではなくて他のやり方をやってみろとしか・・・ 結構D3DX_系の関数は便利な分、よろしくやりすぎてしまう部分もあるので・・・・

amoban
質問者

補足

有難うございます。 画像フォーマットですが、以前は32ビットα情報付のTGAファイルを使っていました。 今回、8ビットパレットのTGAや、α8ビット情報付&8ビットパレットのTGAを使っています。 当然今回の方が元の画像の容量はかなり減っています。 ですが、質問にあるように、D3DXCreateTextureFromFileInMemoryEx関数でテクスチャを読み込んだあと、 テクスチャのメンバ関数のGetLevelDescを行ってみると、 元の画像(D3DFMT_P8,D3DFMT_A8P8等)よりも拡張された32ビットα情報付フォーマット( D3DFMT_A8R8G8B8)に変更されているのです。 モニタの設定をTRUEColor(32bit)からHighColor(16bit)に変更しても、変わりません。 なぜに、読み込んだ後のテクスチャがD3DFMT_A8R8G8B8フォーマットに変換されてしまうのかが謎なのです。(拡張してまで) テクスチャは、D3DFMT_A8R8G8B8フォーマットに強制的に統一されてしまうのかなぁと思ったりしてます・・・

関連するQ&A