﻿<?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/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 02:42:32 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 02:42:32 GMT</pubDate><ttl>60</ttl><item><title>DirectX11 的新特性</title><link>http://www.cppblog.com/lucky420/archive/2008/12/18/DiretX.html</link><dc:creator>随便写写</dc:creator><author>随便写写</author><pubDate>Thu, 18 Dec 2008 14:52:00 GMT</pubDate><guid>http://www.cppblog.com/lucky420/archive/2008/12/18/DiretX.html</guid><wfw:comment>http://www.cppblog.com/lucky420/comments/69776.html</wfw:comment><comments>http://www.cppblog.com/lucky420/archive/2008/12/18/DiretX.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lucky420/comments/commentRss/69776.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lucky420/services/trackbacks/69776.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: DitectX11&nbsp;&nbsp;<a href='http://www.cppblog.com/lucky420/archive/2008/12/18/DiretX.html'>阅读全文</a><img src ="http://www.cppblog.com/lucky420/aggbug/69776.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-12-18 22:52 <a href="http://www.cppblog.com/lucky420/archive/2008/12/18/DiretX.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>让VS2005编辑器支持着色器语法高亮</title><link>http://www.cppblog.com/lucky420/archive/2008/01/22/41635.html</link><dc:creator>随便写写</dc:creator><author>随便写写</author><pubDate>Tue, 22 Jan 2008 05:22:00 GMT</pubDate><guid>http://www.cppblog.com/lucky420/archive/2008/01/22/41635.html</guid><wfw:comment>http://www.cppblog.com/lucky420/comments/41635.html</wfw:comment><comments>http://www.cppblog.com/lucky420/archive/2008/01/22/41635.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lucky420/comments/commentRss/41635.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lucky420/services/trackbacks/41635.html</trackback:ping><description><![CDATA[1. 创建或编辑usertype.dat文件（此文件在VS安装目录下的Common7\IDE下面，比如我的就在D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\usertype.dat），添加如下的关键字列表，每个单词占一行，如果你想添加你自己的关键字，也可以按照这种方式添加在usertype.dat文件中<br>2. 在vs中打开Tools-&gt;Options...-&gt;TextEditor-&gt;File Extension<br>填写你想使用的着色器文件扩展名，如fx, hlsl, vs, ps等等，然后Editor选择Microsoft Visual C++<br>3. 重新启动VS2005<br><br>关键字列表：<br><br><font size=2>
<p>__global__</p>
<p>__host__</p>
<p>__device__</p>
<p>__constant__</p>
<p>__shared__</p>
<p>gridDim</p>
<p>blockIdx</p>
<p>blockDim</p>
<p>threadIdx</p>
<p>int1</p>
<p>uint1</p>
<p>int2</p>
<p>uint2</p>
<p>int3</p>
<p>uint3</p>
<p>int4</p>
<p>uint4</p>
<p>float1</p>
<p>float2</p>
<p>float3</p>
<p>float4</p>
<p>char1</p>
<p>char2</p>
<p>char3</p>
<p>char4</p>
<p>uchar1</p>
<p>uchar2</p>
<p>uchar3</p>
<p>uchar4</p>
<p>short1</p>
<p>short2</p>
<p>short3</p>
<p>short4</p>
<p>dim1</p>
<p>dim2</p>
<p>dim3</p>
<p>dim4</p>
<p>min</p>
<p>umin</p>
<p>fminf</p>
<p>fmin</p>
<p>max</p>
<p>umax</p>
<p>fmaxf</p>
<p>fmax</p>
<p>abs</p>
<p>fabsf</p>
<p>fabs</p>
<p>sinf</p>
<p>sin</p>
<p>cosf</p>
<p>cos</p>
<p>sqrtf</p>
<p>sqrt</p>
<p>expf</p>
<p>exp</p>
<p>logf</p>
<p>log</p>
<p>int2float</p>
<p>float2int</p>
<p>asm</p>
<p>asm_fragment </p>
<p>BINORMAL</p>
<p>BLENDINDICES0</p>
<p>BLENDWEIGHT0</p>
<p>bool </p>
<p>COLOR0</p>
<p>COLOR1</p>
<p>COLOR2</p>
<p>COLOR3</p>
<p>column_major </p>
<p>compile </p>
<p>compile_fragment </p>
<p>const </p>
<p>discard </p>
<p>decl1 </p>
<p>do </p>
<p>double </p>
<p>else </p>
<p>extern </p>
<p>false </p>
<p>float </p>
<p>float2</p>
<p>float3</p>
<p>float3x3</p>
<p>float3x4</p>
<p>float4</p>
<p>float4x4</p>
<p>float4x3</p>
<p>for </p>
<p>half </p>
<p>half2</p>
<p>half3</p>
<p>half4</p>
<p>if </p>
<p>in </p>
<p>inline </p>
<p>inout </p>
<p>int </p>
<p>int2</p>
<p>int3</p>
<p>int4</p>
<p>matrix </p>
<p>out </p>
<p>pass1 </p>
<p>pixelfragment </p>
<p>return </p>
<p>register </p>
<p>row_major </p>
<p>sampler </p>
<p>sampler1D </p>
<p>sampler2D </p>
<p>sampler3D </p>
<p>samplerCUBE </p>
<p>sampler_state </p>
<p>shared </p>
<p>stateblock </p>
<p>stateblock_state </p>
<p>static </p>
<p>string </p>
<p>struct </p>
<p>TANGENT</p>
<p>technique </p>
<p>texture </p>
<p>texture1D </p>
<p>texture2D </p>
<p>texture3D </p>
<p>textureCUBE </p>
<p>TEXCOORD0</p>
<p>TEXCOORD1</p>
<p>TEXCOORD2</p>
<p>TEXCOORD3</p>
<p>TEXCOORD4</p>
<p>TEXCOORD5</p>
<p>TEXCOORD6</p>
<p>TEXCOORD7</p>
<p>true </p>
<p>typedef </p>
<p>uniform </p>
<p>vector </p>
<p>vertexfragment </p>
<p>void </p>
<p>volatile </p>
<p>VPOS</p>
<p>while</p>
</font>
<img src ="http://www.cppblog.com/lucky420/aggbug/41635.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 13:22 <a href="http://www.cppblog.com/lucky420/archive/2008/01/22/41635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>引用：计算机语言妙语录</title><link>http://www.cppblog.com/lucky420/archive/2008/01/03/40321.html</link><dc:creator>随便写写</dc:creator><author>随便写写</author><pubDate>Thu, 03 Jan 2008 07:11:00 GMT</pubDate><guid>http://www.cppblog.com/lucky420/archive/2008/01/03/40321.html</guid><wfw:comment>http://www.cppblog.com/lucky420/comments/40321.html</wfw:comment><comments>http://www.cppblog.com/lucky420/archive/2008/01/03/40321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lucky420/comments/commentRss/40321.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lucky420/services/trackbacks/40321.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 12pt">应当知道，任何一位受过职业道德训练的软件工程师都不会同意写一个&#8220;摧毁巴格达&nbsp; DestroyBaghdad&#8221;这样的函数。相反，基本的职业道德要求他写一个&#8220;摧毁城市 DestroyCity&#8221;的函数，&#8220;巴格达 Baghdad&#8221;是一个参数。(Nathaniel S Borenstein)<br><br>只有两种计算机语言：一些语言天天挨骂，另外一些没有人用。(Bjarne Stroustrup)<br><br>数组下标应该从0开始还是从1开始？我的提议是做个折中，用0.5。我想，把它否决之前他们都没有仔细考虑考虑。(Stan Kelly-Bootle)<br><br>黑魔法编程：程序员们知道有些事情没有用，但是无论如何他们还是会去试一试，有时候这些事情还真管用了，比如说把所有东西重新编译一遍。(Karl Lehenbauer)<br><br>计算机语言就好像在公园里漫步一样，我指的是侏罗纪公园。(Larry Wall)<br><br>即使在餐巾上涂画也算是计算机语言，XML都不能算是其中之一。(Charles Simonyi)<br><br>使用TSO就想把死鲸鱼在沙滩上踢来踢去一样。(Stephen C Johnson)<br><br>面向对象的模型使得我们可以用聚少成多的方法来写程序。这通常是说，它提供了一种用结构化的方法写出烂面条般程序的方法。<br><br><span style="COLOR: red">重用别人写的程序就像从别人的故事里面挑出句子然后凑成一篇杂志上的文章。 (Bob Frankston)</span><br><br>（HTML里面的BLINK 标签）是一个玩笑，好不好？要是我们知道还有人使用它，我们就不会写它了。(Mark Andreessen)<br><br>软件就像性一样。不要钱的时候更好。(Linus Torvalds)<br><br>我有一个可以运行的编译器，没人愿意碰它。他们告诉我电脑只能做算术。--Rear Admiral Grace Hopper<br><br>如果你思虑不周，你可能会认为编程仅仅是敲入一行行的程序语句而已 -- Ward Cunningham<br><br>一种未包含所有东西的语言实际上比那些包含了的更容易使用。 -- Dennis M Ritchie<br><br>提倡自然语言编程的那些工作必然彻底失败。 -- Edsger Dijkstra<br><br>指针就像跳转一样，疯狂的从数据结构之间到处指来指去。在高级语言里面引入指针是个退步。我们可能永远无法从这一失败之中恢复过来。-- Charles Hoare<br><br>首先学习计算机科学和那些理论，然后摸索出你自己的编程风格，然后把那些都忘掉，乱来就行了。 -- George Carrette<br><br>我担心新的面向对象系统会遭到LISP相似的命运。他们可以做很多事情，但是过于复杂的类的阶层的重量会把他们压塌。 -- Bill Joy<br><br>如果我们要数代码的行数，我们不该把他们当成生产出来的行数，而是花费掉的行数。--Edsger Dijkstra<br><br>你可以拥有高质量的软件，也可以拥有指针运算，但两者不可兼得。-- Bertrand Meyer<br><br>语法，小伙子。它已经被重新授予共和国里最高的地位。 -- John Steinbeck<br><br>你真的确定无误的认为，那些铃铛和汽笛，所谓的编程语言里那些美妙的特性，是解决方案的一部分而不是问题的一部分? -- Edsger Dijkstra<br><br>汝切不可跟随NULL指针前行，因混沌狂乱待汝于彼端。（注：此处模仿圣经十诫语气）--Henry Spencer<br><br>我觉得传统语言是给鸟类使用的。他们仅仅是冯诺依曼计算机的延伸，他们把鼻子埋藏在字和地址的泥土之中，还做了很多同样傻的事。我们从编程之中学到了这些傻事，又把他们放进了计算机语言，放进了Fortran，放进了PL/1，放进了几乎所有语言之中。--John Backus<br><br>在人类的阶层之中，写代码处在高于盗墓，但是低于管理的某处。(Gerald Weinberg)<br><br>如果程序员模拟一个结构比编译器实现这个结构还快，那这个编译器写的可够烂的。 (Guy Steele)<br><br>阶级（class)斗争，一些阶级胜利了，一些阶级消灭了。(Mao Zedong)<br><br>类,可以分为三种：一种不工作的，一种出错的，还有一种找不到了的。(Russell Baker)<br><br>内存就像高潮，真的比虚拟的好得多。(Seymour Cray)<br></span>
<img src ="http://www.cppblog.com/lucky420/aggbug/40321.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-03 15:11 <a href="http://www.cppblog.com/lucky420/archive/2008/01/03/40321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浮点数计算中的精度问题</title><link>http://www.cppblog.com/lucky420/archive/2008/01/03/40318.html</link><dc:creator>随便写写</dc:creator><author>随便写写</author><pubDate>Thu, 03 Jan 2008 07:01:00 GMT</pubDate><guid>http://www.cppblog.com/lucky420/archive/2008/01/03/40318.html</guid><wfw:comment>http://www.cppblog.com/lucky420/comments/40318.html</wfw:comment><comments>http://www.cppblog.com/lucky420/archive/2008/01/03/40318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lucky420/comments/commentRss/40318.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lucky420/services/trackbacks/40318.html</trackback:ping><description><![CDATA[<p>猜测下面的代码的输出是什么<br></p>
<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">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</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></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_31_145_Open_Image onclick="this.style.display='none'; Codehighlighter1_31_145_Open_Text.style.display='none'; Codehighlighter1_31_145_Closed_Image.style.display='inline'; Codehighlighter1_31_145_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_31_145_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_145_Closed_Text.style.display='none'; Codehighlighter1_31_145_Open_Image.style.display='inline'; Codehighlighter1_31_145_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_31_145_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_31_145_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">double</span><span style="COLOR: #000000">&nbsp;x,&nbsp;y,&nbsp;z;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;sum;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1e20f</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1e20f</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10.0f</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;x&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;z&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;y;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sum=%f\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,sum);<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></span></div>
<br>在VS2005下测试，结果是<br>sum=0.000000<br>而如果调换一下连加计算式中z和y的位置则结果为<br>sum=10.000000<br><br>可以得出两点：<br>1 浮点数预算会有精度损失，大数会掩盖小数，所以当进行多个浮点数求和时，应该从小到大相加。<br>2 多个数连加，操作顺序是从左至右进行的。
<img src ="http://www.cppblog.com/lucky420/aggbug/40318.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-03 15:01 <a href="http://www.cppblog.com/lucky420/archive/2008/01/03/40318.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>Kick off</title><link>http://www.cppblog.com/lucky420/archive/2007/09/25/32851.html</link><dc:creator>随便写写</dc:creator><author>随便写写</author><pubDate>Tue, 25 Sep 2007 10:02:00 GMT</pubDate><guid>http://www.cppblog.com/lucky420/archive/2007/09/25/32851.html</guid><wfw:comment>http://www.cppblog.com/lucky420/comments/32851.html</wfw:comment><comments>http://www.cppblog.com/lucky420/archive/2007/09/25/32851.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/lucky420/comments/commentRss/32851.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lucky420/services/trackbacks/32851.html</trackback:ping><description><![CDATA[今天发生了一起由语言问题引起的误解，虽然只是小事，但到最后觉得还是挺有意思的。<br><br>早上来公司例行检查邮件，发现下午有个小型会议，议题之一是&#8220;- Kick off Wang Lei's start on the project&#8221;。我对这个&#8220;Kick off&#8221;的直觉的理解就是&#8220;踢掉&#8221;，难道Nicolas觉得我在这个时候参与这个项目是不合适的？我还特别去征询了我的主管Jurgen的意见，但他好像不理解我为什么会这样想。会议上也没有发生我预想的&#8220;Kick off&#8221;事件，让我更觉得奇怪。结束后回到办公室，查了一下英文辞典才弄明白，&#8220;Kick off&#8221;是表示&#8220;开始&#8221;，而&#8220;Kick out&#8221;才是开除的意思。幸好没因为这个造成大的问题，不然真是糗大了。 
<img src ="http://www.cppblog.com/lucky420/aggbug/32851.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-09-25 18:02 <a href="http://www.cppblog.com/lucky420/archive/2007/09/25/32851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>看文档，学英语</title><link>http://www.cppblog.com/lucky420/archive/2007/06/13/26232.html</link><dc:creator>随便写写</dc:creator><author>随便写写</author><pubDate>Wed, 13 Jun 2007 02:52:00 GMT</pubDate><guid>http://www.cppblog.com/lucky420/archive/2007/06/13/26232.html</guid><wfw:comment>http://www.cppblog.com/lucky420/comments/26232.html</wfw:comment><comments>http://www.cppblog.com/lucky420/archive/2007/06/13/26232.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lucky420/comments/commentRss/26232.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lucky420/services/trackbacks/26232.html</trackback:ping><description><![CDATA[<p>早上Jurgen给了我一篇打印的文章《software and the Concurrency Revolution》，内容暂时不去说他，从中学到几个地道的英文短语:<br>the elephant in the room : 形容大家都知道无法回避，但又都不想去面对的问题&nbsp;<br>sea change : 形容巨大的、有深远影响的变换&nbsp;<br><br>顺带发现一两个在线的专业英语词汇网站：<br><a href="http://www.worldwidewords.org/indexes/search.htm">http://www.worldwidewords.org/indexes/search.htm</a><br><a href="http://www.phrases.org.uk/index.html">http://www.phrases.org.uk/index.html</a></p>
<img src ="http://www.cppblog.com/lucky420/aggbug/26232.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-13 10:52 <a href="http://www.cppblog.com/lucky420/archive/2007/06/13/26232.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><item><title>性能优化：（From D3D9 SDK）</title><link>http://www.cppblog.com/lucky420/archive/2007/06/04/25454.html</link><dc:creator>随便写写</dc:creator><author>随便写写</author><pubDate>Mon, 04 Jun 2007 04:57:00 GMT</pubDate><guid>http://www.cppblog.com/lucky420/archive/2007/06/04/25454.html</guid><wfw:comment>http://www.cppblog.com/lucky420/comments/25454.html</wfw:comment><comments>http://www.cppblog.com/lucky420/archive/2007/06/04/25454.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lucky420/comments/commentRss/25454.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lucky420/services/trackbacks/25454.html</trackback:ping><description><![CDATA[<strong>常规技巧<br><br></strong>1 只在必须的时候Clear。<br>&nbsp;&nbsp;&nbsp;IDirect3DDevice9::Clear函数通常需要花费较多的时间，因此要尽量少调用，而且只清空的确需要清空的缓存。<br><br>2 尽量减少状态切换。并且将需要进行的状态切换组合在一起设置。<br>&nbsp;&nbsp;&nbsp;状态包括RenderState，SamplerState，TextureStageState等<br><br>3 纹理尺寸尽可能小<br><br>4 从前至后渲染场景中的对象<br>&nbsp;&nbsp;&nbsp;从前至后渲染可以尽可能早地精选出不需要绘制的对象和象素<br><br>5 使用三角条带代替三角列表和三角扇。为了能更有效利用顶点高速缓存（cache），在排列条带时因考虑尽快重用顶点。<br><br>6&nbsp;&nbsp;根所需要据消耗的系统资源来逐步减少特效。<br><br>7 经常性地检测程序的性能。<br>&nbsp;&nbsp;&nbsp;这样可以更容易发现引起性能突变的部分<br><br>8 最小化顶点缓存的切换<br><br>9 尽可能使用静态顶点缓存<br><br>10 对静态对象，对每种FVF使用一个大的静态顶点缓存来保存多个对象的顶点数据，而不是每个对象使用一个顶点缓存。<br>&nbsp;&nbsp;&nbsp;其目的也是减少顶点缓存的切换<br><br>11 如果程序需要随机访问AGP内存中的顶点缓存，顶点格式的大小最好是32bytes的倍数。否则，选择合适的最小的格式。<br>32bytes 也就是8个float数据或2个vector4。<br><br>12 使用顶点索引方式渲染，这样可以更有效利用顶点高速缓存。<br><br>13 如果深度缓存格式中包含有模版缓存，总是将两者一起Clear。<br><br>14 将计算结果和输出的shader指令合并：<br>// Rather than doing a multiply and add, and then output the data with <br>//&nbsp;&nbsp; two instructions:<br>mad r2, r1, v0, c0<br>mov oD0, r2<br><br>// Combine both in a single instruction, because this eliminates an&nbsp; <br>//&nbsp;&nbsp; additional register copy.<br>mad oD0, r1, v0, c0 <br><br>建立一个场景对象的数据库，首先使用最低精度的模型，在保证性能的前提下逐步使用更高精度的模型。密切关注渲染的总的三角面数。<br><br>将使用相同渲染状态和贴图的图元集中在一起绘制，这样能尽量减少顶点缓存和状态的切换。并且将状态切换操作集中成一组设置。<br><br>尽量减少光源数量，使用环境光来提高亮度。方向光源比点光源和聚光灯更高效，因为光的方向是固定的。使用光照范围参数来剔除不受光照影响的物体。镜面高光几乎使光照计算量加倍，因此只在需要时使用，将D3DRS_SPECULARENABLE设为FALSE，将材质的specular power 设为0，将材质的specular color 设为0。<br><br>尽量减小纹理尺寸，这样可以增加纹理被缓存的可能性。尽量减少纹理的切换，将使用同一纹理的对象集中绘制。尽量使用正方形纹理。最快的纹理是256&#215;256，将4张128&#215;128的纹理拼接成256&#215;256使用。<br><br>连接World-View Matrix， 将ViewMatrix设为Identity减少矩阵乘法运算。<br><br>动态纹理。首先要检查D3DCAPS2_DYNAMICTEXTURES来判断硬件是否支持。<br>其二，动态纹理不能放在MANAGED pool中。动态纹理总是能锁定，甚至是在D3DPOOL_DEFAULT中。D3DLOCK_DISCARD是合法的。<br>DrawProceduralTexture(pTex)<br>{<br>&nbsp;&nbsp;&nbsp; // pTex should not be very small because overhead of <br>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; calling driver every D3DLOCK_DISCARD will not <br>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; justify the performance gain. Experimentation is encouraged.<br>&nbsp;&nbsp;&nbsp; pTex-&gt;Lock(D3DLOCK_DISCARD);<br>&nbsp;&nbsp;&nbsp; &lt;Overwrite *entire* texture&gt;<br>&nbsp;&nbsp;&nbsp; pTex-&gt;Unlock();<br>&nbsp;&nbsp;&nbsp; pDev-&gt;SetTexture();<br>&nbsp;&nbsp;&nbsp; pDev-&gt;DrawPrimitive();<br>}<br><br>当需要在每帧里锁定顶点或索引缓存是，应该使用动态缓存（D3DUSAGE_DYNAMIC）。对动态缓存使用D3DLOCK_DISCARD锁定能减少延迟。D3DLOCK_NOOVERWRITE锁定可以用于在缓存空闲处添加新的数据而不修改已经写入的数据。<br><br>使用Effect时，应该根据Effect，然后根据Technique来安排渲染顺序，也就是使用相同Effect和Technique的物体应该集中绘制。这样可以减少状态切换开销。
<img src ="http://www.cppblog.com/lucky420/aggbug/25454.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-04 12:57 <a href="http://www.cppblog.com/lucky420/archive/2007/06/04/25454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>