我想直接合成渲染一个纹理。这可能吗?这样做的原因是 * 我希望能够渲染一个gpu加速的无窗口透明flash播放器activex控件到一个纹理 *。这通常是不可能的,但我希望用DirectComposition实现。
enyaitl31#
引用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版本中将其开放供公众使用。
1条答案
按热度按时间enyaitl31#
引用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版本中将其开放供公众使用。