帧缓冲区 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 时,应用程序将限制为哪些模式将产生有趣的结果。
相关主题