引言
在前面几篇博文中,已经陆续讲解了光照处理,和纹理映射的内容。现在来讲解一些更有趣的东西。Alpha混合,总是出现在各种各样的游戏中。我们无时无刻都在和它进行打交道,所以很有必要掌握如何进行Alpha混合,以及如何通过Alpha混合来做到透明效果。
混合方程
进行Alpha混合时,我们总是会利用混合方程来进行混合。一般来说,混合方程总是如下所示:
OutputPixel = SourcePixel * SourceBlendFactor + DestPixel * DestBlendFactor
这个方程很简单,而且其中的"+"操作符,也能够在DirectX中,通过设置渲染状态来改变这个值。我们进行Alpha混合的时候,就是设置这些值来对Alpha混合进行控制。
在默认情况下,Alpha混合方程中的操作符总是“+”,它在DirectX中使用如下的常量来定义:
D3DBLENDOP_ADD
除了这个操作符之外,还有下面的一些操作符:
D3DBLENDOP_SUBTRACT 表示操作符是“-”, 即混合方程为 OutputPixel = SourcePixel * SourceBlendFactor - DestPixel * DestBlendFactor ;
D3DBLENDOP_REVSUBTRACT, 混合方程为 : OutputPixel = DestPixel * DestBlendFactor - SourcePixel * SourceBlendFactor ;
D3DBLENDOP_MIN , 混合方程为 : OutputPiexl = min(SourcePixel * SourceBlendFactor, DestPixel * DestBlendFactor) ;
D3DBLENDOP_MAX, 混合方程为: OutputPiexl = max(SourcePixel * SourceBlendFactor, DestPixel * DestBlendFactor) ;
我们可以通过调用下面的函数来设置这些混合操作符:
m_pDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_SUBTRACT) ;
这些操作符的具体含义很难察觉,它们只是定义了进行混合计算时的不同操作,使用不同的操作符可以达到不同的效果,需要读者自己积累经验来使用。
在默认情况下,DirectX 9.0是不进行Alpha混合操作的,所以我们可以通过如下的代码来开启Alhpa混合:
m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true) ;
混合因子
在上面的混合公式中,SourceBlendFactor和DestBlendFactor称为混合因子。我们可以通过调用下面的两个函数来设置这两个不同的因子:
m_pDevice->SetRenderState(D3DRS_SRCBLEND, source) ;
m_pDevice->SetRenderState(D3DRS_DESTBLEND, dest) ;
上面的source和dest可以是下面的任何值:
- D3DBLEND_ZERO : 表示混合因子为(0,0,0,0)
- D3DBLEND_ONE : 表示混合因子为(1,1,1,1)