一般情况下alpha混合计算公式:
Final(rgba) = Src(rgba) * Src(blend) ⊕ Dest(rgba) * Dest(blend)
Src(rgba): 即要绘制的颜色
Src(blend): Src的系数,由D3DRS_SRCBLEND指定其值(D3DBLEND枚举值),如:D3DBLEND_SRCALPHA(即指定为Src的alpha值)
⊕:表示Alpha混合方法,由D3DRS_BLENDOP指定其值(D3DBLENDOP枚举值),最常见的是加法:D3DBLENDOP_ADD
Dest(rgba): 目标颜色值,通常是缓冲区颜色或者RenderTarget颜色
Dest(blend): Dest的系数,由D3DRS_DESTBLEND指定其值(D3DBLEND枚举值),如:D3DBLEND_INVSRCALPHA(即指定为 1-SrcAlpha)
通常情况下的alpha混合,Src(blend)和Dest(blend)分别指定为SrcAlpha和(1-SrcAlpha),并没有考虑DestAlpha,这是因为通常的绘制目标都是BackBuffer(后备缓冲区),而BackBuffer的颜色是没有Alpha值的。
上述通常情况下的Alpha混合中的alpha通道的混合与rgb颜色通道的混合计算方式是一样的,但是D3D还允许开启D3DRS_SEPARATEALPHABLENDENABLE 标记来单独指定Alpha通道的混合方式。开启了这个标记后,alpha通道的混合公式还是一样:
Final(alpha) = Src(alpha) * SrcAlpha(blend) ⊕ Dest(alpha) * DestAlpha(blend)
其中,
SrcAlpha(blend):SrcAlpha的系数,由D3DRS_SRCBLENDALPHA指定其值(也是D3DBLEND枚举值),如:D3DBLEND_ONE;
⊕:表示Alpha混合的混合方法,由D3DRS_BLENDOPALPHA指定其值(也是D3DBLENDOP枚举值),如:D3DBLENDOP_MODULATE;
DestAlpha(blend):DestAlpha的系数,由D3DRS_DESTBLENDALPHA指定其值(也是D3DBLEND枚举值),如:D3DBLEND_ZERO;
----------------------------------
除了上述的alpha混合之外,d3d另外一个发生混合的地方是“多重纹理混合”(multiple-texture blending),先来看看管线图:
按d3d文档(Direct3d Architecture Direct3d 9)的描述多重纹理混合应该是发生在pixel-processing的,而上面说的alpha混合是发生在Pixel-rendering的。恩,这张大图印证了我的猜测:http://www.xmission.com/~legalize/book/preview/poster/pipeline-9.0.png