积木

No sub title

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

摸索了很久,总算有点理清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混合,在实现时,需要首先绘制不需要混合的物体,而且该物体往往离摄像机较远。然后才绘制离摄像头近的,且需要融合的物体。否则有可能会出现不可理喻的现象。(比如:远处物体居然会遮挡住近处的物体)。
posted on 2011-06-05 19:54 Jacc.Kim 阅读(879) 评论(0)  编辑 收藏 引用 所属分类: DX

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理