融合技术能使我们将当前要进行光栅化的像素的颜色与先前已光栅化并处于同一位置的像素的颜色进行合成。
1.融合方程
对两个像素颜色进行融合处理的公式如下:
OutputPixel=SourcePixel*SourceBlender+DestPixel*DestBlendFactor
公式中的每一个变量都是一个4D颜色向量(r,g,b,a)。
在进行融合运算时,必须遵循以下原则:首先绘制不需要进行融合的物体,然后再绘制将要进行融合的物体。融合运算的开销并不低,应仅在必需的场合使用。Direct3D中,默认是关闭混合的,可以通过下面的代码启用:
Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
2.融合因子
通过设定原融合因子和目标融合因子,我们可以创建一系列不同的融合效果。设定代码如下:
Device->SetRenderState(D3DRS_SRCBLEND,SourceBlendFactor);
Device->SetRenderState(D3DRS_DESTBLEND, DestBlendFactor);
默认值是:SourceBlendFactor=D3DBLEND_SRCALPHA;DestBlendFactor=D3DBLEND_INVSRCALPHA。
3.透明度
Alpha分量主要用于指定像素的透明度。一般情况下会从纹理图片中的alpha通道获取Alpha信息。默认状态下,如果当前设置的纹理拥有一个Alpha通道,Alpha值就取自该Alpha通道;如果没有Alpha通道,Alpha值就取自顶点的颜色。但也可以通过设置绘制状态来来指定Alpha值的来源(漫反射颜色或Alpha通道):
// use alpha in material's diffuse component for alpha
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
或者
// use alpha channel in texture for alphaDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
4.纹理图片Alpha通道的制作
可以使用Utilities\bin\x86目录下的DxTex.exe来指定图片的Alpha通道及其值。步骤如下:
a.更改图片格式:菜单Format->Change Surface Format...,选择格式A8R8G8B8。
b.添加Alpha通道:菜单File->Open Onto Alpha Channel Of This Texture,选择Alpha通道图片即可。纯黑到纯白对应全透明到不透明。