Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Direct2d上渲染Directx 11后台缓冲区_C++_Winapi_Direct3d_Direct2d - Fatal编程技术网

C++ 在Direct2d上渲染Directx 11后台缓冲区

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纹理,从中获取曲面,然后在此曲面上

我想制作一个简单的级别编辑器,其中编辑器的gui将由Direct2d呈现,所有其他3D图形将由Directx 11处理。。就像Unity3D一样。。如图所示


如您所见,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。渲染它们以获得最终渲染的顺序取决于您。