2

次のタスクを解決するにはどうすればよいですか:一部のアプリは

  1. 数十のdx9terxturesを使用し(dx3dでレンダリングします)、
  2. それらの一部を更新します(全体または一部)。

つまり、時々(フレームごとに1回/秒/分)、既存のテクスチャのサブレクトvoid *にさまざまな形式(argbbgrargb888、565 )でバイト()を書き込む必要があります。openGLソリューションでは非常に簡単です- 。しかし、ここではなじみのないプラットフォーム機能が私を完全に混乱させました。dx9とdx11の両方のソリューションに関心があります。glTexImage2D

4

1 に答える 1

4

テクスチャを更新するには、テクスチャがD3DPOOL_MANAGEDメモリプールに作成されていることを確認してください。

D3DXCreateTexture( device, size.x, size.y, numMipMaps,usage, textureFormat, D3DPOOL_MANAGED, &texture ); 

次に、LockRectを呼び出してデータを更新します

RECT rect  = {x,y,z,w};  // the dimensions you want to lock
D3DLOCKED_RECT lockedRect = {0}; // "out" parameter from LockRect function below
texture->LockRect(0, &lockedRect, &rect, 0);

// copy the memory into lockedRect.pBits
// make sure you increment each row by "Pitch"

unsigned char* bits = ( unsigned char* )lockedRect.pBits; 
for( int row = 0; row < numRows; row++ )
{
    // copy one row of data into "bits", e.g. memcpy( bits, srcData, size )
    ...

    // move to the next row
    bits += lockedRect.Pitch;
}

// unlock when done
texture->UnlockRect(0);
于 2013-02-19T23:00:51.000 に答える