C++ 在Direct2d上渲染Directx 11后台缓冲区
我想制作一个简单的级别编辑器,其中编辑器的gui将由Direct2d呈现,所有其他3D图形将由Directx 11处理。。就像Unity3D一样。。如图所示C++ 在Direct2d上渲染Directx 11后台缓冲区,c++,winapi,direct3d,direct2d,C++,Winapi,Direct3d,Direct2d,我想制作一个简单的级别编辑器,其中编辑器的gui将由Direct2d呈现,所有其他3D图形将由Directx 11处理。。就像Unity3D一样。。如图所示 如您所见,3D图形正在GUI中呈现。。如何与direct2d(用于呈现gui)共享directx 11应用程序的backbuffer。。。这样,3D场景将在GUI内渲染。。或者请建议一些其他的建议,然后使用direct2d。。。同时考虑到性能。。谢谢..我不知道是否可以分享。可能更容易创建另一个d3d11纹理,从中获取曲面,然后在此曲面上
如您所见,3D图形正在GUI中呈现。。如何与direct2d(用于呈现gui)共享directx 11应用程序的backbuffer。。。这样,3D场景将在GUI内渲染。。或者请建议一些其他的建议,然后使用direct2d。。。同时考虑到性能。。谢谢..我不知道是否可以分享。可能更容易创建另一个d3d11纹理,从中获取曲面,然后在此曲面上创建Direct2D目标/上下文。稍后,您可以将此UI纹理与3D内容一起渲染,就像对任何其他纹理一样。我不知道是否可以共享。可能更容易创建另一个d3d11纹理,从中获取曲面,然后在此曲面上创建Direct2D目标/上下文。稍后,您可以将此UI纹理与3D内容一起渲染,就像对任何其他纹理一样。是的,您可以这样做 在标题中保留:
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就可以了。我在DX11.0和win10上进行了测试。我强烈建议您将3D通话和2D通话分为不同的类别,以提供更好的管理。是的,您可以这样做
在标题中保留:
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就可以了。我在DX11.0和win10上进行了测试。我强烈建议您将3D调用和2D调用分为不同的类,以提供更好的管理。您是否尝试使用
IDirect3DSurface
进行IDXGISurface
不。。你是怎么做到的?。。。抱歉,我是初学者。您是否尝试使用IDirect3DSurface
使用IDXGISurface
不。。你是怎么做到的?。。。抱歉,我是初学者。我知道如何使用direct2d和directx 11在directx 11共享纹理上创建gui,并使用directx 11设备上下文渲染它。。但我想要的是相反的。。我希望在direct2d gui上渲染d3d11纹理(场景)。。这可能吗???。我不明白这有什么不同。您只需在末尾有两个纹理,一个用于3D内容,一个用于UI。渲染它们以获得最终渲染的顺序取决于您。我知道如何使用direct2d和directx 11在directx 11共享纹理上创建gui,并使用directx 11设备上下文进行渲染。。但我想要的是相反的。。我希望在direct2d gui上渲染d3d11纹理(场景)。。这可能吗???。我不明白这有什么不同。您只需在末尾有两个纹理,一个用于3D内容,一个用于UI。渲染它们以获得最终渲染的顺序取决于您。