Обновить текстуру DirectX

Как я могу решить следующую задачу: какое-то приложение должно

  1. использовать десятки текстур dx9 (рендерить их с помощью dx3d) и
  2. обновить некоторые из них (полностью или частично).

т.е. иногда (один раз в кадр/секунду/минуту) мне нужно записать байты (void *) в разных форматах (argb, bgra, rgb, < em>888, 565) в некоторый суб-прямоугольник существующей текстуры. В openGL решение очень простое — glTexImage2D. Но вот незнакомые особенности платформы меня совсем сбили с толку. Интересует решение как для dx9, так и для dx11.


person mjollneer    schedule 19.02.2013    source источник


Ответы (1)


Чтобы обновить текстуру, убедитесь, что текстура создана в пуле памяти 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);
person default    schedule 19.02.2013