7

我想让直接合成渲染到纹理。这可能吗?

这样做的原因是我希望能够将 gpu 加速的无窗口透明 Flash 播放器 activex 控件渲染到纹理。这通常是不可能的,但我希望通过 DirectComposition 实现。

4

1 回答 1

4

这不太可能,引用MSDN(强调我的)

DirectComposition 不提供任何光栅化服务。应用程序必须使用其他一些基于软件或硬件加速的光栅化库(例如 Direct2D 或 Direct3D)来填充要合成的位图。合成后,DirectComposition 将合成的位图内容传递给桌面窗口管理器 (DWM) 以呈现到屏幕上。

据我所知,只有官方 API 可以与 DWM 共享您的屏幕外表面,但没有 API 允许您对 DWM 表面进行读取访问。

DWM允许您重定向 HWND 表面,因此您可以在窗口显示其他 HWND 的表面。这可以通过 DirectComposition(通过CreateSurfaceFromHwnd)或DWM API(通过DwmRegisterThumbnail)来完成。有关后者的示例,请参见此处

如果您想走评论中指出的“黑客路线”,有一些未记录的 API看起来可以让您访问 DWM 表面,特别是DwmpDxGetWindowSharedSurface听起来很有希望。其他人已经做了一些逆向工程并找出了签名,但无法让它工作(纹理工作但呈现黑色)。这家伙似乎有更多的运气,并且能够在 3d 中渲染窗口纹理。我不懂他的语言,但您似乎必须使用DwmpDxUpdateWindowSharedSurface(也未记录)。

但是您应该知道,使用未记录的函数不是一个好主意,Microsoft 可以随时更改它们(即使在服务包版本中)或完全删除它们,因为它们仅由 Microsoft 自己使用,它们没有理由保持兼容性。此外,您很有可能会错误地使用它们(例如,您可能会丢失必要的同步并导致随机崩溃,或者更糟)。

但是,由于该功能实际上是可用的,因此希望 Microsoft 可以在未来的某些 Windows 版本中真正将其打开以供公众使用。

于 2014-01-11T21:22:11.167 回答