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

发布于 2024-08-31 22:10:34 字数 1341 浏览 7 评论 0原文

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

我有单独的 LPDIRECT3D9EX 和 LPDIRECT3DDEVICE9EX 指针,我在 Activex 控件中初始化它们。我试图将后缓冲区清除为透明,然后使用 directx 绘图基元在该后缓冲区上进行绘制,从而在下面的 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。

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

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

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

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

I currently have an activex control that initiates a media (video/audio) framework another development group in my company developed and I am providing a window handle to that code. That handle is being used by their rendering plugin in the pipeline that uses Direct3d for rendering the video using that handle.

I have seperate LPDIRECT3D9EX and LPDIRECT3DDEVICE9EX pointers that I initialize in my activex control. I am trying to clear a backbuffer to transparent and then use directx drawing primatives to draw on that backbuffer producing a transparent window with my drawing primatives over the streaming video on the directx surface below.

It appears that clearing a device backbuffer with full alpha transparency is ignored by directx.

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

I can see the object I draw but they are drawn on top of a backbuffer that has the RGB color specified without the alpha value. The project linked (http://www.codeproject.com/KB/directx/umvistad3d.aspx) to in the stackoverflow question below does what I want but requires vista's Desktop Window Manager and won't work for XP.

How do I draw transparent DirectX content in a transparent window?

  • I have tried with D3DRS_ALPHABLENDENABLE true with configured blend with no avail.
  • I have also tried to have pixels with full alpha values not rendered using D3DRS_ALPHATESTENABLE, D3DRS_ALPHAREF, and D3DRS_ALPHAFUNC setup but this doesn't work either.
  • I have tried using ColorFill with alpha after retrieving the backbuffer with GetBackBuffer but this doesn't work either. (again only RGB is used)
  • Finally I have tried creating a texture, selecting a surface, colorfilling that surface with a fully transparent alpha value, then loading that surface onto the backbuffer but only the RGB values appear to be used.

I have checked the capabilities using the DXCapsViewer.exe and the D3DFMT_A8R8G8B8 backbuffer format that I am using for the backbuffer is valid so it can't be that.

Has anyone gotten a transparent backbuffer in directx to work in XP?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独木成林 2024-09-07 22:10:34

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

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

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

The problem is that your back buffer contains alpha values your front buffer, however ... does not. You will need to lock your back buffer and copy the pixels to the layered window DC. Do be warned though ... this WILL be slow.

Edit: In answer to your questions in the comment.

1) The point of alpha values in the back buffer is for alpha testing and blending
2) (See answer 1)
3) No I'm saying ignore the front buffer and get the back buffer.
4) What direct x object in use by the media frame work? There is no such thing. DirectShow != Direct3D whatever 99% of people seem to think ...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文