我目前有一个activex控件,它启动了我公司开发的另一个开发组的媒体(视频/音频)框架,我提供了该代码的窗口句柄。该句柄正在管道中的渲染插件中使用,该插件使用Direct3d使用该句柄渲染视频。
我已经分离了我在activex控件中初始化的LPDIRECT3D9EX和LPDIRECT3DDEVICE9EX指针。我试图将后备缓冲区清除为透明,然后使用directx绘图灵长来绘制后备缓冲区,在下面的directx表面上生成一个透明窗口,其中我的绘图灵长类似于流视频。
直接看来,清除具有完整Alpha透明度的设备后备缓冲区。
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_RGBA(0, 0, 1, 0 /*full alpha*/), 1.0f, 0);
我可以看到我绘制的对象,但它们是在后备缓冲区上绘制的,后备缓冲区指定的RGB颜色没有alpha值。链接(http://www.codeproject.com/KB/directx/umvistad3d.aspx)的项目在下面的stackoverflow问题中做了我想要的但需要vista的桌面窗口管理器而不适用于XP。
How do I draw transparent DirectX content in a transparent window?
我已经使用DXCapsViewer.exe和D3DFMT_A8R8G8B8后备缓冲区格式检查了这些功能,我使用的后备缓冲区格式是有效的,所以不能这样。
有没有人在directx中获得透明的后备缓冲区才能在XP中工作?
答案 0 :(得分:1)
问题是你的后台缓冲区包含前置缓冲区的alpha值,但是......不会。您需要锁定后台缓冲区并将像素复制到分层窗口DC。请注意......这会很慢。
编辑:在评论中回答您的问题。
1)后台缓冲区中的alpha值点用于alpha测试和混合
2)(见答案1)
3)不,我说要忽略前缓冲区并获得后台缓冲区
4)媒体框架使用的直接x对象是什么工作?哪有这回事。 DirectShow!= Direct3D 99%的人似乎都认为......