我该如何解决以下任务:一些应用程序需要
- 使用几十个 dx9 纹理(用 dx3d 渲染它们)和
- 更新其中一些(全部或部分)。
即有时(每帧/秒/分钟一次)我需要以void *
不同格式(argb、bgra、rgb、888、565)将字节()写入现有纹理的某些子矩形。在 openGL 中的解决方案非常简单 - glTexImage2D
. 但是这里不熟悉的平台功能完全让我感到困惑。对 dx9 和 dx11 的解决方案感兴趣。
要更新纹理,请确保在 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);