摸索了很久,总算有点理清Alpha混合的原理。
关于Alpha混合,最主要的就是要设定好,混合源。然后在渲染时,即时开启Alpha混合效果,用完后再即时关闭(之所以需要关闭,是因为它的计算量太大,关闭可节省资源)
设定Alpha混合源:
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
开关Alpha混合效果:
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true/*false*/);
//创建对象
this->InitTeapot();
this->InitTeapotMaterial();
this->InitBkGndQuad();
this->InitBkGndMaterial();
this->InitBkGndTexture();
this->InitDirLight();
//更改渲染状态
m_pDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true);
m_pDevice->SetRenderState(D3DRS_SPECULARENABLE, true);
//参考code:
//设置渲染状态
m_pDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_pDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); //此可设置成源处贴图的alpha通道(当前源自材质)
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
m_pDevice->SetLight(0, &m_DirLight);// 灯光也是非必须的。如果没加。需使对象自发光,要不看不到效果。
m_pDevice->LightEnable(0, true);
//set camera position and view&projection matrix.
...
// onrender event
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
m_pDevice->SetMaterial(&m_TeapotMtrl);
m_pDevice->SetTexture(0, 0);//这句应该是非必须的。但最好加。
m_pTeapot->DrawSubset(0);
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
想要理解Alpha混合的原理,其实还有一个很重要的概念需要理清。就是3D空间中物体渲染的先后顺序以及物体离摄像机的远近位置。正常来说,Alpha混合,在实现时,需要首先绘制不需要混合的物体,而且该物体往往离摄像机较远。然后才绘制离摄像头近的,且需要融合的物体。否则有可能会出现不可理喻的现象。(比如:远处物体居然会遮挡住近处的物体)。