DirectComposition 渲染到纹理?

问题描述 投票:0回答:1

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

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

c++ directx direct-composition
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 (也未记录)。

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

但是,由于该功能实际上已经可用,因此微软可能会在未来的 Windows 版本中将其开放以供公众使用。

© www.soinside.com 2019 - 2024. All rights reserved.