В зависимости от того, что именно вы пытаетесь сделать, IDirect3DDevice9 :: UpdateSurface или IDirect3DDevice9 :: StretchRect могут вам помочь.
Для простых операций с очень маленькими текстурами, которые вы описываете, может быть полезно манипулировать имииспользуя процессор (то есть с IDirect3DTexture9 :: LockRect).С D3D9 это обычно подразумевает повторную загрузку текстуры в VRAM, так что это обычно полезно только для небольших или редко изменяемых текстур.Но иногда, если вы привязаны к рендеру и внимательно следите за тем, где вы обновляете текстуру в вашем цикле, можно скрыть стоимость операций, подобных этой, и получать их «бесплатно».
Чтобы избежать VRAMзагрузить, вы можете использовать ресурс POOL_MANAGED в сочетании с соответствующими флагами использования и блокировки, чтобы разместить ресурс в апертуре AGP, который обеспечивает высокоскоростной доступ как из ЦП, так и из графического процессора, см. http://msdn.microsoft.com/en-us/library/windows/desktop/ee418784(v=vs.85).aspx
Есливы манипулируете процессором, помните об ограничениях листов и выравнивания для различных форматов текстур.Лучшая информация об этом - в документации, поставляемой с SDK (включает несколько технических документов), онлайн-документация неполна.
Вот базовый пример:
IDirect3DTexture9* m_tex = getYourTexture();
m_tex->LockRect(0, &outRect, d3dRect, D3DLOCK_DISCARD);
// Stride depends on your texture format - this is the number of bytes per texel.
// Note that this may be less than 1 for DXT1 textures in which case you'll need
// some bit swizzling logic. Can be inferred from Pitch and width.
int stride = 1;
int rowPitch = outRect.Pitch;
// Choose a pointer type that suits your stride.
unsigned char* pixels = (unsigned char*)outRect.pBits;
// Clear to black.
for (int y=0; y < d3dRect.height; ++y)
{
for (int x=0; x < d3dRect.width; ++x)
{
pixels[x + rowPitch * y] = 0x0;
}
}
m_tex->UnlockRect(0);