我想创建一个简单的关卡编辑器,其中编辑器的gui将由Direct2d呈现,而所有其他3D图形将由Directx 11处理。就像Unity3D一样。 >
https://i.stack.imgur.com/tf5G1.png
您可以看到3D图形正在GUI内渲染..我如何与Direct2d共享我的DirectX 11应用程序的后缓冲区(用于渲染GUI)...这样3D场景将在GUI内渲染..或请提出一些其他建议,然后再使用Direct2d ...还要考虑性能。.谢谢..
答案 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通话分为不同的类别,以提供更好的管理。