2013-07-23 4 views
1

Использование Direct2D Я хотел бы иметь возможность либо отображать в системную память, либо копировать содержимое цели рендеринга в системную память.Копирование с RenderTarget в память хоста

Возможно ли это с помощью Direct2D? Или мне нужно сделать какой-нибудь d3d interop?

+0

возможно дубликат [Как получить пиксельные данные из Direct2D] (http://stackoverflow.com/questions/17513385/how-to-retrieve-pixel-data-from-direct2d) –

ответ

1

Вы можете использовать ID2D1Factory :: CreateWICBitmapRenderTarget для рендеринга на битовой карте WIC, и затем вы можете читать в пикселях из растрового изображения WIC. Что-то вдоль этих линий:

ID2D1Factory* d2dfac = 0; 
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &d2dfac); 

IWICImagingFactory* wicfac = 0; 
CoCreateInstance(CLSID_WICImagingFactory, 0, CLSCTX_INPROC_SERVER, 
      IID_IWICImagingFactory, (void**)&wicfac); 

IWICBitmap* bmp = 0; 
wicfac->CreateBitmap(width, height, 
         GUID_WICPixelFormat32bppPBGRA, 
         WICBitmapCacheOnLoad, &bmp); 

ID2D1RenderTarget* render = 0; 
d2dfac->CreateWicBitmapRenderTarget(
    bmp, 
    D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT, 
            D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, 
                D2D1_ALPHA_MODE_PREMULTIPLIED), 
            0.f, 0.f, 
            D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE), 
    &render); 

render->BeginDraw(); 
// ... Draw on the render target ... 
render->EndDraw(0, 0); 

WICRect rect = { 0, 0, width, height }; 
IWICBitmapLock* lock = 0; 
bmp->Lock(&rect, WICBitmapLockRead, &lock); 

BYTE* data = 0; 
UINT sz = 0; 
lock->GetDataPointer(&sz, &data);