1

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

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

  • 油漆窗口
    • 油漆面板
      • 油漆按钮 1
      • 将按钮 1 表面与面板表面合并
      • 油漆按钮 2
      • 将按钮 2 表面与面板表面合并
    • 油漆按钮 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);

最好的问候扎切尔

4

0 回答 0