大人になっても苦手な食べ物、ありますか?

いつもお世話になります。
VC6.0&WIN2000、DirectX9.0でプログラムを作っています。

D3DXCreateTextureFromFileInMemoryEx関数でテクスチャを読み込んだあと、テクスチャのメンバ関数のGetLevelDescを行ってみました。

すると、フォーマットの返り値が必ず D3DFMT_A8R8G8B8 になります。
D3DXCreateTextureFromFileInMemoryEx関数で指定したフォーマットと違うのですが、これは何故でしょうか?

また上記のせいか、元々の画像ファイルのサイズよりも、多くのメモリを使用しています。
おそらく、1ピクセルを D3DFMT_A8R8G8B8 の大きさでメモリを確保してしまうからだと思うのですが、本来の画像フォーマットの大きさで確保する方法はないでしょうか?

それでは、どうぞ宜しくお願いします。

A 回答 (3件)

補足有難うございます。

再び回答してみます。
もっともこれ以上詳しくなると久しぶりな分もあって私のほうがウソついて
しまってるかも知れませんが・・・・

私が気にしてるのは、(D3DFMT_P8,D3DFMT_A8P8)のフォーマットでそもそも
テクスチャが作れるビデオカードなのか?という点です。16、24ビットも
画面モードとしての話ではなく、あくまでもテクスチャのフォーマットとして
D3DFMT_R8G8B8
D3DFMT_R5G6B5
D3DFMT_X1R5G5B5
D3DFMT_A1R5G5B5
D3DFMT_A4R4G4B4
これらが使えるかどうかはビデオカードによるということです。もともと作れないテクスチャは
吐き出さないつくりになっているはずです。なので使えないなら一番そのビデオカードで近いフォーマット
が選び出されているはずなのです。

DirectX(特に3D)はプログラムコードとしては非常に多機能ですが、その個々の機能が使えるか
どうかはほぼ間違いなくビデオカードに左右されます。D3DX_系の関数はそれらハードウェアに
左右される部分をある程度よろしくやってしまう(つまり使えないなら「代わり」を使用する)関数群のはずです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/04/14 10:52

>本来の画像フォーマットの大きさで確保する方法はないでしょうか?


基本的にVRAM上には無理です。デバイスに依存します。
最新のDirectX9対応のグラフィックカードの傾向としては高速、しかしVRAM大量消費という時代です。
(ハイグレードなカードだとVRAM512M、またIndex Colorに対応しないカードもあります。)
VRAMに展開する以上は最初に作成したデバイスにフォーマットは依存します。

既出ですが、DirectX9で定義されている全てのフォーマットにビデオカード
が対応しているわけではありません。
もし全てのフォーマットに対応した仕組みを用意するとなるとハードウェアのコストパフォーマンスは悪くなります。
それよりもVRAMを多く積んだ方が現実的なのです。



独自に管理するメモリにおいておく方法もありますがメインメモリ→VRAMは激重です。
少なくともループの中で何度も行うようなものではありません。
(RPG等の場合、自分が移動してる間に
メインメモリ→VRAMに内容を入れ替えていくという方法はよく使われます。
そうすれば少ないVRAMのカードでも上手くごまかす事ができます。)
    • good
    • 0
この回答へのお礼

お答え有難うございます。
また大変返事が遅くなり、申し訳ありませんでした。

質問の件は、下記の回答者様とかさなるのですが、
画像データのサイズを小さくすることで、できる限り読み込み後のサイズを小さくすることにしました。

それと、本体のRAM容量を512Mから1Gに増やすと、劇的に実行速度が向上しました。
それだけ、テクスチャに取っていた容量が大きかったようです。

どうも有難うございました。

お礼日時:2006/04/14 10:55

DirectXから離れてしばらくの私ですが、がんばって回答してみます。



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

この回答への補足

有難うございます。
画像フォーマットですが、以前は32ビットα情報付のTGAファイルを使っていました。
今回、8ビットパレットのTGAや、α8ビット情報付&8ビットパレットのTGAを使っています。
当然今回の方が元の画像の容量はかなり減っています。

ですが、質問にあるように、D3DXCreateTextureFromFileInMemoryEx関数でテクスチャを読み込んだあと、
テクスチャのメンバ関数のGetLevelDescを行ってみると、
元の画像(D3DFMT_P8,D3DFMT_A8P8等)よりも拡張された32ビットα情報付フォーマット( D3DFMT_A8R8G8B8)に変更されているのです。

モニタの設定をTRUEColor(32bit)からHighColor(16bit)に変更しても、変わりません。
なぜに、読み込んだ後のテクスチャがD3DFMT_A8R8G8B8フォーマットに変換されてしまうのかが謎なのです。(拡張してまで)

テクスチャは、D3DFMT_A8R8G8B8フォーマットに強制的に統一されてしまうのかなぁと思ったりしてます・・・

補足日時:2006/03/17 14:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報