D2D1Factory::CreateDxgiSurfaceRenderTarget() 的正确参数是啥

Posted

技术标签:

【中文标题】D2D1Factory::CreateDxgiSurfaceRenderTarget() 的正确参数是啥【英文标题】:what are the correct arguments for D2D1Factory::CreateDxgiSurfaceRenderTarget()D2D1Factory::CreateDxgiSurfaceRenderTarget() 的正确参数是什么 【发布时间】:2021-11-18 15:18:18 【问题描述】:

我想创建将使用 direct3D 在屏幕上渲染的 direct2D 渲染目标,所以我尝试调用 D2D1Factory::CreateDxgiSurfaceRenderTarget() 函数来创建一个 direct2D 渲染目标,但它一直失败。我从 HRESULT 得到的错误是无效的参数传递。我试过这3个代码

FLOAT dpiX;
FLOAT dpiY;
factory->GetDesktopDpi(&dpiX, &dpiY);

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

hr = factory->CreateDxgiSurfaceRenderTarget(dxgiBackbuffer, &props, &d2dRenderTarget);

if (FAILED(hr))  //i get the error here 
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
    D2D1_RENDER_TARGET_TYPE_DEFAULT,
    D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED)
);

hr = factory->CreateDxgiSurfaceRenderTarget(dxgiBackbuffer, &props, &d2dRenderTarget);

if (FAILED(hr))  //i get the error here 
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties();

hr = factory->CreateDxgiSurfaceRenderTarget(dxgiBackbuffer, &props, &d2dRenderTarget);

if (FAILED(hr))  //i get the error here 

我假设错误来自 D2D1_RENDER_TARGET_PROPERTIES,但是使它起作用的正确参数是什么?

这是我获得 dxgiBackbuffer 的方法

IDXGISurface* dxgiBackbuffer;
hr = swapchain->GetBuffer(0, IID_PPV_ARGS(&dxgiBackbuffer));

我从运行 direct3D 的主应用程序获取交换链,所以我将注入一个将运行 direct2D 的 DLL

总的来说,这段代码是正确的,我在我制作的一个 direct3D 项目上对其进行了测试,它运行良好,但是对于我尝试注入 DLL 的这个应用程序,它看起来有一些特殊的东西,比如一些自定义渲染特性?那么在这种情况下,我怎样才能获得正确的属性?

【问题讨论】:

如何创建 dxgiBackbuffer? @SimonMourier 我从 direct3D 交换链的交换链中得到它->GetBuffer(0, IID_PPV_ARGS(&dxgiBackbuffer)); 它应该可以工作。很难说没有复制样本。可以通过调试层检查docs.microsoft.com/en-us/windows/win32/direct3d11/…walbourn.github.io/direct3d-sdk-debug-layer-tricks 【参考方案1】:

经过一番研究,由于我无法访问主应用程序,也无法附加调试器,我终于找到了问题所在。 根据微软的说法,当您调用 D3D11CreateDeviceAndSwapChain 来创建 D3D 设备时,Direct2D 与 Direct3D 资源的互操作需要标志 D3D11_CREATE_DEVICE_BGRA_SUPPORT。

https://docs.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_create_device_flag

我尝试挂接的应用程序创建带有标志 0 的 D3D 设备。

【讨论】:

以上是关于D2D1Factory::CreateDxgiSurfaceRenderTarget() 的正确参数是啥的主要内容,如果未能解决你的问题,请参考以下文章