【发布时间】:2021-12-03 22:35:04
【问题描述】:
我想制作一个 Direct2D GUI,它将在 DLL 上运行,并使用我注入其中的应用程序的 Direct3D 进行渲染。
我知道我可以简单地使用 ID2D1Factory::CreateDxgiSurfaceRenderTarget 来制作 DXGI 表面并将其用作 d2d 渲染目标,但这需要在 Direct3D 的设备上启用标志 D3D11_CREATE_DEVICE_BGRA_SUPPORT。
问题是应用程序在未启用此标志的情况下创建其设备,因此ID2D1Factory::CreateDxgiSurfaceRenderTarget 失败。
我正在尝试找到另一种在应用程序窗口(外部或窗口的渲染目标内部)上绘制的方法,如果该窗口处于全屏状态,该方法也可以使用。
到目前为止,我尝试了这些替代方法:
-
使用
ID2D1Factory::CreateDCRenderTarget创建一个 d2d 渲染目标。这行得通,但我渲染的部分是闪烁/闪烁(在循环中非常快速地显示和隐藏)。我在ID2D1RenderTarget::BeginDraw之前也调用了ID2D1DCRenderTarget::BindDC,但它只是闪烁但有点少,所以我仍然遇到同样的问题。 -
创建一个新窗口,该窗口将始终位于所有其他窗口的顶部并使用 d2d 进行渲染,但如果应用程序进入全屏状态,则此窗口不会显示在屏幕上。
-
创建第二个启用
D3D11_CREATE_DEVICE_BGRA_SUPPORT标志的D3D 设备,并在窗口设备和我自己的设备之间共享ID3D11Texture2D资源,但我无法让它工作......没有很多关于如何做到这一点的例子。想法是创建第二个设备,在该设备上使用 d2d 绘图,然后同步两个 D3D 设备——我关注了this example(使用 direct11)。 -
创建一个D2D设备,并与d3d设备共享d2d设备的数据;但是,当我调用
ID2D1Factory1::CreateDevice创建设备时,它会失败,因为创建 D3D 设备时没有启用D3D11_CREATE_DEVICE_BGRA_SUPPORT标志。我从this example开始。
我听说过硬件覆盖,但它只适用于某些显卡,我想我会遇到这个https://docs.microsoft.com/el-gr/windows/win32/medfound/hardware-overlay-support 的问题。
我目前处于死胡同;我不知道该怎么办。有没有人有任何想法可以帮助我?
即使窗口处于全屏状态,是否有任何方法可以在屏幕上绘图和工作?
【问题讨论】:
标签: c++ overlay direct3d direct2d dxgi