混合(blending)
1.混合:
用已经光栅化的像素光栅化同一位置的像素。就是我们在图元上混合图元。
使用混合时,下面的规则将被遵循:
规则:首先不使用混合绘制物体。然后根据物体离摄象机的距离使用混合对物体拣选。
下面的公式是用来混合两个像素值的:
上面的所有变量都是一个 4D颜色向量(r,g,b,a),并且x符号是表示分量相乘。
OutputPixel——混合后的像素结果。
SourcePixel——通常被计算的像素,它是利用在后缓冲区中的像素来被混合的。
SourceBlendFactor——在[0,1]范围内的一个值。它指定源像素在混合中的百分比。
DestPixel——在后缓冲区中的像素。
DestBlendFactor——在[0,1]范围内的一个值。它指定目的像素在混合中的百分比。
2.开启混合状态,混合默认是被关闭的
Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
3.设置混合要素:
分别设置源混合要素和目的混合要素。
Device->SetRenderState(D3DRS_SRCBLEND, Source);
Device->SetRenderState(D3DRS_DESTBLEND, Destination);
Source和Destination可以是以下类型:
l D3DBLEND_ZERO——blendFactor=(0, 0, 0, 0)
l D3DBLEND_ONE——blendFactor=(1, 1, 1, 1)
l D3DBLEND_SRCCOLOR——blendFactor=(rs, gs, bs, as)
l D3DBLEND_INVSRCCOLOR——blendFactor=(1-rs, 1-gs, 1-bs, 1-as)
l D3DBLEND_SRCALPHA——blendFactor=(as, as, as, as)
l D3DBLEND_INVSRCALPHA——blendFactor=(1-as, 1-as, 1-as, 1-as)
l D3DBLEND_DESTALPHA——blendFactor=(ad, ad, ad, ad)
l D3DBLEND_INVDESTALPHA——blendFactor=(1-ad, 1-ad, 1-ad, 1-ad)
l D3DBLEND_DESTCOLOR——blendFactor=(rd, gd, bd, ad)
l D3DBLEND_INVDESTCOLOR——blendFactor=(1-rd, 1-gd, 1-bd, 1-ad)
l D3DBLEND_SRCALPHASAT——blendFactor=(f, f, f, 1) , f=min(as, 1 – ad)
l D3DBLEND_BOTHINVSRCALPHA——这种混合模式设置源混合要素为(1-as, 1-as, 1-as,
l as,)以及目的混合要素为(as,as,as,as)。这种混合模式仅对D3DRS_SRCBLEND有效。
源和目的混合要素的默认值分别是D3DBLEND_SRCALPHA和D3DBLEND_INVSRCALPHA。
4.透明度(Alpha)
alpha 的有效值在[0,255]范围内,[0,255]代表不透明度[0%,100%]。让alpha部分描述像素的透明等级,我们必须设置(也是默认的)源混合要素为D3DBLEND_SRCALPHA以及目的混合要素为D3DBLEND_INVSRCALPHA。
5.Alpha 通道(Alpha Channel)
代替使用 Alpha 部分来计算遮影,能够从纹理的 alpha 通道中得到 alpha 信息。Alpha 通道是额外的设置位,用它来保存每一个点的alpha值。当一个纹理被映射到一个图元上时,在 alpha 通道中的 alpha 信息也被映射,并且它们利用 alpha 信息为每个像素赋予纹理。
6.指定 Alpha 资源
默认情况下假如设置一个有alpha通道的纹理,alpha值从在alpha通道中获得。假如没有 alpha通道,那么 alpha 值是通过顶点颜色获得。也可以手动指定Alpha资源。
// compute alpha from diffuse colors during shading
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
// take alpha from alpha channel
Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
D3DTSS_ALPHAOP
Texture-stage state is a texture alpha blending operation identified by one member of the D3DTEXTUREOP enumerated type. The default value for the first texture stage (stage 0) is D3DTOP_SELECTARG1, and for all other stages the default is D3DTOP_DISABLE.
D3DTSS_ALPHAARG1
Texture-stage state is the first alpha argument for the stage, identified by by D3DTA. The default argument is D3DTA_TEXTURE. If no texture is set for this stage, the default argument is D3DTA_DIFFUSE. [默认参数值是D3DTA_TEXTURE,没有纹理设置情况下,默认是D3DTA_DIFFUSE.]
7.使用混合的必要步骤是:
1. 设置混合要素D3DRS_SRCBLEND 和 D3DRS_DESTBLEND。
2. 假如你使用alpha部分,指定资源(材质或alpha通道) 。
3. 允许alpha混合渲染状态。
例子: