DirectShow IVideoWindow和Fullscreen - 我可以写入我的D3D主曲面吗?

时间:2009-12-06 20:27:21

标签: delphi directx directshow

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

您想为视频混合渲染器9创建一个自定义分配器。它比制作您自己的渲染器过滤器容易得多,而且它专门用于D3D互操作。

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

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