【发布时间】: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
标签: c++ direct3d direct2d dxgi