alpha混合

来源:互联网 发布:平田真悲剧男 知乎 编辑:程序博客网 时间:2024/06/02 13:55
 

class CBlendingText
{
public:
 CBlendingText(void);
 virtual ~CBlendingText(void);
public:
 HRESULT D3DCreate( LPDIRECT3DDEVICE9 pd3dDevice );
 void Render( LPDIRECT3DDEVICE9 pd3dDevice );
private:
 void SetMaterial();
 void SetupMatrix( LPDIRECT3DDEVICE9 pd3dDevice );

 IDirect3DVertexBuffer9* m_pVB;
 IDirect3DTexture9*      m_pTexture;
 IDirect3DTexture9*      m_pTexture2;

 D3DMATERIAL9   m_Material; // background material
};

struct Vertex
{
 Vertex(){}
 Vertex(
  float x, float y, float z,
  float nx, float ny, float nz,
  float u, float v)
 {
  _x  = x;  _y  = y;  _z  = z;
  _nx = nx; _ny = ny; _nz = nz;
  _u  = u;  _v  = v;
 }
    float _x, _y, _z;
    float _nx, _ny, _nz;
    float _u, _v; // texture coordinates

 static const DWORD FVF;
};
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

CBlendingText::CBlendingText(void)
{
 m_pVB = NULL;
 m_pTexture = NULL;
 m_pTexture2 = NULL;
}

CBlendingText::~CBlendingText(void)
{
 SAFE_RELEASE( m_pVB );
 SAFE_RELEASE( m_pTexture );
 SAFE_RELEASE( m_pTexture2 );
}

HRESULT CBlendingText::D3DCreate( LPDIRECT3DDEVICE9 pd3dDevice )
{
 if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, "Dwarf\\BatEye.dds", &m_pTexture) ) )
  return E_FAIL;;

 if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, "Dwarf\\Armor.dds",  &m_pTexture2) ) )
  return E_FAIL;

 pd3dDevice->CreateVertexBuffer( 6 * sizeof(Vertex), D3DUSAGE_WRITEONLY, Vertex::FVF, D3DPOOL_MANAGED, &m_pVB, 0 );

 Vertex* v;
 m_pVB->Lock(0, 0, (void**)&v, 0);

 v[0] = Vertex(-10.0f, -10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
 v[1] = Vertex(-10.0f,  10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
 v[2] = Vertex( 10.0f,  10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);

 v[3] = Vertex(-10.0f, -10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
 v[4] = Vertex( 10.0f,  10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
 v[5] = Vertex( 10.0f, -10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);

 m_pVB->Unlock();

 m_Material.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
 m_Material.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
 m_Material.Specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
 m_Material.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); // no emission
 m_Material.Power = 2.0f;

 SetupMatrix( pd3dDevice );
 return S_OK;
}

void CBlendingText::SetMaterial()
{
 static bool bAdd = true;
 if( bAdd )
  m_Material.Diffuse.a += 0.01f;
 else
  m_Material.Diffuse.a -= 0.01f;

 if( m_Material.Diffuse.a >= 1.0f && bAdd == true )
 {
  bAdd = false;
 }
 else if( m_Material.Diffuse.a < 0.0f && bAdd == false )
 {
  bAdd = true;
 }
}

void CBlendingText::SetupMatrix( LPDIRECT3DDEVICE9 pd3dDevice )
{
    D3DXVECTOR3 vEyePt( 0.0f, 0.0f,-20.0f );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    D3DXMATRIXA16 matView;
    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );

    pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 1000.0f );
    pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}

void CBlendingText::Render( LPDIRECT3DDEVICE9 pd3dDevice )
{
 SetMaterial();

 pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );//则正反面都绘制。
 pd3dDevice->SetRenderState( D3DRS_LIGHTING, true );//开启光照
 pd3dDevice->SetRenderState( D3DRS_AMBIENT, D3DCOLOR_XRGB( 255,255,255 ) );//设置环境光颜色值

// pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true);//顶点法线总是单位矢量
// pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true);//开启镜面反射光照计算

 pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);//设置线性纹理过滤
 pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

 pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);//设置最近采样过滤
 pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);

 pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);//设置Alpha混合的第一个参数为像素的不同光照类型下的反射颜色值
 pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);//设置Alpha混合方法为将颜色混合的第1个参数颜色输出

 pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);//设置源混合因子Alpha混合系数为当前绘制像素的Alpha值
 pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);//设置目标混合因子Alpha混合系数为1-当前绘制像素的Alpha值

 pd3dDevice->SetFVF(Vertex::FVF);
 pd3dDevice->SetStreamSource(0, m_pVB, 0, sizeof(Vertex));
 pd3dDevice->SetTexture(0, m_pTexture);
 pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

 pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
 pd3dDevice->SetMaterial(&m_Material);
 pd3dDevice->SetTexture(0, m_pTexture2);
 pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
 pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

HRESULT  SetMaterial//设置当前材质属性
(
 CONST D3DMATERIAL9 *pMaterial;
);

原创粉丝点击