У меня IDirect3DSurface9, пул по умолчанию, формат YUV. Как я могу эффективно получить биты растрового изображения из него? На данный момент я:
- create render target:
device->CreateRenderTarget(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &render_target, NULL)
- convert YUV to RGB32:
device->StretchRect(videomem_surf, NULL, render_target_, NULL, D3DTEXF_NONE)
(complete rectangle, no stretching)
- create plain offscreen surface in system memory
device->CreateOffscreenPlainSurface(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &sysmem_offscreen_surf, NULL)
- copy data from video mem to sysmem:
device->GetRenderTargetData(render_target, sysmem_offscreen_surface)
- GetDC from offscreen surface, create compatible DC and compatible bitmap, BitBlt from offscreen sufrace DC to compatible DC and copy bitmap bits to my buffer by GetDIBits()
это выглядит немного накладно из-за большого количества копий: с исходной поверхности на цель рендеринга, затем на закадровую поверхность, затем на совместимое растровое изображение и, наконец, в мой буфер. Как это можно улучшить?
Спасибо