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

具有多个曲面/纹理的DirectX9 AlphaBlend,directx,alpha,d3dx,alphablending,Directx,Alpha,D3dx,Alphablending,我正在写一个2D窗口框架(gui引擎)。每个控件(窗口、按钮、面板等)都涂在单独的表面上。绘制树中的所有控件后,这些曲面将合并在一起 例如(窗口包含面板和按钮3,面板包含按钮1和按钮2): 油漆窗 油漆板 油漆按钮1 将按钮1表面与面板表面合并 油漆按钮2 将按钮2表面与面板表面合并 油漆按钮3 将按钮3表面与面板表面合并 将面板曲面与窗曲面合并 我们的问题是合并曲面时正确的alpha混合计算。我们尝试了不同的配置,但alpha值对所有配置都表现得“奇怪”。最大的问题是alpha孔(

我正在写一个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_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);
致意 扎切尔

A = AlphaValue * (ParentAlphaBlend / 255);