DXUTGUI控件的定制(二)

    <!--版权所有foruok,转载请注明出处!!-->    

    DXUTGUI提供的默认控件已经实现了透明效果和类似色彩键的效果。在D3D中没有直接的色彩键(direct draw中有)功能,不过可以利用alpha通道实现类似的效果,只是需要图片具有alpha通道。    

    DXUTGUI的控件纹理正是这样实现的,用photoshop打开保存下来的纹理图片,可以看到其alpha通道的图片。    

    要在D3D9中实现透明和颜色过滤功能,需要两个步骤。

    (1)定义FVF结构体,包含顶点颜色域。定义FVF标记,使其包含D3DFVF_DIFFUSE。    

struct CustomVertext
{        
    float x,y,z,h;        
    DWORD color;    
};    
#define CUSTOMFVF   D3DFVF_XYZRHW | D3DFVF_DIFFUSE

    (2)设置渲染状态:    

pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );    
pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );    
pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );        
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );    
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );    
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );

    透明效果的实现是通过顶点颜色的alpha值(0完全透明,255不透明)实现的,而颜色过滤是通过纹理的alpha通道实现的,两者的乘积可以实现“透明+过滤”效果。这样就可以实现不规则且透明的控件。

    对应在DXUTGUI中,如果要设置某一个控件的透明度,可以调用该控件的GetElement函数,获取CDXUTElement类型的指针,调用其SetTexture函数实现。

    要统一设置某一类控件的透明度,可以调用CDXUTDialog::GetDefaultElement获取该类控件的分子对象的指针,修改其TextureColor成员的alpha通道(或者调用SetTexture函数)。

    知道了DXUTGUI如何实现上述效果,我们就有了定制UI的基础。通过提供具有alpha通道的图片给DXUTGUI使用,就可以随心所欲的实现各种效果的控件了。但如何让DXUTGUI为某一个控件(如一个按钮)使用我们自己的图片,还需要做进一步的挖掘和实现。

     <!--版权所有foruok,转载请注明出处!!-->

你可能感兴趣的:(GUI,DirectX,CEGUI,DXUT)