﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-积木-文章分类-DX</title><link>http://www.cppblog.com/Tongy0/category/17042.html</link><description>No sub title</description><language>zh-cn</language><lastBuildDate>Sun, 05 Jun 2011 13:21:30 GMT</lastBuildDate><pubDate>Sun, 05 Jun 2011 13:21:30 GMT</pubDate><ttl>60</ttl><item><title>Alpha混合</title><link>http://www.cppblog.com/Tongy0/articles/148119.html</link><dc:creator>Jacc.Kim</dc:creator><author>Jacc.Kim</author><pubDate>Sun, 05 Jun 2011 11:54:00 GMT</pubDate><guid>http://www.cppblog.com/Tongy0/articles/148119.html</guid><wfw:comment>http://www.cppblog.com/Tongy0/comments/148119.html</wfw:comment><comments>http://www.cppblog.com/Tongy0/articles/148119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Tongy0/comments/commentRss/148119.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Tongy0/services/trackbacks/148119.html</trackback:ping><description><![CDATA[<div>摸索了很久，总算有点理清Alpha混合的原理。<br />关于Alpha混合，最主要的就是要设定好，混合源。然后在渲染时，即时开启Alpha混合效果，用完后再即时关闭（之所以需要关闭，是因为它的计算量太大，关闭可节省资源）<br />设定Alpha混合源：<br />
<p>&nbsp;m_pDevice-&gt;SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);<br />&nbsp;m_pDevice-&gt;SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);</p>
<p>&nbsp;m_pDevice-&gt;SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);<br />&nbsp;m_pDevice-&gt;SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);<br />开关Alpha混合效果：<br />m_pDevice-&gt;SetRenderState(D3DRS_ALPHABLENDENABLE, true/*false*/);<br /><br /></p>
<p>&nbsp;//创建对象<br />&nbsp;this-&gt;InitTeapot();<br />&nbsp;this-&gt;InitTeapotMaterial();<br />&nbsp;this-&gt;InitBkGndQuad();<br />&nbsp;this-&gt;InitBkGndMaterial();<br />&nbsp;this-&gt;InitBkGndTexture();<br />&nbsp;this-&gt;InitDirLight();<br />&nbsp;//更改渲染状态<br />&nbsp;m_pDevice-&gt;SetRenderState(D3DRS_NORMALIZENORMALS, true);<br />&nbsp;m_pDevice-&gt;SetRenderState(D3DRS_SPECULARENABLE, true);<br /><br />&nbsp;//参考code：<br />&nbsp;//设置渲染状态<br />&nbsp;m_pDevice-&gt;SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);<br />&nbsp;m_pDevice-&gt;SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);<br />&nbsp;m_pDevice-&gt;SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);</p>
<p><span style="color: #800000">&nbsp;m_pDevice-&gt;SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);&nbsp;&nbsp;&nbsp;//此可设置成源处贴图的alpha通道（当前源自材质）</span><br /><span style="color: #800000">&nbsp;m_pDevice-&gt;SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);</span></p>
<p><span style="color: #800000">&nbsp;m_pDevice-&gt;SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);</span><br /><span style="color: #800000">&nbsp;m_pDevice-&gt;SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);</span></p>
<p>&nbsp;m_pDevice-&gt;SetLight(0, &amp;m_DirLight);//&nbsp;灯光也是非必须的。如果没加。需使对象自发光，要不看不到效果。<br />&nbsp;m_pDevice-&gt;LightEnable(0, true);</p>
<p>&nbsp;//set camera position and&nbsp;view&amp;projection matrix.<br />...<br /><br />// onrender event<br /></p>
<p><span style="color: #800000">&nbsp;m_pDevice-&gt;SetRenderState(D3DRS_ALPHABLENDENABLE, true);</span><br />&nbsp;<br />&nbsp;m_pDevice-&gt;SetMaterial(&amp;m_TeapotMtrl);<br />&nbsp;m_pDevice-&gt;SetTexture(0, 0);//这句应该是非必须的。但最好加。<br />&nbsp;m_pTeapot-&gt;DrawSubset(0);</p>
<p>&nbsp;<span style="color: #800000">m_pDevice-&gt;SetRenderState(D3DRS_ALPHABLENDENABLE, false);</span></p>
<p>
<hr />
</p></div>补充说明：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;想要理解Alpha混合的原理，其实还有一个很重要的概念需要理清。就是3D空间中物体渲染的先后顺序以及物体离摄像机的远近位置。正常来说，Alpha混合，在实现时，需要首先绘制不需要混合的物体，而且该物体往往离摄像机较远。然后才绘制离摄像头近的，且需要融合的物体。否则有可能会出现不可理喻的现象。（比如：远处物体居然会遮挡住近处的物体）。<img src ="http://www.cppblog.com/Tongy0/aggbug/148119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Tongy0/" target="_blank">Jacc.Kim</a> 2011-06-05 19:54 <a href="http://www.cppblog.com/Tongy0/articles/148119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>