我目前有一个 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。
- 我已经尝试使用 D3DRS_ALPHABLENDENABLE true 配置混合但无济于事。
- 我也尝试过使用 D3DRS_ALPHATESTENABLE、D3DRS_ALPHAREF 和 D3DRS_ALPHAFUNC 设置不渲染具有完整 alpha 值的像素,但这也不起作用。
- 在使用 GetBackBuffer 检索后备缓冲区后,我尝试将 ColorFill 与 alpha 一起使用,但这也不起作用。(再次只使用 RGB)
- 最后我尝试创建一个纹理,选择一个表面,用一个完全透明的 alpha 值对该表面进行颜色填充,然后将该表面加载到后台缓冲区,但似乎只使用了 RGB 值。
我已经使用 DXCapsViewer.exe 检查了功能,并且我用于后备缓冲区的 D3DFMT_A8R8G8B8 后备缓冲区格式是有效的,所以不能这样。
有没有人在 Directx 中获得了一个透明的后缓冲区来在 XP 中工作?