本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

メインメモリ領域をテクスチャにできる?!

DirectX 9.0 Ex の話になりますが、マイクロソフトの MSDN の説明に以下のようにありました。

Applications that need more flexibility over the use, allocation and deletion of
 the system memory can now create textures from a system memory pointer. 
For example, an application could create a Direct3D texture 
from a GDI system-memory bitmap pointer.

MSDN のページとしてこちら :
https://msdn.microsoft.com/en-us/library/windows/desktop/bb219800(v=vs.85).aspx

この内容を見ると、メモリ領域を指定してテクスチャを生成できるように思います。また参照先の内容を見るとテクスチャを破棄するまでその領域は存在しなくてはならないようなので、ある意味でダイナミックなテクスチャが楽に出来そうな気配もあります。

そこで以下のようなコードを作成してみました。

void* pSysMemTex = malloc( 256*256*4 );
memset( pSysMemTex, 0, 256*256*4 );
hr = g_pDevice->CreateTexture(
 256, 256, 1, 
 0, 
 D3DFMT_A8R8G8B8, 
 D3DPOOL_SYSTEMMEM, 
  &pTexture, 
 (HANDLE*)pSysMemTex );

うまくいけばこれで黒いテクスチャができるはず。
しかしながら結果は失敗で、テクスチャは作れずでした。デバッグランタイムによると HANDLE* の部分がおかしいといわれました。 MSDN の記述にあったようなメモリ領域を直接渡すようなことは不可能な模様です。

さらに同じようなことをやってうまくいっていない情報を見かけました。

Directx Texture interface to existing memory

一見、うまく動きそうだったのでちょっと期待していたのですが、残念です。共有リソースとしてのハンドル渡ししか使えないということでしょうか。

DirectXプログラミング
すらりんをフォローする
すらりん日記

コメント

  1. sygh より:

    HANDLE型はvoidへのポインタなので、IDirect3DDevice9::CreateTexture()の第8引数pSharedHandleはvoidへのダブルポインタになります。無理やりHANDLEへのポインタにキャストするのではなく、voidポインタ変数のアドレスを素直に渡せば成功するはず。Cスタイルのキャストはコンパイラをだますことで何でもできてしまいすぎてバグの温床になりやすいので、C++のキャスト構文を使い、なおかつキャストは必要最低限にとどめることをお勧めします。

    • すらりん より:

      sygh さん、アドバイス頂きありがとうございます。
      voidポインタ変数にいれて、変数のアドレスを素直に渡したところエラーが出なくなりました。
      動作の方はこれからまたリトライしてみたいと思います。

タイトルとURLをコピーしました