混合,即像素的混合,将几种像素合成新的像素。
下面的公式是用来混合两个像素值的:
SourcePixel——通常被计算的像素,它是利用在后缓存中的像素来被混合的,把它看作当前要渲染的物体。
DestPixel——在后缓存中的像素,把它看作已经渲染的物体。
源像素乘以在混合中的百分比 + 目的像素以在混合中的百分比就得到了混合像素;
通过设置不同的源和目的要素(混合中的百分比),我们能够创造很多不同的混合效果:
Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
源和目的要素(混合中的百分比):
D3DBLEND_ZERO——blendFactor=(0, 0, 0, 0)
D3DBLEND_ONE——blendFactor=(1, 1, 1, 1)
D3DBLEND_SRCCOLOR——blendFactor=(rs, gs, bs, as)
D3DBLEND_INVSRCCOLOR——blendFactor=(1-rs, 1-gs, 1-bs, 1-as)
D3DBLEND_SRCALPHA——blendFactor=(as, as, as, as)
D3DBLEND_INVSRCALPHA——blendFactor=(1-as, 1-as, 1-as, 1-as)
D3DBLEND_DESTALPHA——blendFactor=(ad, ad, ad, ad)
D3DBLEND_INVDESTALPHA——blendFactor=(1-ad, 1-ad, 1-ad, 1-ad)
D3DBLEND_DESTCOLOR——blendFactor=(rd, gd, bd, ad)
D3DBLEND_INVDESTCOLOR——blendFactor=(1-rd, 1-gd, 1-bd, 1-ad)
D3DBLEND_SRCALPHASAT——blendFactor=(f, f, f, 1) , f=min(as, 1 – ad)
D3DBLEND_BOTHINVSRCALPHA——这种混合模式设置源混合要素为(1-as, 1-as, 1-as, 1-as,)以及目的混合要素为(as,as,as,as)。
这种混合模式仅对D3DRS_SRCBLEND有效
在D3D中,混合的渲染状态默认是关闭的,可以通过设置混合渲染状态为true开启混合:
Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
下面介绍一种混合使用的场景,物体透明。
如果我们想让一个物体透明,能看到后面的物体,那么就需要用到alpha部分。
在顶点的颜色、材质中都有alpha部分,它主要是用来指定像素的透明等级;
像素的alpha为0时,表示完全透明,像素的alpha为128时,表示50%透明,像素的alpha为255时,表示完全不透明。
为了让alpha部分描述像素的透明等级,我们必须设置源混合要素为D3DBLEND_SRCALPHA以及目的混合要素为D3DBLEND_INVSRCALPHA
Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
这里需要将一下纹理的Alpha通道,它代替使用Alpha部分(透明等级)来计算遮影,我们能够从纹理的alpha通道中得到alpha信息;
Alpha通道是额外的设置位,用它来保存每一个点的alpha值;
默认情况下,假如设置一个有alpha通道的纹理,alpha值从在alpha通道中获得。假如没有alpha通道,那么alpha值是通过顶点颜色获得。
// compute alpha from 顶点颜色 during shading
Device->SetTextureStageState(0,D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
Device->SetTextureStageState(0,D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
// take alpha from alpha 通道
Device->SetTextureStageState(0,D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
Device->SetTextureStageState(0,D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
通过设置不同的源和目的要素,以及获取像素的alpha,我们就能渲染一个透明物体(如果这个物体(SourcePixel)后表面已经有物体(DestPixel)的话,效果就会出来了)
总结:在我们渲染物体时,可能需要将两个物体的颜色(像素)融合融合,那么此时我们就开启混合,设置混合要素,接下来D3D就会将后缓存中的像素和现在要渲染的像素按照我们设置的比例进行混合了。
OK,混合的学习这个阶段的学习就先到这,以后要在实际的应用中多实验