我目前正在编写一个 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);
最好的问候扎切尔