我想将directcomposition渲染到纹理。这可能吗?
原因是我希望能够将gpu加速无窗口透明flash播放器activex控件渲染到纹理。通常不可能的东西,但我希望用DirectComposition实现。
答案 0 :(得分:4)
引用MSDN(强调我的)
,这是不可能的DirectComposition不提供任何光栅化服务。应用程序必须使用其他一些基于软件或硬件加速的光栅化库(如Direct2D或Direct3D)来填充要组合的位图。 撰写后,DirectComposition将组合的位图内容传递给桌面窗口管理器(DWM)以呈现到屏幕。
据我所知,只有官方API可以与DWM共享您的屏幕外表面,但没有API允许您对DWM表面进行读取访问。
DWM 允许您重定向HWND曲面,因此可以显示窗口上其他HWND的曲面。这可以通过DirectComposition(通过CreateSurfaceFromHwnd)或DWM API(通过DwmRegisterThumbnail)完成。有关后者的示例look here。
如果你想按照评论中的说明进入“黑客路线”,那么undocumented APIs看起来可以让你访问DWM曲面,特别是 DwmpDxGetWindowSharedSurface 声音有希望。 Someone else已经进行了一些逆向工程并找出了签名,但无法使其工作(纹理有效,但呈现黑色)。 This guy似乎有更多运气,能够在3d中渲染窗口纹理。我不懂他的语言,但你似乎不得不使用 DwmpDxUpdateWindowSharedSurface (也没有记录)。
但是你应该知道,使用未记录的函数不是一个好主意,Microsoft可以随时更改它们(甚至在Service Pack版本中)或完全删除它们,因为它们仅由Microsoft自己使用,它们没有理由保持兼容性。此外,您很可能会错误地使用它们(例如,您可能缺少必要的同步并导致随机崩溃,或者更糟糕)。
然而,由于功能实际上是可用的,因此希望微软可能会在未来的Windows版本中实际打开它。