Создайте текстуру DirectX9, используя часть (и) изображения - PullRequest
1 голос
/ 18 октября 2011

У меня есть изображение (208x8), и я хотел бы скопировать из него квадраты 8x8 в разных областях, а затем соединить все квадраты, чтобы создать один IDirect3DTexture9 *

1 Ответ

2 голосов
/ 19 октября 2011

В зависимости от того, что именно вы пытаетесь сделать, 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);
...