如何在directshow中叠加direct3d

时间:2010-05-09 16:29:30

标签: c++ directx directshow

我正在寻找有关如何在directshow中将direct3d叠加到视频(网络摄像头)源上的教程或文档。

我想提供一个虚拟网络摄像头(一个看起来像系统的网络摄像头的虚拟设备(即,以便在可以使用普通网络摄像头的情况下使用它,如IM视频聊天)

我想从连接到计算机的网络摄像头捕获视频。 我想在视频源上叠加一个3d模型,并将其作为输出。

我曾计划在directshow中这样做,因为它看起来可能会在其中执行此操作。如果您对可能的替代方案有任何想法,我很满意。

我正在使用visual studio 2008编写c ++。

2 个答案:

答案 0 :(得分:3)

使用Video Mixing Renderer Filter将视频渲染为纹理,然后将其作为全屏四边形渲染到场景中。之后,您可以将其余的3D内容渲染到顶部,然后呈现场景。

答案 1 :(得分:1)

您是否正在使用位于图表中某处的过滤器,该过滤器会在视频上显示D3D内容?

如果是这样,那么您需要查看从CTransformFilter派生过滤器。像EZRGB这样的例子会给你一些工作。基本上,一旦您对此进行了排序,您的过滤器需要执行Direct 3D渲染,并且实际上将生成的图像插入到直接显示流中。唉,你不能直接将Direct3D渲染到直接显示视频帧,因此你必须进行渲染,然后锁定前/后缓冲区并将3D数据复制到直接显示流中。这并不理想,因为它会很慢(与标准的D3D渲染相比),但据我所知,它是你能做的最好的。

编辑:根据您的更新,您想要的是非常复杂的。您需要创建一个源过滤器(您应该查看CPushSource示例)。完成后,您需要将其注册为视频捕获源。基本上,您需要通过在DLLRegisterServer函数中使用IFilterMapper2::RegisterFilter调用并传入类ID“CLSID_VideoInputDeviceCategory”来执行此操作。添加Direct3D将如上所述。

您希望花费尽可能多的时间来阅读Windows SDK中的DirectShow示例并开始修改它们以执行您希望它们执行的操作。