メモリ上のデータからIDirect3DTexture9オブジェクトを作成する

今回はDirect3D9用のテクスチャをメモリ上に置かれたファイルデータから読み込む方法についてのメモ書きです。

Direct3D9のテクスチャ(IDirect3DTexture9)オブジェクトを画像ファイルから読み込む関数として、D3DXCreateTextureFromFile()が用意されています。

HRESULT D3DXCreateTextureFromFile(          LPDIRECT3DDEVICE9 pDevice,
    LPCTSTR pSrcFile,
    LPDIRECT3DTEXTURE9 *ppTexture
);

これはテクスチャに関連付けるデバイスとファイル名を指定するだけでテクスチャオブジェクトを作成してくれる強力なヘルパー関数です。
しかし、あくまでもこれはディスク上に保存されている画像ファイルが対象となります。
これを汎用ストリーム経由で読み込みたいとなると、対応できなくなります。
代替手段として、ストリームから読み込んだ画像データをいったんメモリ上のバッファに格納し、これをAPIに指定する方法があります。
これはD3DXCreateTextureFromFileInMemory()関数で実現できます。

HRESULT D3DXCreateTextureFromFileInMemory(          LPDIRECT3DDEVICE9 pDevice,
    LPCVOID pSrcData,
    UINT SrcData,
    LPDIRECT3DTEXTURE9 *ppTexture
);

pSrcDataには画像データが格納されたバッファへのポインタ、SrcDataには画像データのサイズ、ppTextureには作成されたテクスチャオブジェクトを受け取るIDirect3DTexture9ポインタを指定します。
使い方は以下のような感じです。

#include <d3dx9.h>
    char* imgData; // 画像データ
    int imgSize;   // 画像データのサイズ
    IDirect3DTexture9* pTexture;
    HRESULT hr = D3DXCreateTextureFromFileInMemory(pDevice, imgData, imgSize, &pTexture);

    if ( FAILED(hr) )
        thror::runtime_error("テクスチャの作成に失敗しました。");

    // 成功

使い方は非常に簡単です。
サポートしている画像は.bmp、.dds、.dib、.jpg、.png、.tgaです。
通常使う分には困らないかと思います。

■参考サイト
テクスチャ関数