我有一个IDirect3DSurface9,默认池,YUV格式。我如何高效地从中获取位图位?目前我:
- 创建渲染目标:
device->CreateRenderTarget(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &render_target, NULL)
- 将YUV转换为RGB32:
device->StretchRect(videomem_surf, NULL, render_target_, NULL, D3DTEXF_NONE)
(完整矩形,无拉伸)
- 在系统内存中创建普通离屏表面
device->CreateOffscreenPlainSurface(surf_desc.Width, surf_desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &sysmem_offscreen_surf, NULL)
- 从显存中复制数据到系统内存:
device->GetRenderTargetData(render_target, sysmem_offscreen_surface)
- 从离屏表面获取DC,创建兼容的DC和兼容的位图,从离屏表面DC BitBlt到兼容的DC,并通过GetDIBits()将位图位复制到我的缓冲区
这看起来有点繁琐,因为需要进行许多复制:从原始表面到渲染目标,然后到离屏表面,然后到兼容位图,最后到我的缓冲区。如何改进这个过程?
谢谢