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;
);
- Alpha混合
- Alpha混合
- alpha混合
- alpha混合
- Alpha混合
- Alpha混合
- Alpha混合代码
- Alpha混合浅谈
- 简易Alpha混合算法
- OpenGL Alpha混合
- Alpha混合浅谈
- alpha混合原理
- Alpha混合浅谈【转载】
- Ogre中的alpha混合
- Alpha混合浅谈
- XNA中的Alpha混合
- Alpha混合浅谈
- alpha混合技术
- Oracle 11g中定位trace文件简便办法
- C#CheckedListBox使用方法
- 修改Linux内核导致网络无法使用问题解决
- 你只会上校内吗?out了吧~ 2011年最变态的100个小众...
- 模仿QQ农场好友列表
- alpha混合
- d3d9中绘制2d元素时提高效率
- MFC双缓冲实现闪烁的处理
- ireport导出excel,html.pdf等格式完整实例
- GWT UIbinder
- 出现:Package name must be specified.错误,提示要Package name 出现:Package name must have at least two identifi
- 堆和栈的区别
- 一个Java程序员应该掌握的10项技能
- C/C++通过WMI和系统API函数获取获取系统硬件配置信息