具有多个表面/纹理的DirectX9 AlphaBlend

时间:2013-12-27 19:13:51

标签: directx alpha d3dx alphablending

目前正在编写一个2D窗口框架(gui引擎)。每个控件(窗口,按钮,面板,......)都绘制在单独的表面上。在绘制树中的所有控件之后,这些表面将合并在一起。

例如(窗口包含面板和按钮3,面板包含按钮1和按钮2):

  • 绘画窗口
    • 油漆面板
      • Paint Button 1
      • 将按钮1表面与面板表面合并
      • Paint Button 2
      • 将按钮2表面与面板表面合并
    • Paint Button 3
    • 将按钮3表面与面板表面合并
  • 将面板表面与窗口表面合并

我们的问题是在合并曲面时进行正确的Alpha混合计算。我们尝试了不同的配置,但alpha值对所有这些都表现得“奇怪”。最大的问题是alpha孔(完全透明的像素,即使顶层表面(窗口)几乎不透明)。

Device->SetRenderState (D3DRS_ALPHABLENDENABLE,          1                   );
Device->SetRenderState (D3DRS_BLENDOP,                   D3DBLENDOP_ADD      );
Device->SetRenderState (D3DRS_SRCBLEND,                  D3DBLEND_SRCALPHA   );
Device->SetRenderState (D3DRS_DESTBLEND,                 D3DBLEND_INVSRCALPHA);

作为快速修复,我们目前正在使用以下渲染状态:

Device->SetRenderState (D3DRS_ALPHABLENDENABLE,          1                   );
Device->SetRenderState (D3DRS_BLENDOP,                   D3DBLENDOP_ADD      );
Device->SetRenderState (D3DRS_SEPARATEALPHABLENDENABLE,  1                   );
Device->SetRenderState (D3DRS_SRCBLEND,                  D3DBLEND_SRCALPHA   );
Device->SetRenderState (D3DRS_DESTBLEND,                 D3DBLEND_INVSRCALPHA);
Device->SetRenderState (D3DRS_SRCBLENDALPHA,             D3DBLEND_ONE        );
Device->SetRenderState (D3DRS_DESTBLENDALPHA,            D3DBLEND_ONE        );

但这些显然是不正确的,因为添加了两个重叠控件的alpha值(使两个127 alpha控件完全不透明)。

是否可以像这样混合曲面:

A = AlphaValue * (ParentAlphaBlend / 255);

祝你好运 Zacherl

0 个答案:

没有答案