6

写一个游戏,我想在中间放一些过场动画。在窗口模式下,DirectShow 类可以完美运行并且易于使用。但是当游戏全屏时,我无法让 DirectShow 显示全屏过场动画。

基本上,当我初始化 D3D 设备时,我无法显示视频,即使使用 IVideoWindow.put_Fullscreen(true)。我猜 DirectShow 不能用 D3D 设备全屏显示。

所以,我尝试在过场动画播放时释放我的 D3D 设备,然后重新初始化它。这似乎工作得很好,但是当 DirectShow 播放全屏时,它似乎从我的应用程序的主窗口中窃取了焦点,并且在完成后没有将其返回。然后导致 DirectInput 之后无法再次获取设备(给我一个“拒绝访问”错误代码)。我在获取之前尝试了 SetForegroundWindow() ,但这并不能解决它,所以这可能不是问题所在。

无论如何,长话短说,我想要的只是在我的 D3D 应用程序中间的全屏过场动画。有没有首选的方法来实现这一点?我可以通过将 DirectShow 输出到我的 D3D 主表面来做到这一点吗?我认为这将解决我遇到的问题。

4

2 回答 2

2

查看“转储过滤器”。通过使用它,您可以轻松编写将直接写入 D3D 纹理的过滤器。另外,请记住,您不需要支持外部 com 实例化。您可以简单地实例化该类并使用它。它不需要暴露在您的应用程序之外......

编辑: DumpFilter 是 DirectShow API 示例之一。

于 2009-12-06T20:31:17.867 回答
2

您想为 Video Mixing Renderer 9 创建一个自定义分配器。它比制作您自己的渲染器过滤器要容易得多,而且它是专门为 D3D 互操作而设计的。

Windows SDK 中有一个示例。我的安装在这里:

C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\multimedia\directshow\vmr9\vmr9allocator

于 2009-12-07T06:14:11.393 回答