﻿<?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++博客-lucky420-随笔分类-图形学</title><link>http://www.cppblog.com/lucky420/category/1686.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 29 May 2008 16:56:11 GMT</lastBuildDate><pubDate>Thu, 29 May 2008 16:56:11 GMT</pubDate><ttl>60</ttl><item><title>在VS2005中，在项目编译时自动编译effect或shader</title><link>http://www.cppblog.com/lucky420/archive/2008/01/22/41639.html</link><dc:creator>随便写写</dc:creator><author>随便写写</author><pubDate>Tue, 22 Jan 2008 06:01:00 GMT</pubDate><guid>http://www.cppblog.com/lucky420/archive/2008/01/22/41639.html</guid><wfw:comment>http://www.cppblog.com/lucky420/comments/41639.html</wfw:comment><comments>http://www.cppblog.com/lucky420/archive/2008/01/22/41639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lucky420/comments/commentRss/41639.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lucky420/services/trackbacks/41639.html</trackback:ping><description><![CDATA[<p>在项目编译时对着色器源代码进行离线编译，可以在程序运行前确定着色器程序的正确性，也可以加快程序的加载速度。<br><br>1，将effect源代码文件添加到项目中，比如是 Basic.fx<br>2，在Solution Explorer中选择Basic.fx， 右键，选择"Properties",<br>3，在General页面中，选择Tool 为 &#8220;Custom Build Tool&#8221;<br>4，在Custom Build Step页面中，编辑Command Line为 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fxc /Tfx_2_0 /Fo$(OutDir)/$(SafeInputName).fxo $(InputFileName)<br>如果编写的是着色器而不是effect，则要注意在fxc命令中还要指定着色器的入口函数。fxc的具体用法参考SDK文档。&nbsp;&nbsp;&nbsp;<br>5，编辑Outputs为<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(OutDir)/$(SafeInputName).fxo<br>6，编译项目，这时IDE会对Basic.fx进行编译，如同C++的编译一样，编译的结果也会在IDE的output窗口打印出来。<br><br></p>
<img src ="http://www.cppblog.com/lucky420/aggbug/41639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lucky420/" target="_blank">随便写写</a> 2008-01-22 14:01 <a href="http://www.cppblog.com/lucky420/archive/2008/01/22/41639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Bump Mapping的实现</title><link>http://www.cppblog.com/lucky420/archive/2007/12/31/40038.html</link><dc:creator>随便写写</dc:creator><author>随便写写</author><pubDate>Mon, 31 Dec 2007 02:06:00 GMT</pubDate><guid>http://www.cppblog.com/lucky420/archive/2007/12/31/40038.html</guid><wfw:comment>http://www.cppblog.com/lucky420/comments/40038.html</wfw:comment><comments>http://www.cppblog.com/lucky420/archive/2007/12/31/40038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lucky420/comments/commentRss/40038.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lucky420/services/trackbacks/40038.html</trackback:ping><description><![CDATA[<p>//vertex shader:<br><br>float3 fvLightPosition;<br>float3 fvEyePosition;<br>float4x4 matView;<br>float4x4 matViewProjection;</p>
<p>struct VS_INPUT <br>{<br>&nbsp;&nbsp; float4 Position : POSITION0;<br>&nbsp;&nbsp; float2 Texcoord : TEXCOORD0;<br>&nbsp;&nbsp; float3 Normal :&nbsp;&nbsp; NORMAL0;//通常只需要两个向量，因为另一个可以叉乘得到<br>&nbsp;&nbsp; float3 Binormal : BINORMAL0;<br>&nbsp;&nbsp; float3 Tangent :&nbsp; TANGENT0;<br>&nbsp;&nbsp; <br>};</p>
<p>struct VS_OUTPUT <br>{<br>&nbsp;&nbsp; float4 Position :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POSITION0;<br>&nbsp;&nbsp; float2 Texcoord :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TEXCOORD0;<br>&nbsp;&nbsp; float3 ViewDirection :&nbsp;&nbsp; TEXCOORD1;<br>&nbsp;&nbsp; float3 LightDirection:&nbsp;&nbsp; TEXCOORD2;<br>&nbsp;&nbsp; <br>};</p>
<p>VS_OUTPUT vs_main( VS_INPUT Input )<br>{<br>&nbsp;&nbsp; VS_OUTPUT Output;</p>
<p>&nbsp;&nbsp; Output.Position&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = mul( Input.Position, matViewProjection );<br>&nbsp;&nbsp; Output.Texcoord&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = Input.Texcoord;<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; float3 fvObjectPosition = mul( Input.Position, matView );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; float3 fvViewDirection&nbsp; = fvEyePosition - fvObjectPosition;<br>&nbsp;&nbsp; float3 fvLightDirection = fvLightPosition - fvObjectPosition;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; float3 fvNormal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = mul( Input.Normal, matView );<br>&nbsp;&nbsp; float3 fvTangent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = mul( Input.Tangent, matView );<br>&nbsp;&nbsp; float3 fvBinormal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = mul( Input.Binormal, matView );//通常输入只需要nornal和tangent，binormal可以由两者叉乘得到<br>&nbsp;&nbsp; //fvBinormal = cross( fvNormal, fvTangent );<br>&nbsp;&nbsp;<br>//将视方向和光线方向都转换到法线空间（或者称切线空间）&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; Output.ViewDirection.x&nbsp; = dot( fvTangent, fvViewDirection );<br>&nbsp;&nbsp; Output.ViewDirection.y&nbsp; = dot( fvBinormal, fvViewDirection );<br>&nbsp;&nbsp; Output.ViewDirection.z&nbsp; = dot( fvNormal, fvViewDirection );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; Output.LightDirection.x&nbsp; = dot( fvTangent, fvLightDirection );<br>&nbsp;&nbsp; Output.LightDirection.y&nbsp; = dot( fvBinormal, fvLightDirection );<br>&nbsp;&nbsp; Output.LightDirection.z&nbsp; = dot( fvNormal, fvLightDirection );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; return( Output );<br>&nbsp;&nbsp; <br>}<br><br>//Pixel Shader<br><br>float4 fvAmbient;<br>float4 fvSpecular;<br>float4 fvDiffuse;<br>float fSpecularPower;</p>
<p>sampler2D baseMap;<br>sampler2D bumpMap;</p>
<p>struct PS_INPUT <br>{<br>&nbsp;&nbsp; float2 Texcoord :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TEXCOORD0;<br>&nbsp;&nbsp; float3 ViewDirection :&nbsp;&nbsp; TEXCOORD1;<br>&nbsp;&nbsp; float3 LightDirection:&nbsp;&nbsp; TEXCOORD2;<br>&nbsp;&nbsp; <br>};</p>
<p>float4 ps_main( PS_INPUT Input ) : COLOR0<br>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; float3 fvLightDirection = normalize( Input.LightDirection );<br>&nbsp;&nbsp; float3 fvNormal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = normalize( ( tex2D( bumpMap, Input.Texcoord ).xyz * 2.0f ) - 1.0f );<br>&nbsp;&nbsp; float&nbsp; fNDotL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = dot( fvNormal, fvLightDirection ); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; float3 fvReflection&nbsp;&nbsp;&nbsp;&nbsp; = normalize( ( ( 2.0f * fvNormal ) * ( fNDotL ) ) - fvLightDirection ); <br>&nbsp;&nbsp; float3 fvViewDirection&nbsp; = normalize( Input.ViewDirection );<br>&nbsp;&nbsp; float&nbsp; fRDotV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = max( 0.0f, dot( fvReflection, fvViewDirection ) );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; float4 fvBaseColor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = tex2D( baseMap, Input.Texcoord );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; float4 fvTotalAmbient&nbsp;&nbsp; = fvAmbient * fvBaseColor; <br>&nbsp;&nbsp; float4 fvTotalDiffuse&nbsp;&nbsp; = fvDiffuse * fNDotL * fvBaseColor; <br>&nbsp;&nbsp; float4 fvTotalSpecular&nbsp; = fvSpecular * pow( fRDotV, fSpecularPower );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; return( saturate( fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular ) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}</p>
<p>&nbsp;</p>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/lucky420/aggbug/40038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lucky420/" target="_blank">随便写写</a> 2007-12-31 10:06 <a href="http://www.cppblog.com/lucky420/archive/2007/12/31/40038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>副法线和正切是什么?</title><link>http://www.cppblog.com/lucky420/archive/2007/06/11/18184.html</link><dc:creator>随便写写</dc:creator><author>随便写写</author><pubDate>Mon, 11 Jun 2007 08:09:00 GMT</pubDate><guid>http://www.cppblog.com/lucky420/archive/2007/06/11/18184.html</guid><wfw:comment>http://www.cppblog.com/lucky420/comments/18184.html</wfw:comment><comments>http://www.cppblog.com/lucky420/archive/2007/06/11/18184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lucky420/comments/commentRss/18184.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lucky420/services/trackbacks/18184.html</trackback:ping><description><![CDATA[法线，切线和副法线构成了所谓的切线空间（tangnet space），在Bump Mapping中，法线纹理中存储的法线值就是在切线空间内的。<br><br>从网上找了一段求切线和副法线的代码.<br>根据三个顶点的位置坐标和纹理坐标求面的副法线和正切<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">let&nbsp;P&nbsp;=&nbsp;v1&nbsp;-&nbsp;v0</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">D3DXVECTOR3&nbsp;P&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v1.pos&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;v0.pos;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">let&nbsp;Q&nbsp;=&nbsp;v2&nbsp;-&nbsp;v0</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">D3DXVECTOR3&nbsp;Q&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v2.pos&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;v0.pos;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;s1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v1.s&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;v0.s;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;t1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v1.t&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;v0.t;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;s2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v2.s&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;v0.s;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;t2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v2.t&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;v0.t;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">we&nbsp;need&nbsp;to&nbsp;solve&nbsp;the&nbsp;equation<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;P&nbsp;=&nbsp;s1*T&nbsp;+&nbsp;t1*B<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Q&nbsp;=&nbsp;s2*T&nbsp;+&nbsp;t2*B<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;for&nbsp;T&nbsp;and&nbsp;B<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">this&nbsp;is&nbsp;a&nbsp;linear&nbsp;system&nbsp;with&nbsp;six&nbsp;unknowns&nbsp;and&nbsp;six&nbsp;equatinos,&nbsp;for&nbsp;TxTyTz&nbsp;BxByBz<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">[px,py,pz]&nbsp;=&nbsp;[s1,t1]&nbsp;*&nbsp;[Tx,Ty,Tz]<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;qx,qy,qz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s2,t2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bx,By,Bz<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">multiplying&nbsp;both&nbsp;sides&nbsp;by&nbsp;the&nbsp;inverse&nbsp;of&nbsp;the&nbsp;s,t&nbsp;matrix&nbsp;gives<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">[Tx,Ty,Tz]&nbsp;=&nbsp;1/(s1t2-s2t1)&nbsp;*&nbsp;&nbsp;[t2,-t1]&nbsp;*&nbsp;[px,py,pz]<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Bx,By,Bz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-s2,s1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qx,qy,qz&nbsp;&nbsp;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">solve&nbsp;this&nbsp;for&nbsp;the&nbsp;unormalized&nbsp;T&nbsp;and&nbsp;B&nbsp;to&nbsp;get&nbsp;from&nbsp;tangent&nbsp;to&nbsp;object&nbsp;space</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;tmp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(fabsf(s1</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">t2&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;s2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">t1)&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.0001f</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img id=Codehighlighter1_747_765_Open_Image onclick="this.style.display='none'; Codehighlighter1_747_765_Open_Text.style.display='none'; Codehighlighter1_747_765_Closed_Image.style.display='inline'; Codehighlighter1_747_765_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_747_765_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_747_765_Closed_Text.style.display='none'; Codehighlighter1_747_765_Open_Image.style.display='inline'; Codehighlighter1_747_765_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_747_765_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_747_765_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img id=Codehighlighter1_772_807_Open_Image onclick="this.style.display='none'; Codehighlighter1_772_807_Open_Text.style.display='none'; Codehighlighter1_772_807_Closed_Image.style.display='inline'; Codehighlighter1_772_807_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_772_807_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_772_807_Closed_Text.style.display='none'; Codehighlighter1_772_807_Open_Image.style.display='inline'; Codehighlighter1_772_807_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_772_807_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_772_807_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">(s1</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">t2&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;s2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">t1&nbsp;);<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>tangent.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(t2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">P.x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;t1</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Q.x);<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>tangent.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(t2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">P.y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;t1</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Q.y);<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>tangent.z&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(t2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">P.z&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;t1</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Q.z);<br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>tangent&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tmp&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;tangent;<br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>binormal.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(s1</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Q.x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;s2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">P.x);<br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>binormal.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(s1</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Q.y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;s2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">P.y);<br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>binormal.z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(s1</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Q.z&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;s2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">P.z);<br></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>binormal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tmp&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;binormal;</span></div>
<br>根据Maya里面的资料写了一个求取tangent的函数，输入为3个顶点的位置，法线和纹理坐标，输出是切线值，副法线可以由切线和法线叉乘得到。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">inline&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;floatEqual(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;a,&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;b)<br><img id=Codehighlighter1_41_72_Open_Image onclick="this.style.display='none'; Codehighlighter1_41_72_Open_Text.style.display='none'; Codehighlighter1_41_72_Closed_Image.style.display='inline'; Codehighlighter1_41_72_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_41_72_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_41_72_Closed_Text.style.display='none'; Codehighlighter1_41_72_Open_Image.style.display='inline'; Codehighlighter1_41_72_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_41_72_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_41_72_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;abs(a</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">b)&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.00001f</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>HRESULT&nbsp;ComputerTangent(D3DXVECTOR3&nbsp;position[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">],&nbsp;D3DXVECTOR3&nbsp;normal[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">],&nbsp;D3DXVECTOR2&nbsp;texcoord[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">],D3DXVECTOR3&nbsp;oTangent[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">])<br><img id=Codehighlighter1_196_2703_Open_Image onclick="this.style.display='none'; Codehighlighter1_196_2703_Open_Text.style.display='none'; Codehighlighter1_196_2703_Closed_Image.style.display='inline'; Codehighlighter1_196_2703_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_196_2703_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_196_2703_Closed_Text.style.display='none'; Codehighlighter1_196_2703_Open_Image.style.display='inline'; Codehighlighter1_196_2703_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_196_2703_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_196_2703_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXVECTOR3&nbsp;edge1;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXVECTOR3&nbsp;edge2;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXVECTOR3&nbsp;crossP;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">==============================================<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;x,&nbsp;s,&nbsp;t<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;S&nbsp;&amp;&nbsp;T&nbsp;vectors&nbsp;get&nbsp;used&nbsp;several&nbsp;times&nbsp;in&nbsp;this&nbsp;vector,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;but&nbsp;are&nbsp;only&nbsp;computed&nbsp;once.<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">==============================================</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;edge1.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;edge1.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].x;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;s-vector&nbsp;-&nbsp;don't&nbsp;need&nbsp;to&nbsp;compute&nbsp;this&nbsp;multiple&nbsp;times</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;edge1.z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].y;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;t-vector</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;edge2.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;edge2.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].x;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;another&nbsp;s-vector</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;edge2.z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].y;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;another&nbsp;t-vector</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXVec3Cross(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">crossP,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">edge1,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">edge2);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXVec3Normalize(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">crossP,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">crossP);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;degnerateUVTangentPlane&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;floatEqual(crossP.x,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(degnerateUVTangentPlane)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crossP.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;tanX&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">crossP.y&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;crossP.x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oTangent[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tanX;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oTangent[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tanX;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oTangent[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tanX;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">--------------------------------------------------------<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;y,&nbsp;s,&nbsp;t<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">--------------------------------------------------------</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;edge1.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].y;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;edge2.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].y;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;edge2.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].x;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;another&nbsp;s-vector</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;edge2.z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].y;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;another&nbsp;t-vector</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXVec3Cross(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">crossP,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">edge1,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">edge2);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXVec3Normalize(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">crossP,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">crossP);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;degnerateUVTangentPlane&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;floatEqual(crossP.x,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(degnerateUVTangentPlane)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crossP.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;tanY&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">crossP.y&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;crossP.x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oTangent[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tanY;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oTangent[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tanY;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oTangent[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tanY;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">------------------------------------------------------<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;z,&nbsp;s,&nbsp;t<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">------------------------------------------------------</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;edge1.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].z&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].z;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;edge2.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].z&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;position[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].z;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;edge2.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].x;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;another&nbsp;s-vector</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;edge2.z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;texcoord[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].y;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;another&nbsp;t-vector</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXVec3Cross(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">crossP,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">edge1,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">edge2);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DXVec3Normalize(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">crossP,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">crossP);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;degnerateUVTangentPlane&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;floatEqual(crossP.x,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(degnerateUVTangentPlane)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crossP.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;tanZ&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">crossP.y&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;crossP.x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oTangent[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tanZ;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oTangent[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tanZ;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oTangent[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">].z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tanZ;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">------------------------------------------------------</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_2484_2686_Open_Image onclick="this.style.display='none'; Codehighlighter1_2484_2686_Open_Text.style.display='none'; Codehighlighter1_2484_2686_Closed_Image.style.display='inline'; Codehighlighter1_2484_2686_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2484_2686_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2484_2686_Closed_Text.style.display='none'; Codehighlighter1_2484_2686_Open_Image.style.display='inline'; Codehighlighter1_2484_2686_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2484_2686_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_2484_2686_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Ortho-normalize&nbsp;to&nbsp;normal</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;dot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;D3DXVec3Dot(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">oTangent[i],</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">normal[i]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oTangent[i]&nbsp;</span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000">&nbsp;normal[i]&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;dot;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Normalize&nbsp;tangents</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D3DXVec3Normalize(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">oTangent[i],</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">oTangent[i]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;S_OK;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>
<img src ="http://www.cppblog.com/lucky420/aggbug/18184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lucky420/" target="_blank">随便写写</a> 2007-06-11 16:09 <a href="http://www.cppblog.com/lucky420/archive/2007/06/11/18184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>