在过去的几天里,我一直在寻找一种在图形中使用DirectX 2D的选项,在该图形中我可以渲染为“某物”,然后渲染为“某物”-用作其他图形的输入。
所有Henderd,Dc,Wic位图之类的RenderTargets-均不允许这样做(Wic目标不使用硬件加速)。
我发现的唯一方法是D2D1DeviceContext M$ document
我可以在其中创建可以设置为目标的ID2D1Bitmap1(也可以在使用CPU_READ标志创建时可以进行映射和读取)。
到目前为止-很好,一切正常。 但是,最后,我们所有人都希望在用户屏幕上显示绘图结果,为此,我们需要将其传递给某些WinAPI DC。
我已经这样做了。
创建具有GDI兼容性的ID2D1Bitmap1
D2D1_BITMAP_PROPERTIES1 bitmapProperties =
D2D1::BitmapProperties1(
D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE,
D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED)
);
从ID2D1DeviceContext获取-ID2D1GdiInteropRenderTarget
_d2d1context->QueryInterface(IID_PPV_ARGS(&_d2d1GDIinterface))
最后-使用此接口,我得到DC并使用GDI功能BitBlt
void paste_bitmap_into_dc(HDC dc, ID2D1Bitmap& bitmap) {
_d2d1context->SetTarget(&bitmap);
_d2d1context->BeginDraw();
HDC new_dc;
_d2d1GDIinterface->GetDC(D2D1_DC_INITIALIZE_MODE_COPY, &new_dc);
BitBlt(dc, 0, 0, bitmap.size().x, bitmap.size().y, new_dc, 0, 0, SRCCOPY);
RECT update_rect;
SetRect(&update_rect, 0, 0, 0, 0); // i don't want to actually update bitmap on ID2D1DeviceContext
_d2d1GDIinterface->ReleaseDC(&update_rect);
_d2d1context->EndDraw();
}
可以,但是我不确定这是正确(最快)的方法,因为创建了DC,并且复制了两次(希望-在硬件方面):从目标ID2D1Bitmap到此新DC,然后从新DC输入直流。 实际上,此方法更适合在GDI上绘制D2D1内容(ReleaceDC拥有要更新位图的哪一部分的参数)。
有人可以帮助/确认这种方式吗? 预先感谢!