D2D1Factory::CreateDxgiSurfaceRenderTarget() 的正确参数是什么

what are the correct arguments for D2D1Factory::CreateDxgiSurfaceRenderTarget()

我想创建将使用 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 的主应用程序中获取交换链,因此我将注入一个 DLL,它将 运行 direct2D

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

经过一些研究,由于我无法访问主应用程序,也无法附加调试器,我终于找到了问题所在。 根据微软的说法,当您调用 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 设备。