如何在没有vista桌面窗口管理器的directx 9中获得完全透明的后备缓冲区

时间:2010-05-07 21:04:19

标签: windows-xp directx buffer transparent

我目前有一个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?

  • 我已经尝试使用D3DRS_ALPHABLENDENABLE,配置的混合无效。
  • 我还尝试使用D3DRS_ALPHATESTENABLE,D3DRS_ALPHAREF和D3DRS_ALPHAFUNC设置来渲染没有呈现完整alpha值的像素,但这也不起作用。
  • 在使用GetBackBuffer检索后备缓冲区后,我尝试使用ColorFill和alpha,但这也不起作用。 (再次只使用RGB)
  • 最后,我尝试创建一个纹理,选择一个曲面,用完全透明的alpha值填充该曲面,然后将该曲面加载到后缓冲区,但只显示使用的RGB值。

我已经使用DXCapsViewer.exe和D3DFMT_A8R8G8B8后备缓冲区格式检查了这些功能,我使用的后备缓冲区格式是有效的,所以不能这样。

有没有人在directx中获得透明的后备缓冲区才能在XP中工作?

1 个答案:

答案 0 :(得分:1)

问题是你的后台缓冲区包含前置缓冲区的alpha值,但是......不会。您需要锁定后台缓冲区并将像素复制到分层窗口DC。请注意......这会很慢。

编辑:在评论中回答您的问题。

1)后台缓冲区中的alpha值点用于alpha测试和混合 2)(见答案1)
3)不,我说要忽略前缓冲区并获得后台缓冲区 4)媒体框架使用的直接x对象是什么工作?哪有这回事。 DirectShow!= Direct3D 99%的人似乎都认为......