0

我目前有一个 activex 控件,它启动了我公司的另一个开发组开发的媒体(视频/音频)框架,我正在为该代码提供一个窗口句柄。他们的渲染插件在使用 Direct3d 的管道中使用该句柄来使用该句柄渲染视频。

我在我的 activex 控件中初始化了单独的 LPDIRECT3D9EX 和 LPDIRECT3DDEVICE9EX 指针。我正在尝试将后台缓冲区清除为透明,然后使用 directx 绘图基元在该后台缓冲区上绘制,生成一个透明窗口,其中我的绘图基元在下面的 directx 表面上的流视频上。

似乎 Directx 忽略了清除具有完全 Alpha 透明度的设备后备缓冲区。

d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_RGBA(0, 0, 1, 0 /*full alpha*/), 1.0f, 0);

我可以看到我绘制的对象,但它们被绘制在具有指定 RGB 颜色但没有 alpha 值的后缓冲区之上。在下面的stackoverflow问题中链接到的项目(http://www.codeproject.com/KB/directx/umvistad3d.aspx)可以满足我的要求,但需要vista的桌面窗口管理器并且不适用于XP。

如何在透明窗口中绘制透明 DirectX 内容?

  • 我已经尝试使用 D3DRS_ALPHABLENDENABLE true 配置混合但无济于事。
  • 我也尝试过使用 D3DRS_ALPHATESTENABLE、D3DRS_ALPHAREF 和 D3DRS_ALPHAFUNC 设置不渲染具有完整 alpha 值的像素,但这也不起作用。
  • 在使用 GetBackBuffer 检索后备缓冲区后,我尝试将 ColorFill 与 alpha 一起使用,但这也不起作用。(再次只使用 RGB)
  • 最后我尝试创建一个纹理,选择一个表面,用一个完全透明的 alpha 值对该表面进行颜色填充,然后将该表面加载到后台缓冲区,但似乎只使用了 RGB 值。

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

有没有人在 Directx 中获得了一个透明的后缓冲区来在 XP 中工作?

4

1 回答 1

1

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

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

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

于 2010-05-08T13:43:36.730 回答