将Directx 11后台缓冲区渲染到Direct2d上

时间:2019-03-02 11:14:12

标签: c++ winapi direct3d direct2d

我想创建一个简单的关卡编辑器,其中编辑器的gui将由Direct2d呈现,而所有其他3D图形将由Directx 11处理。就像Unity3D一样。 >

https://i.stack.imgur.com/tf5G1.png

您可以看到3D图形正在GUI内渲染..我如何与Direct2d共享我的DirectX 11应用程序的后缓冲区(用于渲染GUI)...这样3D场景将在GUI内渲染..或请提出一些其他建议,然后再使用Direct2d ...还要考虑性能。.谢谢..

2 个答案:

答案 0 :(得分:0)

我不知道是否可以共享。创建另一个d3d11纹理,从中获取表面,然后在该表面上创建Direct2D目标/上下文可能更容易。稍后,您可以将此UI纹理与3D内容一起呈现,就像对其他任何纹理一样。

答案 1 :(得分:0)

是的,你可以做到。

在标题中保留:

ID2D1Device* m_d2device;
ID2D1DeviceContext* m_deviceContext;
ID2D1RenderTarget* m_renderTargetView;
ID2D1Factory* m_factory2d;
IDXGISurface* m_dxgiBackbuffer;
IDWriteFactory1* m_writeFactory;

工厂2D:

HRESULT result;
// create the D2D factory

D2D1_FACTORY_OPTIONS options2d;
options2d.debugLevel = D2D1_DEBUG_LEVEL_NONE;
result = D2D1CreateFactory(D2D1_FACTORY_TYPE::D2D1_FACTORY_TYPE_MULTI_THREADED, options2d, &m_factory2d);

创建DXGI曲面:

// set up the D2D render target using the back buffer
m_swapChain->GetBuffer(0, IID_PPV_ARGS(&m_dxgiBackbuffer));

D2D1_RENDER_TARGET_PROPERTIES props =
D2D1::RenderTargetProperties
(D2D1_RENDER_TARGET_TYPE_DEFAULT,
D2D1::PixelFormat
  (
  DXGI_FORMAT_UNKNOWN,
  D2D1_ALPHA_MODE_PREMULTIPLIED
  )
);

m_factory2d->CreateDxgiSurfaceRenderTarget(
m_dxgiBackbuffer,
props,
&m_d2dRenderTarget);

DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(m_writeFactory), 
(IUnknown**)(&m_writeFactory));

在渲染循环中,首先渲染3D事物,然后是2D事物。您都可以在3D上渲染2D,反之亦然。只需通过3D即可。我在DX11.0和win10上都进行了测试。我强烈建议您将3D通话和2D通话分为不同的类别,以提供更好的管理。