以前に試したときには期待した動きにならないという結論で終わったのですが、
sygh さんのアドバイスによりエラーが解消されたので改めて確認してみました。
説明
DirectX9Ex では、DirectX9 の機能が拡張されている箇所が多くあります。
その中でもメインメモリを指定してテクスチャを作ることが可能なドキュメントが見つかったのでこれを確認したいと思います。詳しくは以前の内容を参照してください。
確認
C++ でメモリを確保してテクスチャの中身を作成しました。
void* pMemory = malloc(32 * 32 * sizeof(UINT)); { int pitch = 32 * sizeof(UINT); for (int y = 0; y<32; ++y) { unsigned int* p = (unsigned int*)((char*)pMemory + pitch * y); for (int x = 0; x < 32; ++x) { unsigned int v = ((x & 1) ^ (y & 1)) ? 0xFFFFFFFF : 0xFF00FFFF; p[x] = v; } } }
そしてテクスチャを以下のようにして作成します。
以前はメモリ領域の渡し方でミスしていました。
LPDIRECT3DTEXTURE9 tex; hr = pDevice9Ex->CreateTexture( 32, 32, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &tex, static_cast(&pMemory) );
hr がエラーを示さなければ、これでテクスチャが作成されます。
ただし、 D3DPOOL_SYSTEMMEM なのでこのまま描画には使えません。
これを用いて描画するには D3DPOOL_DEFAULT のテクスチャに転送する必要があります。
pDevice9Ex->CreateTexture( 32, 32, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTexture, NULL); pDevice9Ex->UpdateTexture(tex, pTexture);
これでテクスチャを描画に使えるようになったので画面で確認してみると以下のようになり、メインメモリにとったバイト列から手数少なめでテクスチャを作れたことが確認できました。
まとめ
結局のところ、2つのテクスチャオブジェクトが必要なので感触としては微妙なところでした。
領域渡して作成し、UpdateTexture で反映という点で、Lockして書き込むという作業よりは簡単になるかなという気はします。
pMemory のメインメモリを領域を更新して、UpdateTexture を適用して画面が変わってくれればこれも面白いかな、と思ってテストしてみました。しかし結果は変化せずでした。更新したいのであれば SYSTEMMEM のテクスチャを Lock/Unlock して変更し、UpdateTexture という流れが必要でした。
これらの結果から、積極的に活用できる場面はそれほどなさそうな気配です。