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