如何使用IDXGISwapChain和ID3D11Device / ID3D11DeviceContext呈现到不同的窗口?

时间:2011-08-25 06:28:00

标签: graphics windows-7 direct3d direct3d11 dxgi

以前,当我构建工具时,我使用了D3D版本9,其中对Present()的调用可以采用目标窗口和矩形,因此您可以从单个设备绘制到许多不同的窗口。当使用D3D加速桌面应用程序和/或构建工具而不是游戏时,这非常棒!

我之前也用D3D11构建了一个游戏渲染器,这也很棒,因为状态管理和线程接口设计得很好,你甚至可以定位D3D 9级硬件,这在野外仍然很常见(相反)到D3D 10,只能达到10和更好的目标。

但是,现在我想用D3D11构建一个工具。不幸的是,从D3D11CreateDeviceAndSwapChain()返回的IDXGISwapChain似乎“记住”了它的HWND,并且只想呈现给那个窗口。这非常不方便,因为我可能有大量的窗口,每个窗口都需要绘制相当简单的图形,并且只响应WM_PAINT(同样,这是一个工具,而不是游戏)。

我想要做的是保存缓冲RAM。具体来说,我曾经能够创建一个单一的后台缓冲区,我知道可以覆盖所有渲染需求的桌面大小,然后就是分配的单个副本。即使有10个重叠的窗口,它们都通过相同的后台缓冲区渲染,因此除了初始分配之外不会浪费内存。我可以创建不是交换链的纹理,并将它们用作“渲染目标”,但我无法找到一种向任意客户端窗口的任意矩形呈现的好方法,而无需读回位图并将其复制到DIBSection,这将是非常低效的。此外,没有办法创建许多交换链,并让它们共享相同的后台缓冲区。

我能做的最好的事情是每个窗口创建一个交换链,并将每个交换链的后台缓冲区调整为非常小,除非我渲染到交换链,此时我调整它以匹配窗口。然而,这似乎效率低下,因为调整目标的大小不是“自由”操作AFAICT。那么,有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我最终得到的答案是在每个单独的显示区域创建一个后缓冲区,而不是将其调整为后缓冲区。我想,在一个桌面组合和透明度可以让我背后的“任何东西”感到高兴的世界里,这可能对系统有所帮助。 我想学习爱VVM系统:-)(虚拟视频内存的VVM)