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() 的正确参数是啥的主要内容,如果未能解决你的问题,请参考以下文章