﻿<?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++博客-cngamedev-文章分类-DirectX</title><link>http://www.cppblog.com/cngamedev/category/11946.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 31 Jul 2010 00:44:21 GMT</lastBuildDate><pubDate>Sat, 31 Jul 2010 00:44:21 GMT</pubDate><ttl>60</ttl><item><title>State Changes</title><link>http://www.cppblog.com/cngamedev/articles/100702.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Wed, 11 Nov 2009 05:40:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/100702.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/100702.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/100702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/100702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/100702.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<h1>Knowledge Base</h1>
<br>
<p>
<div align=left>
<table style="BORDER-COLLAPSE: collapse" id=AutoNumber1 border=0 cellSpacing=0 cellPadding=0 width="95%">
    <tbody>
        <tr>
            <td width="100%">
            <p>&nbsp;</p>
            <h2><span class=regularfont><strong>State Changes</strong></span></h2>
            <p><img border=0 src="http://www.circlesoft.org/images/line.jpg" width="100%" height=1></p>
            <p>&nbsp;</p>
            <table style="BORDER-COLLAPSE: collapse" id=AutoNumber1 border=0 cellSpacing=0 cellPadding=0 width="100%">
                <tbody>
                    <tr>
                        <td style="PADDING-BOTTOM: 1px; BORDER-RIGHT-WIDTH: 1px; PADDING-RIGHT: 4px; BORDER-TOP-WIDTH: 1px; PADDING-TOP: 1px" width=10>
                        <h6>&nbsp;</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" width=75>
                        <h6>Category:</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" class=text width=175><a href="http://www.circlesoft.org/pages.php?pg=kbasecategory&amp;cat=4">Performance &amp; Optimizations</a></td>
                        <td width=980>&nbsp;</td>
                    </tr>
                    <tr>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" width=10>
                        <h6>&nbsp;</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" width=75>
                        <h6>Author:</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" class=text width=600></td>
                        <td width=980>&nbsp;</td>
                    </tr>
                    <tr>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" width=10>
                        <h6>&nbsp;</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" width=75>
                        <h6>Posted:</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" class=text width=600>January 6, 2006</td>
                        <td width=980>&nbsp;</td>
                    </tr>
                    <tr>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" width=10>
                        <h6>&nbsp;</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" width=75>
                        <h6>Views:</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" class=text width=600>6028</td>
                        <td width=980>&nbsp;</td>
                    </tr>
                    <tr>
                        <td style="PADDING-BOTTOM: 1px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 1px" width=10>
                        <h6>&nbsp;</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 0px" width=75>
                        <h6>Updates:</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 0px" class=text width=600><a href="http://www.circlesoft.org/pages.php?pg=kbasepage&amp;id=12&amp;updateID=43">01/06/06</a> &nbsp;-&nbsp; </td>
                        <td width=980>&nbsp;</td>
                    </tr>
                    <tr>
                        <td style="PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 0px" width=10>
                        <h6>&nbsp;</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 0px" width=75>
                        <h6></h6>
                        </td>
                        <td style="PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 0px" class=text width=600><a href="http://www.circlesoft.org/pages.php?pg=kbasepage&amp;id=12&amp;updateID=18">03/28/05</a> &nbsp;-&nbsp;circlesoft </td>
                        <td width=980>&nbsp;</td>
                    </tr>
                    <tr>
                        <td style="PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 0px" width=10>
                        <h6>&nbsp;</h6>
                        </td>
                        <td style="PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 0px" width=75>
                        <h6></h6>
                        </td>
                        <td style="PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 0px" class=text width=600><a href="http://www.circlesoft.org/pages.php?pg=kbasepage&amp;id=12&amp;updateID=15">03/28/05</a> &nbsp;-&nbsp;circlesoft </td>
                        <td width=980>&nbsp;</td>
                    </tr>
                </tbody>
            </table>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            <p>Changing a device state, whether it's a render-state, texture-stage-state, or stream-source, can be very expensive.&nbsp;&nbsp;You should optimize your routines to avoid changing redundant states, and to reduce the number of state changes made.&nbsp;&nbsp;Here is a list of state changes, ordered from most expensive to least expensive:</p>
            <p>&nbsp;</p>
            <p>(<a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=260153">Original source</a>)</p>
            <p>
            <table style="BORDER-COLLAPSE: collapse" id=AutoNumber6 border=0 cellSpacing=0 cellPadding=0 width="50%">
                <p>&nbsp;
                <p>&#160;</p>
                <p>&#160;</p>
                <tbody>
                    <tr>
                        <p>&nbsp;
                        <p>&#160;</p>
                        <p>&#160;</p>
                        <td width="47%">
                        <p>&nbsp;</p>
                        <p>
                        <h6><u>API Call</u></h6>
                        <p>&nbsp;</p>
                        <p>&nbsp;</p>
                        </td>
                        </p>
                        <p>
                        <td width="53%">
                        <p>&nbsp;</p>
                        <p>
                        <h6><u>Avg # of Cycles</u></h6>
                        <p>&nbsp;</p>
                        <p>&nbsp;</p>
                        </td>
                        </p>
                        <p>&nbsp;
                        <p>&#160;</p>
                        <p>&#160;</p>
                        </p>
                    </tr>
                    <p>&nbsp;
                    <p>&#160;</p>
                    <p>&#160;</p>
                    <tr>
                        <p>&nbsp;
                        <p>&#160;</p>
                        <p>&#160;</p>
                        <td width="47%" noWrap>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;SetVertexDeclaration&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;SetFVF <br></p>
                        <p>&nbsp;&nbsp;SetVertexShader <br></p>
                        <p>&nbsp;&nbsp;SetPixelShader <br></p>
                        <p>&nbsp;&nbsp;SPECULARENABLE <br></p>
                        <p>&nbsp;&nbsp;SetRenderTarget <br></p>
                        <p>&nbsp;&nbsp;SetPixelShaderConstant (1 Constant) <br></p>
                        <p>&nbsp;&nbsp;NORMALIZENORMALS&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;LightEnable <br></p>
                        <p>&nbsp;&nbsp;SetStreamSource <br></p>
                        <p>&nbsp;&nbsp;LIGHTING <br></p>
                        <p>&nbsp;&nbsp;DIFFUSEMATERIALSOURCE&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;AMBIENTMATERIALSOURCE <br></p>
                        <p>&nbsp;&nbsp;COLORVERTEX <br></p>
                        <p>&nbsp;&nbsp;SetLight <br></p>
                        <p>&nbsp;&nbsp;SetTransform <br></p>
                        <p>&nbsp;&nbsp;SetIndices <br></p>
                        <p>&nbsp;&nbsp;AMBIENT <br></p>
                        <p>&nbsp;&nbsp;SetTexture <br></p>
                        <p>&nbsp;&nbsp;SPECULARMATERIALSOURCE <br></p>
                        <p>&nbsp;&nbsp;EMISSIVEMATERIALSOURCE <br></p>
                        <p>&nbsp;&nbsp;SetMaterial <br></p>
                        <p>&nbsp;&nbsp;ZENABLE <br></p>
                        <p>&nbsp;&nbsp;WRAP0 <br></p>
                        <p>&nbsp;&nbsp;MINFILTER <br></p>
                        <p>&nbsp;&nbsp;MAGFILTER&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;SetVertexShaderConstant (1 Constant)&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;COLOROP <br></p>
                        <p>&nbsp;&nbsp;COLORARG2 <br></p>
                        <p>&nbsp;&nbsp;COLORARG1&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;CULLMODE <br></p>
                        <p>&nbsp;&nbsp;CLIPPING <br></p>
                        <p>&nbsp;&nbsp;DrawIndexedPrimitive <br></p>
                        <p>&nbsp;&nbsp;ADDRESSV <br></p>
                        <p>&nbsp;&nbsp;ADDRESSU&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;DrawPrimitive&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;SRGBTEXTURE&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;STENCILMASK <br></p>
                        <p>&nbsp;&nbsp;STENCILZFAIL&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;STENCILREF <br></p>
                        <p>&nbsp;&nbsp;ALPHABLENDENABLE&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;STENCILFUNC <br></p>
                        <p>&nbsp;&nbsp;STENCILWRITEMASK <br></p>
                        <p>&nbsp;&nbsp;STENCILFAIL <br></p>
                        <p>&nbsp;&nbsp;ZFUNC <br></p>
                        <p>&nbsp;&nbsp;ZWRITEENABLE<br></p>
                        <p>&nbsp;&nbsp;STENCILENABLE <br></p>
                        <p>&nbsp;&nbsp;STENCILPASS <br></p>
                        <p>&nbsp;&nbsp;SRCBLEND <br></p>
                        <p>&nbsp;&nbsp;TWOSIDEDSTENCILMODE <br></p>
                        <p>&nbsp;&nbsp;ALPHATESTENABLE <br></p>
                        <p>&nbsp;&nbsp;ALPHAREF <br></p>
                        <p>&nbsp;&nbsp;ALPHAFUNC&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;DESTBLEND <br></p>
                        <p>&nbsp;&nbsp;COLORWRITEENABLE&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;CCW_STENCILFAIL<br></p>
                        <p>&nbsp;&nbsp;CCW_STENCILPASS <br></p>
                        <p>&nbsp;&nbsp;CCW_STENCILZFAIL <br></p>
                        <p>&nbsp;&nbsp;SCISSORTESTENABLE&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;CCW_STENCILFUNC&nbsp;&nbsp;<br></p>
                        <p>&nbsp;&nbsp;SetScissorRect </p>
                        </td>
                        </p>
                        <p>
                        <td vAlign=top width="53%">
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;6500 - 11250</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;6400 - 11200 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;3000 - 12100 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;6300 - 7000 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1900 - 11200 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;6000 - 6250 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1500 - 9000 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;2200 - 8100</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1300 - 9000 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;3700 - 5800 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1700 - 7500 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;900 - 8300</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;900 - 8200 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;800 - 7800 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;2200 - 5100 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;3200 - 3750 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;900 - 5600 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1150 - 4800 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;2500 - 3100 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;900 - 4600 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;900 - 4500 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1000 - 3700 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;700 - 3900 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1600 - 2700 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1700 - 2500 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1700 - 2400</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1000 - 2700</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1500 - 2100 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1300 - 2000 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1300 - 1980</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;500 - 2570 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;500 - 2550 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1200 - 1400 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1090 - 1500 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1070 - 1500</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;1050 - 1150</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;150 - 1500</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;570 - 700 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;500 - 800</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;550 - 700 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;550 - 700</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;560 - 680 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;520 - 700 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;500 - 750 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;510 - 700 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;520 - 680 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;540 - 650</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;560 - 630</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;500 - 685</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;450 - 590 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;470 - 525 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;460 - 530 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;450 - 540</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;475 - 510 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;465 - 515</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;340 - 560 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;340 - 545 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;330 - 495 </p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;375 - 440</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;250 - 480</p>
                        <p>&nbsp;</p>
                        <p>&nbsp;&nbsp;150 - 340</p>
                        </td>
                        </p>
                        <p>&nbsp;
                        <p>&#160;</p>
                        <p>&#160;</p>
                        </p>
                    </tr>
                    </p>
                    <p>&nbsp;
                    <p>&#160;</p>
                    <p>&nbsp;</p>
                    <p>&nbsp;</p>
                    <p>&#160;</p>
                    <p>&#160;</p>
                    <p>&#160;</p>
                    </p>
                    </p>
                </table>
                <a href="http://www.circlesoft.org/ADDRESS" target=_blank>TEXT</a><a href="http://www.circlesoft.org/ADDRESS" target=_blank>TEXT</a></p>
                </td>
            </tr>
        </tbody>
    </table>
    </div>
<img src ="http://www.cppblog.com/cngamedev/aggbug/100702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-11-11 13:40 <a href="http://www.cppblog.com/cngamedev/articles/100702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NVIDIA Direct3D SDK 10 Code Samples</title><link>http://www.cppblog.com/cngamedev/articles/98672.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Thu, 15 Oct 2009 04:12:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/98672.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/98672.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/98672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/98672.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/98672.html</trackback:ping><description><![CDATA[<a href="http://developer.download.nvidia.com/SDK/10/direct3d/samples.html">http://developer.download.nvidia.com/SDK/10/direct3d/samples.html</a>
<img src ="http://www.cppblog.com/cngamedev/aggbug/98672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-15 12:12 <a href="http://www.cppblog.com/cngamedev/articles/98672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BRDF</title><link>http://www.cppblog.com/cngamedev/articles/98571.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Wed, 14 Oct 2009 06:01:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/98571.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/98571.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/98571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/98571.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/98571.html</trackback:ping><description><![CDATA[<p><strong>Related Terms</strong>:</p>
<p><a href="http://ccrs.nrcan.gc.ca/glossary/index_e.php?id=3016"><font color=#0000ff><u>Bidirectional Reflectance Factor</u></font></a><br><a href="http://ccrs.nrcan.gc.ca/glossary/index_e.php?id=478"><font color=#0000ff><u>Reflectance</u></font></a><br><a href="http://ccrs.nrcan.gc.ca/glossary/index_e.php?id=3130"><font color=#0000ff><u>Backscatter (optical)</u></font></a><br><a href="http://ccrs.nrcan.gc.ca/glossary/index_e.php?id=212"><font color=#0000ff><u>Illumination Angle</u></font></a><br><a href="http://ccrs.nrcan.gc.ca/glossary/index_e.php?id=461"><font color=#0000ff><u>Radiance</u></font></a><br><a href="http://ccrs.nrcan.gc.ca/glossary/index_e.php?id=3114"><u><font color=#0000ff>Viewing Angle</font></u></a><strong><br><br>Equation 1</strong>:<br><img src="http://ccrs.nrcan.gc.ca/glossary/images/eq0884_1_e.gif"></p>
<p><strong>Equation 2</strong>:<br><img src="http://ccrs.nrcan.gc.ca/glossary/images/eq0884_2_e.gif"></p>
<p><strong>Graphic 1</strong>:<br><img alt="Illumination and reflectance geometry." src="http://ccrs.nrcan.gc.ca/glossary/images/0884.jpg"><br>Illumination and reflectance geometry. <br>R = reflected radiation, <br>I = incident radiation; <br>N = north; <br>S = south; <br>Z = vertical direction<br><img alt="viewing angle, first component" src="http://ccrs.nrcan.gc.ca/glossary/images/theta_sub_v.gif"> , <img alt="viewing angle, second component" src="http://ccrs.nrcan.gc.ca/glossary/images/phi_sub_v.gif"> = viewing angle<br><img alt="illumination angle, first component" src="http://ccrs.nrcan.gc.ca/glossary/images/theta_sub_i.gif">, <img alt="illumination angle, second component" src="http://ccrs.nrcan.gc.ca/glossary/images/phi_sub_i.gif"> = illumination angle </p>
<img src ="http://www.cppblog.com/cngamedev/aggbug/98571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-14 14:01 <a href="http://www.cppblog.com/cngamedev/articles/98571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cubic Shadow Mapping in Direct3D</title><link>http://www.cppblog.com/cngamedev/articles/98474.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Tue, 13 Oct 2009 06:03:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/98474.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/98474.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/98474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/98474.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/98474.html</trackback:ping><description><![CDATA[<div class=level1>
<p>GPU들이 더 빠르게 성장함에 따라, GPU에 친숙한 알고리즘들은 더욱 대중적인 것이 되었습니다. 따라서 다른 쉐도우 기법들과 비교하여, 쉐도우 맵핑은 아마도 그림자들을 생성하기 위해 가장 광범위하게 사용되는 기법일 것입니다. 이 글은 전방향성 라이트들 (Omni-directional lights)을 위한 쉐도우 맵핑에 대한 구현의 기본적인 것들을 살펴볼 것이고 최적화와 기법의 향상을 위한 몇몇 이론들을 제공할 것입니다. 다른 접근법들과 방법들이 존재하기 때문에, 저는 최적화의 자세한 부분들을 처리하도록 시도하지 않을 것입니다. 또한, 독자가 C++과 Direct3D의 기본적인 내용과 기본적인 쉐도우 맵핑 기법들에 친숙하다고 가정합니다. </p>
</div>
<h2><a id=the_algorithm name=the_algorithm>The Algorithm</a></h2>
<div class=level2>
<p>전방향성 라이트들을 위한 쉐도우 맵핑과 일반 쉐도우 맵핑의 비교가 가능하도록, 저는 스팟 라이트들 (spot lights)을 위한 기본적인 쉐도우 맵핑 알고리즘을 설명할 것이어서, 당신은 이 방법들을 비교할 수 있습니다. 스팟 라이트들을 사용하여 그림자를 드리우도록 하는 것은 두가지 단계들로 구성됩니다 : </p>
<ol>
    <li class=level1>
    <div class=li>스팟 라이트의 위치에 카메라를 위치시키고 스팟 라이트의 시점에서 단일 구성요소 텍스쳐로의 장면 깊이를 렌더링합니다 (실수형이 보다 바람직합니다).</div>
    <li class=level1>
    <div class=li>투영 텍스쳐를 입히도록 깊이 비교를 위한 깊이 텍스쳐 (쉐도우 맵)의 결과를 사용합니다.</div>
    </li>
</ol>
<p>전방향성 라이트들을 위해 그림자를 입히는 것 또한 두가지 단계들로 구성되지만, 스팟 라이트 쉐도우 맵핑 알고리즘에 몇몇 단순한 변형들이 적용되어져야 합니다 : </p>
<ol>
    <li class=level1>
    <div class=li>전방향 라이트의 위치에 카메라를 위치시키고 큐브맵의 6 면들에 깊이값을 저장하도록 6번 장면의 깊이를 렌더링합니다. 매번마다 카메라의 시야 벡터는 다음의 방향들 중 하나로 향하도록 해야 합니다 : 양의 X, 음의 X, 양의 Y, 음의 Y, 양의 Z, 음의 Z. 이것은 색상 대신 깊이값을 저장하는 것을 제외하고는 환경 맵핑을 위한 큐부맵을 생성하는 것과 거의 동일합니다.</div>
    <li class=level1>
    <div class=li>환경 맵을 입히도록 깊이 비교를 위한 큐브 텍스쳐의 결과 (cubic shadow map)을 사용합니다.</div>
    </li>
</ol>
<p>여기서 볼 수 있듯이, 앞서 언급한 알고리즘들에는 두가지 차이점이 있습니다 : 우선 첫째로, 우리는 6 단계로 쉐도우 맵을 생성해야만 합니다. 두번째로, 우리는 두번째 단계의 투영 텍스쳐링 대신 환경 맵핑을 사용합니다. 이제 기본 알고리즘에 대해 간략하게 이해를 하게 되었으므로, 구현으로 넘어가 더 자세한 것을 얻도록 하겠습니다. </p>
</div>
<h2><a id=implementation name=implementation>Implementation</a></h2>
<div class=level2>
<p>저는 세단계로 구현을 나눌 것입니다 : </p>
<ul>
    <li class=level1>
    <div class=li>초기화</div>
    <li class=level1>
    <div class=li>큐빅 쉐도우 맵에 장면 깊이의 렌더링</div>
    <li class=level1>
    <div class=li>큐빅 쉐도우 맵을 사용하여 장면을 렌더링</div>
    </li>
</ul>
</div>
<h3><a id=step_1_initialization name=step_1_initialization>Step 1 : Initialization</a></h3>
<div class=level3>
<p>초기화 부분은 약간 단순합니다. 이 부분에서는 다섯개의 작업들이 있지만 저는 두번째와 세번째를 다룰 것인데, 다른 것들은 이 글의 범위에 포함되지 않기 때문입니다 (첨부된 소스 코드는 모든 부분들을 다루고 있습니다) : </p>
<ul>
    <li class=level1>
    <div class=li>Direct3D 초기화</div>
    <li class=level1>
    <div class=li>큐빅 쉐도우 맵으로 사용되는 큐브 텍스쳐의 생성과 이 텍스쳐의 모든 여섯 표면을 얻어옴</div>
    <li class=level1>
    <div class=li>가상 카메라의 생성 (장면의 깊이를 렌더링하기 위해 라이트의 위치에 설치되어지도록)</div>
    <li class=level1>
    <div class=li>이펙트들의 로드</div>
    <li class=level1>
    <div class=li>메쉬들의 로드</div>
    </li>
</ul>
<p>다음의 코드 조각은 큐빅 쉐도우 맵을 생성하기 위해 사용됩니다 : </p>
<pre class="code cpp">m_pd3dDevice<span class=sy2>-</span><span class=sy1>&gt;</span>CreateCubeTexture<span class=br0>(</span>m_iCubeFaceSize, <span class=co1>// Cube face edge length</span>
<span class=nu0>1</span>, <span class=co1>// mip levels</span>
D3DUSAGE_RENDERTARGET,
D3DFMT_R32F,  <span class=co1>// could be D3DFMT_R16F</span>
D3DPOOL_DEFAULT,
<span class=sy3>&amp;</span>m_pCubicShadowTex,
<span class=kw2>NULL</span><span class=br0>)</span>;</pre>
<p>다음으로 하는 것은 우리의 큐빅 렌더 타겟의 모든 6개의 표면을 얻는 것입니다. 이것은 각 면에 렌더링 하기 위한 <code>SetRenderTarget()</code> 함수를 사용하게 되기 때문에 필요합니다. 큐브 맵의 양의 X 면을 위해 다음의 C++ 코드가 사용될 것입니다 : </p>
<pre class="code cpp">cubicShadowMap<span class=sy2>-</span><span class=sy1>&gt;</span><span class=search_hit>GetCubeMapSurface</span><span class=br0>(</span>D3DCUBEMAP_FACE_POSITIVE_X, <span class=nu19>0</span>, <span class=sy3>&amp;</span>depthCubeFacePX<span class=br0>)</span>;</pre>
<p>다른 면들을 위해 우리가 받아오기를 원하는 큐브 면에 따라 처음 인자를 변경하여 큐브면과 연관되어 있는 Direct3D 표면을 함수에 넘기게 됩니다. (그래서 우리는 큐브 텍스쳐와 우리의 장면에서 사용하는 각 라이트를 위한 6개의 표면들이 필요하게 될 것입니다.) </p>
<p>가상 카메라의 초기화는 평범합니다; 단지 주의해야 할 점은 90도로 시야 (Field Of View)로의 투영 행렬 (projection matrix)을 생성하고 1.0f로 시야 비율 (aspect ratio)을 초기화 해야 한다는 것입니다. 다음의 코드는 90의 FOV와 1.0의 화면 비율로 투영 행렬을 생성하기 위해 D3DXMatrixPerspectiveFovLH를 사용하는 것입니다. </p>
<pre class="code cpp">D3DXMatrixPerspectiveFovLH<span class=br0>(</span><span class=sy3>&amp;</span>m_ProjMat, D3DX_PI <span class=sy2>/</span> <span class=nu17>2.0f</span>, <span class=nu17>1.0f</span>, <span class=nu17>1.0f</span>, <span class=nu17>500.0f</span><span class=br0>)</span>;</pre>
</div>
<h3><a id=step_2_rendering_to_the_cubic_shadow_map name=step_2_rendering_to_the_cubic_shadow_map>Step 2 : Rendering to the cubic shadow map</a></h3>
<div class=level3>
<p>큐빅 쉐도우 맵에 장면의 깊이를 렌더링하기 위해, 우리는 이전 단계에서 설명된 가상 카메라를 사용할 것입니다. 이 카메라의 방향은 매 단계에서, 각 단계에서 카메라의 뷰 벡터를 변경하고 그에따라 뷰 행렬이 갱신되어져야만 한다는 것을 의미하는 양의 X, 음의 X, 양의 Y, 기타 등등을 바라보도록 변경될 것입니다. </p>
<table class=inline>
    <tbody>
        <tr class=row0>
            <td class="col0 centeralign"><a class=media title=technicalarticles:fig1.jpg href="http://www.swallowstudio.com/wiki/lib/exe/detail.php?id=technicalarticles%3Acubicshadowmappingindirect3d&amp;media=technicalarticles:fig1.jpg"><img class=media title=fig1.jpg alt=fig1.jpg src="http://www.swallowstudio.com/wiki/lib/exe/fetch.php?media=technicalarticles:fig1.jpg"></a> </td>
        </tr>
        <tr class=row1>
            <td class="col0 centeralign"><em>그림 1 : 큐빅 쉐도우 맵에 장면의 깊이를 렌더링하기 위해 6개의 방향들에서 라이트의 카메라.</em> </td>
        </tr>
    </tbody>
</table>
<p>따라서, 처음 단계를 위해 우리는 다음과 같이 해야 합니다 : </p>
<ol>
    <li class=level1>
    <div class=li>카메라를 양의 X 축을 바라보도록 설정합니다.</div>
    <li class=level1>
    <div class=li>초기화 단계에서 얻은 적절한 큐브 면에 렌더 타겟을 설정하고 삭제합니다.</div>
    <li class=level1>
    <div class=li>장면 깊이를 렌더링 합니다 (스팟 라이트 쉐도우 맵핑에서 깊이를 렌더링하는 것과 동일합니다).</div>
    </li>
</ol>
<p>두번째 단계를 위해 다음과 같이 해야 합니다 : </p>
<ol>
    <li class=level1>
    <div class=li>카메라를 양의 Y 축을 바라보도록 설정합니다.</div>
    <li class=level1>
    <div class=li>초기화 단계에서 얻은 적절한 큐브 면에 렌더 타겟을 설정하고 삭제합니다.</div>
    <li class=level1>
    <div class=li>장면 깊이를 렌더링 합니다 (스팟 라이트 쉐도우 맵핑에서 깊이를 렌더링하는 것과 동일합니다).</div>
    </li>
</ol>
<p>계속 합니다. </p>
<p>큐빅 쉐도우 맵 면에 장면 깊이를 렌더링하는 것은 일반적인 쉐도우 맵핑과 동일합니다. 우리는 카메라를 사용하고 우리의 타겟이 2D 소수점 텍스쳐입니다. 여기에 이 부분을 위한 작업을 하게 될 버텍스 쉐이더가 있습니다 : </p>
<pre class="code cpp">VS_OUTPUT_DEPTH DepthMap_VS<span class=br0>(</span>float4 inPosition <span class=sy4>:</span> POSITION<span class=br0>)</span>
<span class=br0>{</span>
VS_OUTPUT_DEPTH output;
&nbsp;
float4 positionW <span class=sy1>=</span> mul<span class=br0>(</span>inPosition, worldMat<span class=br0>)</span>;
output.<span class=me1>oPositionLight</span> <span class=sy1>=</span> mul<span class=br0>(</span>inPosition, worldViewProjMat<span class=br0>)</span>;
&nbsp;
output.<span class=me1>lightVec</span> <span class=sy1>=</span> lightPosition <span class=sy2>-</span> positionW.<span class=me1>xyz</span>;
&nbsp;
<span class=kw1>return</span> output;
<span class=br0>}</span></pre>
<p>픽셀 쉐이더는 단지 HLSL의 명령 함수를 사용하여 라이트 벡터의 길이를 계산할 것이고, 출력물들은 파이프라인의 결과입니다. </p>
<p>다음의 C++ 코드는 구현의 두번째 단계를 위한 작업을 하게 될 것입니다 : </p>
<pre class="code cpp"><span class=co1>// enable red channel for color write</span>
m_pd3dDevice<span class=sy2>-</span><span class=sy1>&gt;</span>SetrenderState<span class=br0>(</span>D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED<span class=br0>)</span>;
&nbsp;
m_pShadowEffect<span class=sy2>-</span><span class=sy1>&gt;</span>m_pEffect<span class=sy2>-</span><span class=sy1>&gt;</span>SetTechnique<span class=br0>(</span>m_pShadowEffect<span class=sy2>-</span><span class=sy1>&gt;</span>m_DepthMapHandle<span class=br0>)</span>;
m_pShadowEffect<span class=sy2>-</span><span class=sy1>&gt;</span>m_pEffect<span class=sy2>-</span><span class=sy1>&gt;</span>Begin<span class=br0>(</span><span class=sy3>&amp;</span>numOfpasses, <span class=kw2>NULL</span><span class=br0>)</span>;
&nbsp;
<span class=co1>// render the scene depth to positive X side of the cube map</span>
createCamForPositiveX<span class=br0>(</span><span class=br0>)</span>;  <span class=co1>// a helper function for setting up the light's camera looking toward positive X axis</span>
renderDepthToCubeFace<span class=br0>(</span>depthCubeFacePX<span class=br0>)</span>;
&nbsp;
<span class=co1>// render the scene depth to positive Y side of the cube map</span>
createCamForPositiveY<span class=br0>(</span><span class=br0>)</span>;
renderDepthToCubeFace<span class=br0>(</span>depthCubeFacePY<span class=br0>)</span>;
&nbsp;
<span class=co1>// render the scene depth to positive Z side of the cube map</span>
createCamForPositiveZ<span class=br0>(</span><span class=br0>)</span>;
renderDepthToCubeFace<span class=br0>(</span>depthCubeFacePZ<span class=br0>)</span>;
&nbsp;
<span class=co1>// render the scene depth to negative X side of the cube map</span>
createCamForNegativeX<span class=br0>(</span><span class=br0>)</span>;
renderDepthToCubeFace<span class=br0>(</span>depthCubeFaceNX<span class=br0>)</span>;
&nbsp;
<span class=co1>// render the scene depth to negative Y side of the cube map</span>
createCamForNegativeY<span class=br0>(</span><span class=br0>)</span>;
renderDepthToCubeFace<span class=br0>(</span>depthCubeFaceNY<span class=br0>)</span>;
&nbsp;
<span class=co1>// render the scene depth to negative Z side of the cube map</span>
createCamForNegativeZ<span class=br0>(</span><span class=br0>)</span>;
renderDepthToCubeFace<span class=br0>(</span>depthCubeFaceNZ<span class=br0>)</span>;
&nbsp;
m_pShadowEffect<span class=sy2>-</span><span class=sy1>&gt;</span>m_pEffect<span class=sy2>-</span><span class=sy1>&gt;</span>End<span class=br0>(</span><span class=br0>)</span>;
&nbsp;
<span class=co1>// enable color writes</span>
m_pd3dDevice<span class=sy2>-</span><span class=sy1>&gt;</span>SetRenderState<span class=br0>(</span>D3DRS_COLORWRITEENABLE,
D3DCOLORWRITEENABLE_ALPHA |
D3DCOLORWRITEENABLE_RED |
D3DCOLORWRITEENABLE_GREEN |
D3DCOLORWRITEENABLE_BLUE<span class=br0>)</span>;</pre>
<p>renderDepthToCubeFace(&#8230;)와 createCamFor&#8230;() 함수들에 대한 코드들 입니다 : </p>
<pre class="code cpp"><span class=kw4>void</span> CCubicShadowMapping<span class=sy4>::</span><span class=me2>renderDepthToCubeFace</span><span class=br0>(</span>LPDIRECT3DSURFACE9 inCubeSurface<span class=br0>)</span>
<span class=br0>{</span>
D3DXMATRIXA16 worldViewProjMat;
&nbsp;
<span class=co1>// set and clear the cube map face surface</span>
<span class=kw1>if</span> <span class=br0>(</span>SUCCEEDED<span class=br0>(</span>m_pd3dDevice<span class=sy2>-</span><span class=sy1>&gt;</span>SetRenderTarget<span class=br0>(</span><span class=nu19>0</span>, inCubeFaceSurface<span class=br0>)</span><span class=br0>)</span><span class=br0>)</span>
<span class=br0>{</span>
m_pd3dDevice<span class=sy2>-</span><span class=sy1>&gt;</span>Clear<span class=br0>(</span><span class=kw2>NULL</span>, <span class=kw2>NULL</span>, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, <span class=nu12>0x00000000</span>, <span class=nu17>1.0f</span>, <span class=kw2>NULL</span><span class=br0>)</span>;
<span class=br0>}</span>
&nbsp;
<span class=co1>// render all geometries of the scene (assuming that there is no scene management or frustum culling algorithm)</span>
<span class=br0>}</span>
&nbsp;
<span class=kw4>void</span> CCubicShadowMapping<span class=sy4>::</span><span class=me2>createCamFor</span><span class=sy2>***</span><span class=br0>(</span><span class=br0>)</span>
<span class=br0>{</span>
m_pLightCamera<span class=sy2>-</span><span class=sy1>&gt;</span>setLook<span class=br0>(</span><span class=coMULTI>/*m_PositiveLookX for example*/</span><span class=br0>)</span>;
m_pLightCamera<span class=sy2>-</span><span class=sy1>&gt;</span>setUp<span class=br0>(</span><span class=coMULTI>/*m_PositiveLookY for example*/</span><span class=br0>)</span>;
m_pLightCamera<span class=sy2>-</span><span class=sy1>&gt;</span>setRight<span class=br0>(</span><span class=coMULTI>/*m_NegativeLookZ for example*/</span><span class=br0>)</span>;
&nbsp;
<span class=co1>// update the camera's concatenated view-projection matrix with new look, up and right vectors</span>
m_pLightCamera<span class=sy2>-</span><span class=sy1>&gt;</span>updateViewProjMat<span class=br0>(</span><span class=br0>)</span>;
<span class=br0>}</span></pre>
<p>우리가 R32F 텍스쳐 포맷을 가지고 단지 레드 채널만이 사용되기 때문에, 거의 대부분 본질 적으로우리의 큐브 텍스쳐에 장면 깊이를 렌더링 할 때 레드 채널은 있지만 색상들을 쓰기는 비활성화 됩니다. 왜냐하면 큐빅 쉐도우 맵들은 큰 텍스쳐들이어서, 우리는 이 기법을 사용할 때 필-레이트 문제들을 고려해야 합니다. 예를들어, 512 픽셀들의 경계 크기인 큐빅 쉐도우는 비디오 메모리에서 6 (면) * 262,144 (픽셀들) * 32 bit = 6144KB를 차지 합니다. 이것이 기법의 처음 부분을 구현하는데에 여러 최적화 기법들이 존재하는 가에 대한 이유입니다 (큐빅 쉐도우 맵의 색성). 당신은 이러한 퍼포먼스 향상 기법들에 친숙하도록 &#8220;최적화&#8221; 부분을 참조할 수 있습니다. </p>
</div>
<h3><a id=step_3_rendering_the_scene_using_cubic_shadow_map name=step_3_rendering_the_scene_using_cubic_shadow_map>Step 3 : Rendering the Scene using cubic shadow map</a></h3>
<div class=level3>
<p>큐빅 쉐도우 맵을 가지게 된다면, 이제 우리의 큐브 맵내의 대응하는 픽셀들과 각 픽셀의 깊이 비교를 하게 될 마지막 단계를 구현할 시간이 됐습니다. 현재 픽셀의 깊이가 큐빅 쉐도우 맵에서 샘플링된 깊이 보다 크다면, 픽셀은 그림자가 드리워 진것이고, 아니라면 빛을 받게 되는 것입니다. 알고리즘에서 언급했듯이, 투영 텍스쳐에 사용되는 것이 샘플링된 2D 텍스쳐라는 것 대신 샘플링한 큐브 맵이라는 것만이 차이점입니다. </p>
<p>큐브 텍스쳐의 샘플링은 세가지 구성 벡터가 요구됩니다. 이것을 위해, 우리는 라이트의 위치에서 현재 픽셀을 가리키는 곳에서 시작되는 라이트의 방향 벡터의 역을 사용합니다. 우리가 큐브 맵에 각 픽셀의 깊이를 렌더링하는 곳에서, 깊이 요소에 따라 라이트 벡터의 길이가 사용되는 것을 기억하십시요. 그래서 여기서 우리는 깊이 비교를 하기 위해 샘필링하는 우리의 큐브 맵과 현재 픽셀의 깊이를 위한 동일한 것을 하게 될 것입니다. 다음의 HLSL 코드는 장면의 그림자와 라이팅을 계산하게 되는 이펙트에서 추출된 함수입니다 : </p>
<pre class="code cpp">lightFuncOutput LightPositionSH<span class=br0>(</span>float3 inObjPos, float3 inNormal, float3 inCam2Vertex<span class=br0>)</span>
<span class=br0>{</span>
lightFuncOutput output;
output.<span class=me1>diffuseResult</span> <span class=sy1>=</span> float4<span class=br0>(</span><span class=nu17>0.0f</span>, <span class=nu17>0.0f</span>, <span class=nu17>0.0f</span>, <span class=nu17>1.0f</span><span class=br0>)</span>;
output.<span class=me1>specularResult</span> <span class=sy1>=</span> float4<span class=br0>(</span><span class=nu17>0.0f</span>, <span class=nu17>0.0f</span>, <span class=nu17>0.0f</span>, <span class=nu17>1.0f</span><span class=br0>)</span>;
&nbsp;
float4 PLightDirection <span class=sy1>=</span> <span class=nu17>0.0f</span>;
PLightDirection.<span class=me1>xyz</span> <span class=sy1>=</span> lightPosition.<span class=me1>xyz</span> <span class=sy2>-</span> inObPos;    <span class=co1>// inObjPos is the pixel's position in world space</span>
<span class=kw4>float</span> distance <span class=sy1>=</span> length<span class=br0>(</span>PLightDirection.<span class=me1>xyz</span><span class=br0>)</span>;    <span class=co1>// the depth of current pixel</span>
PLightDirection.<span class=me1>xyz</span> <span class=sy1>=</span> PLightDirection.<span class=me1>xyz</span> <span class=sy2>/</span> distance;
&nbsp;
<span class=co1>// compute attenuation factor</span>
PLightDirection.<span class=me1>w</span> <span class=sy1>=</span> max<span class=br0>(</span><span class=nu19>0</span>, <span class=nu0>1</span> <span class=sy2>/</span> <span class=br0>(</span>lightAttenuation.<span class=me1>x</span> <span class=sy2>+</span>
lightAttenuation.<span class=me1>y</span> <span class=sy2>*</span> distance <span class=sy2>+</span>
lightAttenuation.<span class=me1>z</span> <span class=sy2>*</span> distance <span class=sy2>*</span> distance<span class=br0>)</span>;
&nbsp;
<span class=co1>// sample the cubic shadow map using the inverse of light direction</span>
<span class=kw4>float</span> shadowMapDepth <span class=sy1>=</span> texCUBE<span class=br0>(</span>cubeShadpwMapSampler, <span class=kw4>float</span><span class=br0>(</span><span class=sy2>-</span><span class=br0>(</span>PLightDirection.<span class=me1>xyz</span><span class=br0>)</span>, <span class=nu17>0.0f</span><span class=br0>)</span><span class=br0>)</span>.<span class=me1>x</span>;
&nbsp;
<span class=co1>// do the depth comparison</span>
<span class=kw1>if</span> <span class=br0>(</span>distance <span class=sy1>&gt;</span> shadowMapDepth<span class=br0>)</span>
<span class=br0>{</span>
<span class=kw1>return</span> output;    <span class=co1>// the pixel is in shadow so only the ambient light is visible to eye</span>
<span class=br0>}</span>
<span class=kw1>else</span>
<span class=br0>{</span>
<span class=co1>// the pixel is not in shadow so the phong lighting is applied</span>
float3 floatVecTmp <span class=sy1>=</span> normalize<span class=br0>(</span>inCam2Vertex <span class=sy2>+</span> PLightDirection.<span class=me1>xyz</span><span class=br0>)</span>;
&nbsp;
output.<span class=me1>diffuseResult</span> <span class=sy1>=</span> PLightDirection.<span class=me1>w</span> <span class=sy2>*</span> lightDiffuse <span class=sy2>*</span> max<span class=br0>(</span><span class=nu19>0</span>, dot<span class=br0>(</span>inNormal, PLightDirection.<span class=me1>xyz</span><span class=br0>)</span><span class=br0>)</span>;
output.<span class=me1>specularResult</span> <span class=sy1>=</span> PLightDirection.<span class=me1>w</span> <span class=sy2>*</span> lightSpecular <span class=sy2>*</span> <span class=kw3>pow</span><span class=br0>(</span>max, dot<span class=br0>(</span>inNormal, floatVecTmp<span class=br0>)</span><span class=br0>)</span>, specPower<span class=br0>)</span>;
&nbsp;
<span class=kw1>return</span> output;
<span class=br0>}</span>
<span class=br0>}</span></pre>
<p>그리고 최종적으로 이 단계의 버텍스와 픽셀 쉐이더는 다음과 같습니다 : </p>
<pre class="code cpp">VS_OUTPUT cubicShadowMapping_VS<span class=br0>(</span>float4 inPosition <span class=sy4>:</span> POSITION, float3 inNormal <span class=sy4>:</span> NORMAL<span class=br0>)</span>
<span class=br0>{</span>
VS_OUTPUT output;
&nbsp;
float4 positionW <span class=sy1>=</span> mul<span class=br0>(</span>inPosition, worldMat<span class=br0>)</span>;
&nbsp;
output.<span class=me1>cam2Vert</span> <span class=sy1>=</span> <span class=br0>(</span>eyePosition <span class=sy2>-</span> PositionW<span class=br0>)</span>.<span class=me1>xyz</span>;
output.<span class=me1>position</span> <span class=sy1>=</span> mul<span class=br0>(</span>inPosition, worldViewProjMat<span class=br0>)</span>;
output.<span class=me1>worldPos</span> <span class=sy1>=</span> positionW.<span class=me1>xyz</span>;
output.<span class=me1>normalW</span> <span class=sy1>=</span> mul<span class=br0>(</span>inNormal, worldMat<span class=br0>)</span>.<span class=me1>xyz</span>;
&nbsp;
<span class=kw1>return</span> output;
<span class=br0>}</span>
&nbsp;
float4 cubicShadowMapping_PS<span class=br0>(</span>VS_OUTPUT In<span class=br0>)</span> <span class=sy4>:</span> COLOR <span class=nu19>0</span>
<span class=br0>{</span>
lightFuncOutput lightResult;
&nbsp;
float3 normal <span class=sy1>=</span> nromalize<span class=br0>(</span>In.<span class=me1>NormalW</span><span class=br0>)</span>;
float3 cam2Vert <span class=sy1>=</span> normalize<span class=br0>(</span>In.<span class=me1>cam2Vert</span><span class=br0>)</span>;
&nbsp;
lightResult <span class=sy1>=</span> LightPointSH<span class=br0>(</span>In.<span class=me1>worldPos</span>, normal, cam2Vert<span class=br0>)</span>;
&nbsp;
float4 ambient <span class=sy1>=</span> materialAmbient <span class=sy2>*</span> globalAmbient;
float4 diffuse <span class=sy1>=</span> materialDiffuse <span class=sy2>*</span> lightResult.<span class=me1>diffuseResult</span>;
float4 specular <span class=sy1>=</span> materialSpecular <span class=sy2>*</span> lightResult.<span class=me1>specularResult</span>;
&nbsp;
float4 lighting Color <span class=sy1>=</span> <span class=br0>(</span>ambient <span class=sy2>+</span> <span class=br0>(</span>diffuse <span class=sy2>+</span> specular<span class=br0>)</span><span class=br0>)</span>;
&nbsp;
<span class=kw1>return</span> lightingColor;
<span class=br0>}</span></pre>
<table class=inline>
    <tbody>
        <tr class=row0>
            <td class="col0 centeralign"><a class=media title=technicalarticles:cubic_shadowing_fig2.jpg href="http://www.swallowstudio.com/wiki/lib/exe/detail.php?id=technicalarticles%3Acubicshadowmappingindirect3d&amp;media=technicalarticles:cubic_shadowing_fig2.jpg"><img class=media title=cubic_shadowing_fig2.jpg alt=cubic_shadowing_fig2.jpg src="http://www.swallowstudio.com/wiki/lib/exe/fetch.php?media=technicalarticles:cubic_shadowing_fig2.jpg"></a> </td>
        </tr>
        <tr class=row1>
            <td class="col0 centeralign"><em>그림 2 : 전방향성 라이트에서의 최종 결과.</em> </td>
        </tr>
    </tbody>
</table>
</div>
<h3><a id=optimization name=optimization>Optimization</a></h3>
<div class=level3>
<p>이 글에서 표현된 기법은 전방향성 라이트들을 위한 가장 기본적인 쉐도우 맵핑 기법입니다. 기본 기법을 더욱 빠르게 실행하고 정확한 결과들을 더을 수 있도록 도와주는 여러 최적화와 품질 향상 기법들이 존재합니다. 이 부분은 이러한 기법들의 간략한 이해를 돕도록 할 것이지만 자세한 구현은 하지 않는데, 이렇게 하게 되면 이 글이 쉐도우 맵핑에 대한 책으로 만들어질 정도가 될 것이기 때문입니다! 그러기 때문에, 여기에 당신이 연구해 볼 수 있는 몇몇 기법들만을 소개하도록 하겠습니다 : </p>
<ul>
    <li class=level1>
    <div class=li>처음 주목해 볼 것은 프러스텀 컬링입니다. 우리의 깊이 큐브 맵을 채우기 위해 6번 장면을 그리는 것을 기억하십시요. 따라서, 프러스텀 컬링의 적용은 그리기 호출을 많이 줄이는데 도움이 될 것입니다.</div>
    <li class=level1>
    <div class=li>두번째 것은 가능한 많이 처음 단계의 렌더링 패스들을 감소시키도록 하는 것입니다; 다른 말로 하면, 큐빅 쉐도우 맵의 면들을 렌더링 하지 않는 것입니다. 깊이 렌더링 단계는 6개의 카메라들을 필요로 하지만, 예를 들어, 이 카메라들의 원뿔의 일부분이 우리의 메인 카메라의 프러스텀 내부에 위치하지 않거나 오직 세가지 의 원뿔의 일부분만이 보일 수 있습니다. 이 기법은 구현하기 쉽고 렌더링 속도를 향상하는데 큰 효과가 있습니다.</div>
    <li class=level1>
    <div class=li>세번째 것은 그림자를 드리우는 오브젝트들의 컬링입니다. 이것을 위해, 우리는 라이트의 위치에 기반한 폭이 좁은 측면으로 라이트와 그림자를 드리우는 오브젝트 모두 감싸는 가상의 원뿔을 생성해야만 합니다. 그리고 나서 우리는 이 원뿔에서 프러스텀 컬링을 실행하고 그림자를 드리우는 오브젝트가 보이는지 아닌지를 결정합니다. 만일 왜 우리가 프러스텀에 대응하는 간단한 컬링 캐스터들 대신 원뿔을 사용하는지 궁금해 한다면, 이것은 시야에서 그림자가 튀는 현상을 막을 수 있기 때문입니다.</div>
    <li class=level1>
    <div class=li>네번째는 라이트에 의해 영향을 받는 화면의 영역을 표시하는 오려지는 사각형을 정의하고 라이트에 영향을 받지 않는 픽셀들을 버리는 하드웨어의 영역 오리기 검사를 사용하는 것입니다. 우리의 장면에 위치한 각 전방향성 라이트는 제한된 길이를 가지고 이 범위를 넘는 픽셀들의 처리는 소용이 없기 때문에, 이 기법 또한 구현하기 쉽고 굉장한 혹도 향상을 이룰 수 있습니다. </div>
    <li class=level1>
    <div class=li>다섯번째는 nVidia GeForce3 이상에서 가능하게된 하드웨어 쉐도우 맵핑을 사용하는 것입니다. 하드웨어 쉐도우 맵핑을 사용하는 것은 더 적은 메모리 대역폭 소비, 색상 버퍼 쓰기가 없고 오직 깊이 쓰기만에 대한 하드웨어 가속과 같은 여러 장점이 있습니다. 일반적인 쉐도우 맵핑을 위해 하드웨어 쉐도우 맵핑을 사용하는 것은 평범하지만 우리의 깊이 맵을 위해 큐브 텍스쳐를 사용하기 때문에, 우리는 전방향상 쉐도우 맵핑을 위해 이 기법을 직접적으로 구현 할 수 없습니다. 쉐도우 깊이 텍스쳐들이 (D24, D16) 큐브텍스쳐를 지원하지 않기 때문이지만, 큐빅 쉐도우 맵핑으로 하드웨어 쉐도우 맵핑을 사용할 수 없다는 것을 뜻하지는 않습니다. 해결 방법은 큰 깊이 텍스쳐 내에 큐브 맵의 모든 6면들을 통합하고 이 텍스쳐에서의 샘플 텍섿르에 특별한 어드레싱 기법을 사용하는 것입니다. 다른 말로 하면, 우리는 3방향의 규브 텍스쳐 좌표 벡터를 &#8220;VSDT&#8221; 또는 &#8220;Virtual Shadow Depth Cube Texture&#8221;라고 불리는 이 텍스쳐의 샘플링을 위해 2방향의 구성요소로 변경하는 것으로 큐브 맵을 이 텍스쳐로 처리하는 것입니다.</div>
    </li>
</ul>
</div>
<h3><a id=the_source_code name=the_source_code>The Source code</a></h3>
<div class=level3>
<p>이 글의 <a class="media mediafile mf_zip" title=technicalarticles:cubic_shadowing_source_code.zip href="http://www.swallowstudio.com/wiki/lib/exe/fetch.php?media=technicalarticles:cubic_shadowing_source_code.zip"><u><font color=#800080>소스 코드</font></u></a>에 대해 언급해야하는 몇가지 주의 사항들이 있습니다 : </p>
<ul>
    <li class=level1>
    <div class=li>소스 코드는 nVidia PerfHUD에 준비되어 있습니다. 그래서 (만일 당신이 프로그램과 호환되는 비디오 카드를 가지고 있다면) 파이프 라인을 탐색해 보는 것과 실시간으로 알고리즘의 시각화를 보는데 문제가 없습니다. 또한 알고리즘의 속도가 집중되는 부분들을 찾을 수 있고 아마도 새로운 아이디어를 생각해 낼 수 도 있을 것입니다.</div>
    <li class=level1>
    <div class=li>소스 코드는 최적화되지 않아서 (C++과 HLSL 코드 모두) 당신은 이전에 기술된 최적화 기법들을 위한 코드를 추가 해 볼 수 있습니다.</div>
    </li>
</ul>
<table class=inline>
    <tbody>
        <tr class=row0>
            <td class="col0 centeralign"><a class=media title=technicalarticles:cubic_shadowing_fig3.jpg href="http://www.swallowstudio.com/wiki/lib/exe/detail.php?id=technicalarticles%3Acubicshadowmappingindirect3d&amp;media=technicalarticles:cubic_shadowing_fig3.jpg"><img class=media title=cubic_shadowing_fig3.jpg alt=cubic_shadowing_fig3.jpg src="http://www.swallowstudio.com/wiki/lib/exe/fetch.php?media=technicalarticles:cubic_shadowing_fig3.jpg"></a> </td>
        </tr>
        <tr class=row1>
            <td class="col0 centeralign"><em>그림 3 : nVidia PerfHUD로 실행된 예제 어플리케이션.</em> </td>
        </tr>
    </tbody>
</table>
</div>
<h3><a id=references name=references>References</a></h3>
<div class=level3>
<ol>
    <li class=level1>
    <div class=li>Gerasimov and Philipp. Omnidirectional Shadow Maps. In GPU Gems, Addison-Wesley. Pages 193-203, 2004.</div>
    <li class=level1>
    <div class=li>G king and W Newhall. Efficient Omnidirectional Shadow Maps. In ShaderX3: Advanced Rendering with DirectX and OpenGL, Charles River Media. Pages 435-448, 2004.</div>
    </li>
</ol>
</div>
<img src ="http://www.cppblog.com/cngamedev/aggbug/98474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-13 14:03 <a href="http://www.cppblog.com/cngamedev/articles/98474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cube map texture &amp; volume texture </title><link>http://www.cppblog.com/cngamedev/articles/98412.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Mon, 12 Oct 2009 12:09:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/98412.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/98412.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/98412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/98412.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/98412.html</trackback:ping><description><![CDATA[<br><br>
<p style="FONT-SIZE: 18pt; COLOR: #800000; FONT-FAMILY: Comic Sans MS">都是非纯2D的texture</p>
<p style="FONT-SIZE: 18pt; COLOR: #800000; FONT-FAMILY: Comic Sans MS">cube map &nbsp;texture可以理解为6个面的纸盒, sample的时候使用vector射线型的sample.</p>
<p style="FONT-SIZE: 18pt; COLOR: #800000; FONT-FAMILY: Comic Sans MS">volume texture可以理解是一摞2D texture,sample的时候用第几摞+2D坐标来sample.</p>
<p style="FONT-SIZE: 18pt; COLOR: #800000; FONT-FAMILY: Comic Sans MS">虽然都是非2D,sample都用3维数据,差异大啊.<br><br>CubeMap 在实时渲染中应用十分广泛. 通过视线和法线计算出的反射光线来查询CubeMap<br>可以创建一个真实的反射镜面体, 通过视线和法线计算出的折射光线来查询CubeMap<br>可以创建一个透明体. 由于查询速度快的原因,在实时的CG渲染中应用十分的广泛.<br><br>我们的CubeMap大都是从外部的图片得来的, 图片是不可以变化的, 故是静态的. <br>但问题是, 如果有其他物体在反射物体外运动. 如果我们仅仅查询静态的CubeMap<br>是不能够反射到动态物体的影象,所以我们需要一个动态的CubeMap, 即我们需要Render to CubeMap.</p>
<img src ="http://www.cppblog.com/cngamedev/aggbug/98412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-12 20:09 <a href="http://www.cppblog.com/cngamedev/articles/98412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Direct3D9] Texture Shader</title><link>http://www.cppblog.com/cngamedev/articles/98407.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Mon, 12 Oct 2009 11:23:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/98407.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/98407.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/98407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/98407.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/98407.html</trackback:ping><description><![CDATA[<p>아마도 텍스쳐의 텍셀 값들을 만들어 내는 일종의 GPU 프로그램인 듯 하다. 찾아보니 DX10에서는 <strong>ID3DX10DataProcessor</strong>라는 놈으로 바뀐 듯???</p>
<p>HLSL에서 noise 함수를 쓰려고 했더니 픽셀 셰이더에서 안된다고 한다. 아얘 안써지는게 아니라... 의존적인 코드가 들어가면 안된다. 예를 들면 노이즈 함수 결과를 이용한다던지 하는거...</p>
<p>ID3DXTextureShader 라는 인터페이스로 사용할 수 있고, 텍스쳐 셰이더를 동작 시키는 방법은</p>
<p>HRESULT D3DXFillTextureTX( <br>&nbsp;&nbsp;&nbsp; LPDIRECT3DTEXTURE9 pTexture, <br>&nbsp;&nbsp;&nbsp; LPD3DXTEXTURESHADER pTextureShader <br>);</p>
<p>라는 함수를 사용하면 되는가 보다. <br>첫 번째 파라메터에는 텍셀이 채워질 텍스쳐 인스턴스이고, 두 번째 파라메터는 텍스쳐 셰이더의 인스턴스... 그리고 HLSL에서 함수 파라메터는 POSITION과 PSIZE가 들어가야 한다. 뭐 POSITION은 텍셀의 좌표이고, PSIZE는 텍셀의 크기. 그리고 반환 값은 당연히 COLOR가 되어야 한다. 텍스쳐 셰이더의 인스턴스를 생성하기 위해서</p>
<p>HRESULT D3DXCreateTextureShader( <br>&nbsp;&nbsp;&nbsp; CONST DWORD *pFunction, <br>&nbsp;&nbsp;&nbsp; LPD3DXTEXTURESHADER *ppTextureShader <br>);</p>
<p>를 사용 한단다. 첫 번째 파라메터는 컴파일된 텍스쳐 셰이더의 바이너리 코드 스트림이고, 두 번째는 생성될 텍스쳐 셰이더 인스턴스를 받을 포인터... <br>컴파일은 D3DXAssembleShader나 D3DXCompileShader등의 함수를 써서 바이너리 코드를 얻어야 하나부다.실시간으로 노이즈 함수를 사용하기 위해서 미리 텍스쳐 셰이더로 노이즈 텍스쳐를 이걸로 만든다음. 정점 셰이더나 픽셀 셰이더에서는 이 텍스쳐를 사용해야 하는 것 같다.</p>
<p align=center><a href="http://pds10.egloos.com/pds/200808/11/22/f0060522_48a029cb83329.jpg"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=416 alt=ts-296-biggreat src="http://pds11.egloos.com/pds/200808/11/22/f0060522_48a029cbdb4d6.jpg" width=504 border=0></a> <br>엔비댜에서 이렇다고 한다.</p>
<p>아주 간단한 펄린 노이즈 생성 함수다. </p>
<p>float4 tx_makePerlinNoise( <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float2 vTexCoord : POSITION, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float2 vTexelSize : PSIZE) : COLOR <br>{ <br>&nbsp;&nbsp;&nbsp; float n = 0.0f; <br>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 5; ++i) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n += noise(vTexCoord); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vTexCoord *= 2.0f; <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; n = n * 0.5f + 0.5f; <br>&nbsp;&nbsp;&nbsp; return float4(n, n, n, 1.0f); <br>}</p>
<p>옥타브는 5로 설정해 놓았고, 매 옥타브마다 주파수는 2배씩 증가하도록 해 놓았다. <br>또한 텍스쳐에는 [0,1) 값만 허용 되므로 (Floating-Point 텍스쳐를 사용하지 않는다면) [-1,1]의 값을 갖는 노이즈 함수를 재 설정 하였다 (<strike>&lt;= 뭔 소리야</strike>). <br>위에서 얘기 했지만, vTexCoord : POSITION과 vTexelSize : PSIZE는 필수 항목이다. PSIZE가 있어서 Weighted Sum 연산이 가능할것 같다(추측).</p>
<p>텍스쳐 셰이더를 컴파일 하는 과정에서 약간 애를 먹었는데</p>
<p>HRESULT hRet = D3DXCompileShaderFromFile( <br>&nbsp;&nbsp;&nbsp; "perlin_noise.hlsl", <br>&nbsp;&nbsp;&nbsp; NULL, <br>&nbsp;&nbsp;&nbsp; NULL, <br>&nbsp;&nbsp;&nbsp; "tx_makePerlinNoise", <br>&nbsp;&nbsp;&nbsp; "tx_1_0", <br>&nbsp;&nbsp;&nbsp; 0, <br>&nbsp;&nbsp;&nbsp; &amp;pTSCodeBuf, <br>&nbsp;&nbsp;&nbsp; &amp;pErrMsgs, <br>&nbsp;&nbsp;&nbsp; NULL <br>);</p>
<p>타겟(프로파일)을 tx_1_0 으로 해주어야 한다. 도큐멘트의 함수 설명에는 vs와 ps밖에 안나와 있어서... 나머지 파라메터들은 정점 셰이더와 픽셀 셰이더에서와 같다(<u><font color=#ff0000>모 토큐멘테이션 하기 싫어하는거 공감은 간다</font></u>). <br>이렇게 해서 D3DXFillTextureTX로 실행하면 Mipmap 단계들까지 자동으로 채워주는 완벽한 절차적 텍스쳐를 생성할 수 있게 된다. 근데 좀 오래 걸린다. 아무래도 실시간에는 사용 불가능할 듯...</p>
<p align=center><a href="http://pds11.egloos.com/pds/200808/11/22/f0060522_48a029cc36459.jpg"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=396 alt=perlin_noise-biggreat src="http://pds11.egloos.com/pds/200808/11/22/f0060522_48a029cca54e8.jpg" width=504 border=0></a> </p>
<p align=left>이거 이제 어떻게 써먹냐....</p>
<!--
<rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:description
rdf:about="http://duckii.egloos.com/692076"
dc:identifier="http://duckii.egloos.com/692076"
dc:title="[Direct3D9] Texture Shader"
trackback:ping="http://duckii.egloos.com/tb/692076"/>
</rdf:rdf>
-->
<img src ="http://www.cppblog.com/cngamedev/aggbug/98407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-12 19:23 <a href="http://www.cppblog.com/cngamedev/articles/98407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>블랜딩 애니메이션</title><link>http://www.cppblog.com/cngamedev/articles/98163.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Fri, 09 Oct 2009 07:47:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/98163.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/98163.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/98163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/98163.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/98163.html</trackback:ping><description><![CDATA[<p>&nbsp;예: 뛰면서 총쏘기: 뛰기 + 총쏘기</p>
<p>animation controller는 모든 활성화된 track들의 animation을 자동으로 blending해 준다 <br>따라서 animation들을 각 track에 지정하고 track들을 활성화시키면 됨 <br>track을 활성화하기 (Enable을 true로 하면 활성화됨) <br>&nbsp;</p>
<p>ID3DXAnimationController::SetTrackEnable<br>Enables or disables a track in the animation controller.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HRESULT SetTrackEnable(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT Track,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL Enable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parameters<br>Track <br>[in] Identifier of the track to be mixed. <br>Enable <br>[in] Enable value. Set to TRUE to enable this track in the controller, or to FALSE to prevent it from being mixed. <br>Return Values<br>If the method succeeds, the return value is S_OK. If the method fails, the return value can be one of the following values: D3DERR_INVALIDCALL, E_OUTOFMEMORY.</p>
<p>Remarks<br>To mix a track with other tracks, the Enable flag must be set to TRUE. Conversely, setting the flag to FALSE will prevent the track from being mixed with other tracks.</p>
<p>Requirements<br>Header: Declared in D3dx9anim.h.</p>
<p>&nbsp;</p>
<p>각 track의 play 속도를 지정할 수 있음: 보통 1로 하나, fast forward나 slow motion등의 특수효과를 얻으려면 1전후로 조절하면 됨 </p>
<p>ID3DXAnimationController::SetTrackSpeed<br>Sets the track speed. The track speed is similar to a multiplier that is used to speed up or slow down the playback of the track.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HRESULT SetTrackSpeed(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT Track,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FLOAT Speed<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parameters<br>Track <br>[in] Identifier of the track to set the speed on. <br>Speed <br>[in] New speed. <br>Return Values<br>If the method succeeds, the return value is S_OK. If the method fails, the return value can be one of the following values: D3DERR_INVALIDCALL, E_OUTOFMEMORY.</p>
<p>Requirements<br>Header: Declared in D3dx9anim.h.</p>
<p>&nbsp;</p>
<p>// blen함수<br>void Tiny_X::PlayJogWaveBlend()<br>{<br>ID3DXAnimationSet* jog = 0;<br>ID3DXAnimationSet* wave = 0;<br>g_animCtrl-&gt;GetAnimationSet(JOG_INDEX, &amp;jog);<br>g_animCtrl-&gt;GetAnimationSet(WAVE_INDEX, &amp;wave);<br>g_animCtrl-&gt;SetTrackAnimationSet(0, jog);<br>g_animCtrl-&gt;SetTrackAnimationSet(1, jog);<br>g_animCtrl-&gt;SetTrackWeight(0, 0.4f);<br>g_animCtrl-&gt;SetTrackWeight(1, 0.6f);<br>g_animCtrl-&gt;SetTrackEnable(0, true);<br>g_animCtrl-&gt;SetTrackEnable(1, true);<br>g_animCtrl-&gt;SetTrackSpeed(0, 1.0f);<br>g_animCtrl-&gt;SetTrackSpeed(1, 1.0f);<br>g_animCtrl-&gt;SetTrackPriority(0, D3DXPRIORITY_HIGH);<br>g_animCtrl-&gt;SetTrackPriority(1, D3DXPRIORITY_HIGH);<br>g_animCtrl-&gt;ResetTime();<br>}<br>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/cngamedev/aggbug/98163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-09 15:47 <a href="http://www.cppblog.com/cngamedev/articles/98163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>게임학습 장소</title><link>http://www.cppblog.com/cngamedev/articles/98160.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Fri, 09 Oct 2009 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/98160.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/98160.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/98160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/98160.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/98160.html</trackback:ping><description><![CDATA[<a href="http://3dapi.com/Lecture/">http://3dapi.com/Lecture/</a>
<img src ="http://www.cppblog.com/cngamedev/aggbug/98160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-09 15:25 <a href="http://www.cppblog.com/cngamedev/articles/98160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 애니메이션, 스키닝 </title><link>http://www.cppblog.com/cngamedev/articles/98082.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Thu, 08 Oct 2009 06:27:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/98082.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/98082.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/98082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/98082.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/98082.html</trackback:ping><description><![CDATA[<br><br><font color=#ff0000>&nbsp;키 프레임 애니메이션(key frame animation)</font>
<p>&nbsp; :&nbsp; 전체 애니메이션중에서 중요한 몇개의 프레임에 애니메이션 키 값을 등록하고,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 나머지 들은 자동으로 생성하는 방법이다.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;프레임은 애니메이션에서 출력될 한 장면 한 장면을 말한다.</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;자. 이제 밑에 사각형이다.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ◆&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;◇&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;◇&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;◇&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;◇&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;◆&nbsp;&nbsp; </p>
<p>&nbsp;(-10,0,0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;(10,0,0)&nbsp; </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 전체 6프레임짜리 애니메이션이라고 치자 ㅡㅡ;;</p>
<p>&nbsp;&nbsp; 꺼먼색 마름모가 처음1번에서부터 2번까지 이동하는 애니메이션이다.</p>
<p>&nbsp;&nbsp;&nbsp;여기서 키값이라 하면 그 지점에서의 좌표라고 생각하면된다.</p>
<p>&nbsp;&nbsp; 긍까 프레임은 (1)번 프레임 (2)번 프레임 두개만 만들어놓고</p>
<p>&nbsp;&nbsp; 나머지 4개의 중간프레임( ◇ ) 들은 보간(interpolate)하여 자동으로 생성한다.</p>
<p>&nbsp;</p>
<p>&nbsp; 책의 예제를 보면 위치가 이동하면서 회전까지 한다.</p>
<p>&nbsp; 크기와 이동은 선형보간으로 해결이 가능하지만.. </p>
<p>&nbsp; 회전은.. <font color=#0000ff>사원수</font>를&nbsp;이용한다.</p>
<p>&nbsp;</p>
<p><font color=#0000ff>* 사원수( 쿼터니언(Quaternion) )&nbsp;</font>&nbsp;&nbsp; :&nbsp;&nbsp; 4개의 값으로 이루어진 복소수체계.. ㅡㅡ;;</p>
<p>&nbsp;&nbsp;&nbsp;<font color=#ff0000>3차원 그래픽에서 회전을 표현할때</font>, 행렬 대신 사용하는 수학적 개념이다.</p>
<p>&nbsp;&nbsp; 행렬에 비해 연산속도도 빠르고 차지하는 메모리의&nbsp;양도&nbsp;적다.</p>
<p>&nbsp;&nbsp;&nbsp;행렬에서는 짐발락(Gimbal Lock)&nbsp;등 오류가&nbsp;발생하지만 사원수는 그렇지 않다.&nbsp; </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 암튼 쿼터니언은 <font color=#ff0000>회전메트릭스간의 보간</font>을 위해 쓴다.( 중간값을 뽑기위해)</p>
<p>&nbsp;&nbsp; 중간값을 뽑아서 다시 회전 매트릭스로 만들어야 한다. 그래야 쓸 수 있다.</p>
<p>&nbsp;&nbsp; </p>
<p>&nbsp; 이넘의 사원수의 수학적 개념은 월욜날 한다고 하였고.. 후...</p>
<p>&nbsp;</p>
<p><font color=#0000ff>&nbsp;- 사원수 관련 함수</font></p>
<p>&nbsp;<font color=#ff0000>D3DXQuaternionSlerp</font>()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<font color=#008000>&nbsp;/// 회전값의 구면선형보간<br></font>&nbsp;<font color=#ff0000>D3DXMatrixRotationQuaternion</font>()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#008000>/// 사원수를 회전행렬값으로 변환</font></p>
<p><font color=#008000></font>&nbsp;</p>
<p>&nbsp;소스를 봐보면..</p>
<p><font color=#ff0000>void InitAnimation()&nbsp; </font><font color=#008000>// 애니메이션 초기화 함수<br></font>{<br>&nbsp;g_aniPos[0] = D3DXVECTOR3( 0, 0, 0 );&nbsp;<font color=#008000>/// 위치 키(0,0,0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 처음 프레임. (위치값)<br></font>&nbsp;g_aniPos[1] = D3DXVECTOR3( 5, 5, 5 );<font color=#008000>&nbsp;/// 위치 키(5,5,5)&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 마지막 프레임.(위치값)</font></p>
<p>&nbsp;&nbsp;&nbsp; FLOAT Yaw&nbsp;= D3DX_PI * 90.0f / 180.0f;&nbsp;&nbsp;<font color=#008000>/// Y축 90도 회전<br></font>&nbsp;&nbsp;&nbsp; FLOAT Pitch&nbsp;= 0;<br>&nbsp;&nbsp;&nbsp; FLOAT Roll&nbsp;= 0;<br>&nbsp;D3DXQuaternionRotationYawPitchRoll( &amp;g_aniRot[0], Yaw, Pitch, Roll );&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#008000>&nbsp;&nbsp;&nbsp;/// 사원수 키(Y축90도)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 처음 프레임(회전값)</font></p>
<p>&nbsp;&nbsp;&nbsp; Yaw&nbsp;= 0;<br>&nbsp;&nbsp;&nbsp; Pitch&nbsp;= D3DX_PI * 90.0f / 180.0f;&nbsp;&nbsp;&nbsp;<font color=#008000>/// X축 90도 회전<br></font>&nbsp;&nbsp;&nbsp; Roll&nbsp;= 0;<br>&nbsp;D3DXQuaternionRotationYawPitchRoll( &amp;g_aniRot[1], Yaw, Pitch, Roll );&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#008000> &nbsp;/// 사원수 키(X축90도)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 마지막 프레임(회전값)<br></font>}</p>
<p>&nbsp;</p>
<p><font color=#ff0000>float Linear( float v0, float v1, float t )</font>&nbsp; <font color=#008000>/// 선형보간(Linear Interpolation) 함수<br></font>{<br>&nbsp;return v0 * ( 1.0f - t ) + v1 * t;<br><font color=#008000>// 다음 줄로 바꿔도 된다.<br>//&nbsp;return v0 + t * ( v1 - v0 );<br></font>}</p>
<p>&nbsp;</p>
<p><font color=#ff0000>VOID Animate()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#008000> // 보간하여 가운데 프레임들을 생성한다.. </font><br>{<br>&nbsp;static float t = 0;<br>&nbsp;float x, y, z;<br>&nbsp;<font color=#0000ff>D3DXQUATERNION quat;</font></p>
<p>&nbsp;if( t &gt; 1.0f ) t = 0.0f;</p>
<p>&nbsp;<font color=#008000>/// 위치값의 선형보간<br></font>&nbsp;x = Linear(g_aniPos[0].x, g_aniPos[1].x, t );<br>&nbsp;y = Linear(g_aniPos[0].y, g_aniPos[1].y, t );<br>&nbsp;z = Linear(g_aniPos[0].z, g_aniPos[1].z, t );<br>&nbsp;D3DXMatrixTranslation( &amp;g_matTMParent, x, y, z );<font color=#008000>&nbsp;/// 이동행렬을 구한다</font>.</p>
<p><font color=#008000>//&nbsp;위의 4줄은 다음의 3줄로 바꿀수 있다. //( 지난달에 했던 Lerp 함수.)<br>//&nbsp;D3DXVECTOR3 v;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>//&nbsp;D3DXVec3Lerp( &amp;v, &amp;g_aniPos[0], &amp;g_aniPos[1], t );&nbsp; <br>//&nbsp;D3DXMatrixTranslation( &amp;g_matTMParent, v.x, v.y, v.z );</font></p>
<p>&nbsp;<font color=#ff0000>D3DXQuaternionSlerp</font>( &amp;quat, &amp;g_aniRot[0], &amp;g_aniRot[1], t );&nbsp;&nbsp;<font color=#008000>&nbsp;/// 회전값의 구면선형보간<br></font>&nbsp;<font color=#ff0000>D3DXMatrixRotationQuaternion</font>( &amp;g_matRParent, &amp;quat );&nbsp;<font color=#008000>/// 사원수를 회전행렬값으로 변환<br></font>&nbsp;t += 0.005f;</p>
<p>&nbsp;D3DXMatrixRotationZ( &amp;g_matRChild, GetTickCount()/500.0f );&nbsp; <font color=#008000>/// 자식메시의 Z축 회전행렬<br></font>&nbsp;D3DXMatrixTranslation( &amp;g_matTMChild, 3, 3, 3 );&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#008000> /// 자식메시는 원점으로부터 (3,3,3)거리에 있음<br></font>}</p>
<p>렌더함수 전체부분..</p>
<p><font color=#ff0000>VOID Render()<br></font>{<br>&nbsp;D3DXMATRIXA16&nbsp;matWorld;</p>
<p>&nbsp;&nbsp;&nbsp;<font color=#008000> /// 후면버퍼와 Z버퍼 초기화<br></font>&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );</p>
<p>&nbsp;Animate();&nbsp;&nbsp;&nbsp;&nbsp;<font color=#008000>&nbsp;/// 애니메이션 행렬설정<br></font>&nbsp;&nbsp;&nbsp;<font color=#008000> /// 렌더링 시작<br></font>&nbsp;&nbsp;&nbsp; if( SUCCEEDED( g_pd3dDevice-&gt;BeginScene() ) )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;matWorld = g_matRParent * g_matTMParent;<br>&nbsp;&nbsp;DrawMesh( &amp;matWorld );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#008000>/// 부모 상자 그리기</font></p>
<p><font color=#008000></font>&nbsp;</p>
<p>&nbsp;&nbsp;matWorld = g_matRChild * g_matTMChild * matWorld;<br><font color=#008000>//&nbsp;&nbsp;바로위의 행과 같은 결과<br>//&nbsp;&nbsp;matWorld = g_matRChild * g_matTMChild * g_matRParent * g_matTMParent;<br></font>&nbsp;&nbsp;DrawMesh( &amp;matWorld );&nbsp;&nbsp;<font color=#008000>/// 자식 상자 그리기</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#008000>&nbsp; /// 렌더링 종료<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;EndScene();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#008000>/// 후면버퍼를 보이는 화면으로!<br></font>&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;Present( NULL, NULL, NULL, NULL );<br>}</p>
<p>&nbsp;</p>
<p><font color=#ff0000>* 스키닝(skinning)</font></p>
<p>&nbsp; 피부를 붙인다. 3차원 메시는 관절과 관절 사이가 끊김 현상이 발생하기 때문에</p>
<p>&nbsp; 이를 보완하는 기법이다. 마치 사람의 뼈 위에 피부가 있어서 관절부위가 보이지 않는 것처럼..</p>
<p>&nbsp;</p>
<p>&nbsp; 스키닝에는 다양한 기법들이 있다고하나.. 핵심은.. 뼈대(bone)의 애니메이션 행렬이</p>
<p>&nbsp;&nbsp;메시의 정점에 얼마만큼의 가중치(weight)로 결합될 것인가 하는것이다.</p>
<p>&nbsp; 암튼. 버텍스가 본에 영향받는다.</p>
<p>&nbsp;일반적인 스키닝 버텍스 구조체..</p>
<p><font color=#0000ff>struct SkinedVertex</font></p>
<p><font color=#0000ff>{</font></p>
<p><font color=#0000ff>&nbsp;&nbsp;&nbsp; D3DXVECTOR3&nbsp;&nbsp; pos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#008000> // 위치.</font></p>
<p><font color=#0000ff>&nbsp;&nbsp;&nbsp; float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;weight[3];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#008000>&nbsp; // 본(bone)에 의한 가중치.</font></p>
<p><font color=#0000ff>&nbsp;&nbsp;&nbsp; unsigned char&nbsp;&nbsp;&nbsp;&nbsp;BI[4];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#008000>&nbsp;&nbsp; // 본(bone) 인덱스</font></p>
<p><font color=#0000ff>&nbsp;&nbsp;&nbsp; D3DXVECTOR3&nbsp;&nbsp; Normal;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#008000>&nbsp; // 노말 좌표.</font></p>
<p><font color=#0000ff>&nbsp;&nbsp;&nbsp; D3DXVECTOR2&nbsp;&nbsp; Tex;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#008000>&nbsp;&nbsp; // 텍스쳐 좌표.</font></p>
<p><font color=#0000ff>}</font></p>
<p><font color=#0000ff></font>&nbsp;</p>
<p><font color=#0000ff>- 매트릭스 팔레트(Matrix Palette)</font></p>
<p>&nbsp;&nbsp; 기본적인 개념은 정점이 <font color=#ff0000>최대 4개까지 </font>가중치를 가질 수 있는데, 이들의 가중치에 따라서</p>
<p>&nbsp;&nbsp;&nbsp;다른 행렬을 곱해준다는 것이다. 이때 곱해주는 행렬을 최대 256개까지 매트릭스 팔레트라는</p>
<p>&nbsp;&nbsp; 영역에 셋팅해 놓으면 나머지는 D3D가 알아서 <font color=#ff0000>DrawPrimitive()</font>함수 호출시에 처리해준다.&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;<font color=#ff0000>최대 256개까지 지원하는 매트릭스 팔레트에 뼈대의 애니메이션 키를 등록</font>해 놓고 각각에</p>
<p>&nbsp;&nbsp; 뼈대가 영향을 미치는 정점에 가중치와 인덱스만 적절하게 셋팅되어있으면 모든것이</p>
<p>&nbsp;&nbsp; DrawPrimitive() 호출 한번으로 끝나는것이다.</p>
<p>&nbsp;</p>
<p>ex) 버텍스 구조.</p>
<p>ex) Vl[100] =&nbsp; |&nbsp; x&nbsp; | &nbsp; y &nbsp;|&nbsp; z&nbsp; |&nbsp; <font color=#008000>// 위치.</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;| 0.6 | 0.2 | 0.1 |&nbsp;&nbsp;<font color=#008000>// 4번째 가중치는 1.0 - ( 0.6 + 0.2 + 0.1 )</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 5 | 6 | 10 | 11 |&nbsp;<font color=#008000>&nbsp;//5번 본(bone)은 0.6의 가중치, 6번은0.2, 10번은0.1, 11번은0.1</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Nx &nbsp;| Ny &nbsp;| Nz |<font color=#008000>&nbsp; // 노말</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Tex x&nbsp;&nbsp;| Tex y |&nbsp; <font color=#008000>// 텍스쳐</font></p>
<p>&nbsp;</p>
<p>ex) 50개의 본이 매트릭스 팔레트에 셋팅되었다고 하고...</p>
<p>ex) &nbsp;Vw[100] = Vl[100] * MP[5] * 0.6&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Vl[100] * MP[6] * 0.2</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +&nbsp;Vl[100] * MP[10] * 0.1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + Vl[100] * MP[11] * 0.1</p>
<p>&nbsp;</p>
<p>&nbsp; ※&nbsp; (&nbsp;Vl =&nbsp;로컬&nbsp; , Vw =&nbsp;월드&nbsp; )</p>
<p>&nbsp;</p>
<p><font color=#ff0000>* 메트릭스 팔레트의 지원.</font></p>
<p>&nbsp; ATI 는 메트릭스 팔레트를 최대 37개까지 지원한다.</p>
<p>&nbsp; nVidia 의 GeForce는 전혀 지원하지 않는다.</p>
<p>&nbsp; 그렇기 때문에 매트릭스 팔레트를 비롯한 모든 스키닝 기법은 GPU 프로그래밍을 통해</p>
<p>&nbsp; 직접 구현한다.</p>
<p>&nbsp;</p>
<p>* 버텍스 쉐이더는 CPU에서도 가능하지만 GPU에서 하면 더 나은 속도향상을 가져온다.</p>
<p>&nbsp; 장치 생성시 MIXED 설정으로 한다.</p>
<p>&#160;</p>
<p>* 픽셀 쉐이더는 GPU에서만 지원된다.</p>
<p>&nbsp;</p>
<p><font color=#ff0000>* 책의 예제소스를 보면..</font></p>
<p><font color=#0000ff>- Init 부분의 코드조각..</font></p>
<p><font color=#008000>/// 컬링기능을 끈다.<br></font>&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );</p>
<p>&nbsp;<font color=#008000>&nbsp;&nbsp; /// Z버퍼기능을 켠다.<br></font>&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;SetRenderState( D3DRS_ZENABLE, TRUE );</p>
<p>&nbsp;&nbsp;&nbsp;<font color=#008000> /// 정점에 색깔값이 있으므로, 광원기능을 끈다.<br></font>&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;SetRenderState( D3DRS_LIGHTING, FALSE );</p>
<p><font color=#008000>&nbsp;/// matrix palette 사용<br></font>&nbsp;&nbsp;&nbsp;<font color=#ff0000> g_pd3dDevice-&gt;SetRenderState( <font color=#ff3399>D3DRS_INDEXEDVERTEXBLENDENABLE</font>, TRUE );</font></p>
<p><font color=#008000>&nbsp;/// blend weight는 4개(오타 아님! 4개!)<br></font>&nbsp;<font color=#ff0000>&nbsp;&nbsp; g_pd3dDevice-&gt;SetRenderState( <font color=#ff3399>D3DRS_VERTEXBLEND</font>, <font color=#ff3399>D3DVBF_3WEIGHTS </font>);</font></p>
<p><font color=#ff0000></font>&nbsp;</p>
<p><font color=#0000ff>- 버텍스 초기화 부분...</font></p>
<p><font color=#ff0000>HRESULT InitVB()<br></font>{<br>&nbsp;&nbsp;&nbsp;<font color=#008000> /// 정점버퍼 생성<br></font>&nbsp;&nbsp;&nbsp; if( FAILED( g_pd3dDevice-&gt;CreateVertexBuffer( 50*2*sizeof(CUSTOMVERTEX),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, D3DFVF_CUSTOMVERTEX,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D3DPOOL_DEFAULT, &amp;g_pVB, NULL ) ) )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return E_FAIL;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; CUSTOMVERTEX* pVertices;<br>&nbsp;&nbsp;&nbsp; if( FAILED( g_pVB-&gt;Lock( 0, 0, (void**)&amp;pVertices, 0 ) ) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return E_FAIL;<br>&nbsp;&nbsp;&nbsp; for( DWORD i=0; i&lt;50; i++ )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FLOAT theta = (2*D3DX_PI*i)/(50-1);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+0].position&nbsp;= D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+0].b[0]&nbsp;&nbsp;= 1.0f;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+0].b[1]&nbsp;&nbsp;= 0.0f;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+0].b[2]&nbsp;&nbsp;= 0.0f;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+0].index&nbsp;&nbsp;= 0x0000;&nbsp;&nbsp;&nbsp;<font color=#008000>/// 0번 가중치는 0번 행렬의 영향을 1.0만큼 받음<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+0].color&nbsp;&nbsp;= 0xffffffff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+0].tu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ((FLOAT)i)/(50-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+0].tv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1.0f;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+1].b[0]&nbsp;&nbsp;= 0.5f;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+1].b[1]&nbsp;&nbsp;= 0.5f;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+1].b[2]&nbsp;&nbsp;= 0.0f;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+1].index&nbsp;&nbsp;= 0x0001;&nbsp;<font color=#008000>&nbsp;&nbsp;/// 0번 가중치는 1번 행렬의 영향을 0.5만큼 받음<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+1].color&nbsp;&nbsp;&nbsp; = 0xff808080;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+1].tu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ((FLOAT)i)/(50-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pVertices[2*i+1].tv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0.0f;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; g_pVB-&gt;Unlock();</p>
<p><br>&nbsp;&nbsp;&nbsp; return S_OK;<br>}</p>
<p>&nbsp;</p>
<p><font color=#008000><font color=#ff0000>VOID Animate()</font><br></font>{<br>&nbsp;<font color=#008000>/// 0번 행렬은 단위행렬</font><br>&nbsp;D3DXMatrixIdentity( &amp;g_mat0 );</p>
<p>&nbsp;<font color=#008000>/// 0 ~ 2PI 까지(0~360도) 값을 변화시킴 Fixed Point기법 사용<br></font>&nbsp;DWORD d = GetTickCount() % ( (int)((D3DX_PI*2) * 1000) );<br><font color=#008000>&nbsp;/// Y축 회전행렬<br></font>&nbsp;&nbsp;&nbsp; D3DXMatrixRotationY( &amp;g_mat1, d / 1000.0f );<br>}</p>
<p>&nbsp;</p>
<p>렌더함수 전체..</p>
<p><font color=#ff0000>VOID Render()<br></font>{<br>&nbsp;D3DXMATRIXA16&nbsp;matWorld;</p>
<p>&nbsp;&nbsp;<font color=#008000>&nbsp; /// 후면버퍼와 Z버퍼 초기화<br></font>&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D3DCOLOR_XRGB(255,255,255), 1.0f, 0 );</p>
<p><font color=#008000>&nbsp;/// 애니메이션 행렬설정</font><br>&nbsp;Animate();<br>&nbsp;&nbsp;<font color=#008000>&nbsp; /// 렌더링 시작<br></font>&nbsp;&nbsp;&nbsp; if( SUCCEEDED( g_pd3dDevice-&gt;BeginScene() ) )<br>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;<font color=#008000>/// 0번 매트릭스 팔레트에 단위행렬<br></font>&nbsp;&nbsp;g_pd3dDevice-&gt;SetTransform( D3DTS_WORLDMATRIX(0), &amp;g_mat0 );<br>&nbsp;<font color=#008000>&nbsp;/// 1번 매트릭스 팔레트에 회전행렬<br></font>&nbsp;&nbsp;g_pd3dDevice-&gt;SetTransform( D3DTS_WORLDMATRIX(1), &amp;g_mat1 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;SetTexture( 0, g_pTexture );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;SetTextureStageState( 0, D3DTSS_COLOROP,&nbsp;&nbsp; D3DTOP_MODULATE );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;SetTextureStageState( 0, D3DTSS_ALPHAOP,&nbsp;&nbsp; D3DTOP_DISABLE );</p>
<p>&nbsp;&nbsp;DrawMesh();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<font color=#008000>&nbsp;&nbsp;&nbsp; /// 렌더링 종료<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;EndScene();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;<font color=#008000> /// 후면버퍼를 보이는 화면으로!<br></font>&nbsp;&nbsp;&nbsp; g_pd3dDevice-&gt;Present( NULL, NULL, NULL, NULL );<br>}</p>
<p>&nbsp;</p>
<p>&lt;&lt; 파일 설명 &gt;&gt;</p>
<p>08.KeyFrameAni.zip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp; 키프레임 애니메이션 예제소스 (책)</p>
<p>09.Skinning.zip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;스키닝 예제소스(책) </p>
<img src ="http://www.cppblog.com/cngamedev/aggbug/98082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-08 14:27 <a href="http://www.cppblog.com/cngamedev/articles/98082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CommitChanges()</title><link>http://www.cppblog.com/cngamedev/articles/98021.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Wed, 07 Oct 2009 06:34:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/98021.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/98021.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/98021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/98021.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/98021.html</trackback:ping><description><![CDATA[<br>
<p><span class=postbody>pdevice-&gt;setrenderstate(알파블렌드, true); <br><br>m_pEffect-&gt;SetTechnique( m_hTechnique ); <br><br>m_pEffect-&gt;Begin( NULL, 0 ); <br>m_pEffect-&gt;BeginPass( 0 ); <br><br><br>m_pEffect-&gt;SetTexture(tex, ptex); ///color텍스쳐 <br>m_pEffect-&gt;SetTexture(alphatex,pAtex);/// 알파텍스쳐 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------&nbsp; 1<br><font color=#d41a01></font></span></p>
<p><span class=postbody><font color=#d41a01>m_pEffect-&gt;CommitChanges();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --------------- 3</font></span></p>
<p><span class=postbody><font color=#d41a01></font>&nbsp;</p>
</span>
<p><span class=postbody>pDevice-&gt;renderprimitive(...); ///프리미티브 호출 <br></span><span class=postbody><br>m_pEffect-&gt;SetTexture(alphatex,pAtex_2);&nbsp; // 알파텍스쳐2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-------------- 2<br><br>m_pEffect-&gt;endpass(); <br>m_pEffect-&gt;end(); <br><br>pdevice-&gt;setrenderstate(알파블렌드, false); <br></span></p>
<p><span class=postbody></span>&nbsp;</p>
<p><span class=postbody>*&nbsp; 위에서&nbsp; 1 번에서 알파텍스쳐를 set한후에 프리미티브를 호출하는데&nbsp; 이때&nbsp;&nbsp; 3번을 안해주면</span></p>
<p><span class=postbody>&nbsp; 2번의 알파텍스쳐가 적용된다.</span></p>
<p><span class=postbody>&nbsp;&nbsp; BeginPass()와 EndPass() 사이에서 스테이트가 바뀌면 이펙트에 바로 적용되지 않고 <br>CommitChanges()를 불러줘야&nbsp; 제대로 된다.&nbsp; </span></p>
<img src ="http://www.cppblog.com/cngamedev/aggbug/98021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-07 14:34 <a href="http://www.cppblog.com/cngamedev/articles/98021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SetDialogBoxMode</title><link>http://www.cppblog.com/cngamedev/articles/97937.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Tue, 06 Oct 2009 06:01:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/97937.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/97937.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/97937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/97937.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/97937.html</trackback:ping><description><![CDATA[<p>DX9.0 으로 가면서 2D와 3D가 통합되어 버렸기 때문에</p>
<p>present 하나로 플립하기 때문에 풀스크린시 다이얼로그 띄우기가 가능하지 않았다.</p>
<p>그래서 존재하는것이..</p>
<p>&nbsp;</p>
<p><strong>IDirect3DDevice9::SetDialogBoxMode</strong> 라는 메소드.</p>
<p>&nbsp;</p>
<p><font color=#d41a01>바로 쓰면 되는것이 아니고</font>. 쓰기전 약간의 <strong>세팅</strong>이 필요하다.</p>
<p>&nbsp;</p>
<p>////////////////////////////////////////////////////////////////////////////////////</p>
<p>자료 출처 : 뽈따구님 홈피 <br>작 성 자 : 뽈따구님 </p>
<p><br>D3D디바이스를 생성할때 <br>D3DPRESENT_PARAMETERS 인자중에 몇가지를 셋팅. <br><font color=#d41a01>[1] SwapEffect = D3DSWAPEFFECT_DISCARD; <br>[2] BackBufferFormat = D3DFMT_X8R8G8B8; 또는 D3DFMT_X1R5G5B5, D3DFMT_R5G6B5 <br>[3] Flags&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |= D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; </font></p>
<p>&nbsp;</p>
<p>위에 옵션을 셋팅해서 디바이스를 생성한후에 <br><font color=#d41a01>D3DDevice-&gt;SetDialogBoxMode( TRUE );&nbsp; </font></p>
<img src ="http://www.cppblog.com/cngamedev/aggbug/97937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-06 14:01 <a href="http://www.cppblog.com/cngamedev/articles/97937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tessellation</title><link>http://www.cppblog.com/cngamedev/articles/97933.html</link><dc:creator>cngamedev</dc:creator><author>cngamedev</author><pubDate>Tue, 06 Oct 2009 04:45:00 GMT</pubDate><guid>http://www.cppblog.com/cngamedev/articles/97933.html</guid><wfw:comment>http://www.cppblog.com/cngamedev/comments/97933.html</wfw:comment><comments>http://www.cppblog.com/cngamedev/articles/97933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cngamedev/comments/commentRss/97933.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cngamedev/services/trackbacks/97933.html</trackback:ping><description><![CDATA[<a href="http://developer.amd.com/gpu/radeon/Tessellation/Pages/default.aspx#d3d9">http://developer.amd.com/gpu/radeon/Tessellation/Pages/default.aspx#d3d9</a><br><a href="http://www.cppblog.com/Files/cngamedev/TessellationTutorial-v1.16.zip">/Files/cngamedev/TessellationTutorial-v1.16.zip</a>
<img src ="http://www.cppblog.com/cngamedev/aggbug/97933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cngamedev/" target="_blank">cngamedev</a> 2009-10-06 12:45 <a href="http://www.cppblog.com/cngamedev/articles/97933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>