问题5-Blending
下面的问题是混合(Blending),就像图中看到的一样,三个物体都是半透明状态,要实现这种效果,就要用到Blending技术。

使用的混合的时候,要注意顺序,首先要绘制不使用混合的物体,在这个例子中就是背景墙和地板了,然后再绘制需要混合的物体。绘制要混合的物体的时候也要注意按照Z
轴的方向从远到近来绘制。
混合后的颜色是通过下面的公式来计算的:
OutputPixel = SourcePixel * SourceBlendFactor + DestPexel * DestBlendFactor
这里乘法颜色向量的分量相乘。在公式中:
OutputPixel:混合后的像素。
SourcePixel:源像素。
SourceBlendFactor:源像素在混合中的比例,在[0,1]之间取值。
DestPexel:目的像素。
DestBlendFactor:目的像素在混合中的比例,在[0,1]之间取值。
在混合之前,要使用 SetRenderState(D3DRS_ALPHABLENDENABLE, true) 来激活混合选项。然后设置混合如下:
Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
这里第一个参数分别设置了源混合像素和目的混合像素。第二个参数是混合的方式,可选值很多,具体的混合方式可以参看SDK。一般都使用D3DBLEND_SRCALPHA和D3DBLEND_INVSRCALPHA。它们分别表示:
D3DBLEND_SRCALPHA
Blend factor is (As, As, As, As).
D3DBLEND_INVSRCALPHA
Blend factor is ( 1 - As, 1 - As, 1 - As, 1 - As).
图中显示了两种Blengding形式,一种是基于D3DMATERIAL9对象的Diffuse属性的Alpha值,一种是使用带有Alpha通道的纹理贴图。所以在混合的时候还要指定使用哪一种混合。如下:
//使用Diffuse的Alpha值
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
//使用带有Alpha通道的贴图
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
该函数的原型是:
HRESULT SetTextureStageState(
DWORD Stage,
D3DTEXTURESTAGESTATETYPE Type,
DWORD Value
);
第一个参数是指定的纹理层,第二个参数指定纹理层表现类型,第三个参数可以在D3DTEXTUREOP中指定,也可以在D3DTA中指定。更多的信息也可以在SDK中查看。
最后,使用了混合后,在不用的时候要立即关闭。
SetRenderState(D3DRS_ALPHABLENDENABLE, false)

使用的混合的时候,要注意顺序,首先要绘制不使用混合的物体,在这个例子中就是背景墙和地板了,然后再绘制需要混合的物体。绘制要混合的物体的时候也要注意按照Z
轴的方向从远到近来绘制。
混合后的颜色是通过下面的公式来计算的:
OutputPixel = SourcePixel * SourceBlendFactor + DestPexel * DestBlendFactor
这里乘法颜色向量的分量相乘。在公式中:
OutputPixel:混合后的像素。
SourcePixel:源像素。
SourceBlendFactor:源像素在混合中的比例,在[0,1]之间取值。
DestPexel:目的像素。
DestBlendFactor:目的像素在混合中的比例,在[0,1]之间取值。
在混合之前,要使用 SetRenderState(D3DRS_ALPHABLENDENABLE, true) 来激活混合选项。然后设置混合如下:
Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
这里第一个参数分别设置了源混合像素和目的混合像素。第二个参数是混合的方式,可选值很多,具体的混合方式可以参看SDK。一般都使用D3DBLEND_SRCALPHA和D3DBLEND_INVSRCALPHA。它们分别表示:
D3DBLEND_SRCALPHA
Blend factor is (As, As, As, As).
D3DBLEND_INVSRCALPHA
Blend factor is ( 1 - As, 1 - As, 1 - As, 1 - As).
图中显示了两种Blengding形式,一种是基于D3DMATERIAL9对象的Diffuse属性的Alpha值,一种是使用带有Alpha通道的纹理贴图。所以在混合的时候还要指定使用哪一种混合。如下:
//使用Diffuse的Alpha值
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
//使用带有Alpha通道的贴图
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
该函数的原型是:
HRESULT SetTextureStageState(
DWORD Stage,
D3DTEXTURESTAGESTATETYPE Type,
DWORD Value
);
第一个参数是指定的纹理层,第二个参数指定纹理层表现类型,第三个参数可以在D3DTEXTUREOP中指定,也可以在D3DTA中指定。更多的信息也可以在SDK中查看。
最后,使用了混合后,在不用的时候要立即关闭。
SetRenderState(D3DRS_ALPHABLENDENABLE, false)


