帧缓冲区 Alpha (Direct3D 9)

帧缓冲区 alpha 混合与顶点 alpha、材料 alpha 和纹理 alpha 有点不同。 顶点、材料和纹理 alpha 设置仅用于当前基元的透明度值,并且它们本身对其他基元没有影响。 帧缓冲区 alpha 混合控制如何将当前基元与帧缓冲区中的现有像素组合,以生成最终像素颜色。

执行 alpha 混合时,将组合两种颜色:源颜色和目标颜色。 源颜色来自透明对象,目标颜色是已位于像素位置的颜色。 目标颜色是呈现透明对象后面的某个其他对象的结果,即将通过透明对象可见的对象。 Alpha 混合使用公式来控制源对象和目标对象之间的比率。

Final Color = ObjectColor * SourceBlendFactor + PixelColor * DestinationBlendFactor 

ObjectColor 是在当前像素位置呈现的基元的贡献。 PixelColor 是当前像素位置的帧缓冲区的贡献。

下面列出了可以使用的一组 alpha 混合因子。

混合模式因子 说明
D3DBLEND_ZERO (0、0、0、0)
D3DBLEND_ONE (1、1、1、1)
D3DBLEND_SRCCOLOR (Rs、Gs、Bs、As)
D3DBLEND_INVSRCCOLOR (1-Rs、1-Gs、1-Bs、1-As)
D3DBLEND_SRCALPHA (As、As、As、As)
D3DBLEND_INVSRCALPHA (1-As、1-As、1-As、1-As)
D3DBLEND_DESTALPHA (广告、广告、广告、广告)
D3DBLEND_INVDESTALPHA (1-Ad、1-Ad、1-Ad、1-Ad)
D3DBLEND_DESTCOLOR (Rd、Gd、Bd、Ad)
D3DBLEND_INVDESTCOLOR (1-Rd、1-Gd、1-Bd、1-Ad)
D3DBLEND_SRCALPHASAT (f、f、f、1) ;f = min (As,1-Ad)
D3DBLEND_BOTHSRCALPHA 对于 DirectX 6 及更高版本已过时。 可以通过将源和目标混合因子设置为D3DBLEND_SRCALPHA并在单独的调用中D3DBLEND_INVSRCALPHA来实现相同的效果。
D3DBLEND_BOTHINVSRCALPHA 对于 DirectX 6 已过时。 可以通过将源和目标混合因子设置为D3DBLEND_INVSRCALPHA并在单独的调用中D3DBLEND_SRCALPHA来实现相同的效果。
D3DBLEND_BLENDFACTOR 使用从D3DRS_BLENDFACTOR设置中获取的 color.r、color.g、color.b 和 color.a。
D3DBLEND_INVBLENDFACTOR 使用从D3DRS_BLENDFACTOR设置中获取的 1-color.r、1-color.g、1-color.b 和 1-color.a。

 

Direct3D 使用D3DRS_ALPHABLENDENABLE呈现状态来启用 alpha 透明度混合。 完成的 alpha 混合的类型取决于D3DRS_SRCBLEND和呈现状态D3DRS_DESTBLEND。 源和目标混合状态成对使用。 以下代码片段将源混合状态设置为D3DBLEND_SRCCOLOR,将目标混合状态设置为D3DBLEND_INVSRCCOLOR。

// This code fragment assumes that lpD3DDevice is a 
//   valid pointer to a device.

// Enable alpha blending.
lpD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, 
                            TRUE);

// Set the source blend state.
lpD3DDevice->SetRenderState(D3DRS_SRCBLEND, 
                            D3DBLEND_SRCCOLOR);

// Set the destination blend state.
lpD3DDevice->SetRenderState(D3DRS_DESTBLEND, 
                            D3DBLEND_INVSRCCOLOR);

此代码在源颜色 (在当前位置) 呈现的基元颜色与目标颜色 (帧缓冲区) 当前位置的颜色之间执行线性混合。 由此产生的外观类似于有色玻璃,目标对象的一些颜色似乎通过源对象传输:其余部分似乎被吸收了。

其中许多混合因子要求纹理中的 alpha 值才能正常运行。 因此,使用顶点或材料 alpha 时,应用程序将限制为哪些模式将产生有趣的结果。

Alpha 混合