<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://flipcode.spaces.live.com/mmm2008-05-17_13.22/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fflipcode.spaces.live.com%2fcategory%2f3d%e7%bc%96%e7%a8%8b%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>飘零风雨亭: 3d编程</title><description /><link>http://flipcode.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat3d%25E7%25BC%2596%25E7%25A8%258B</link><language>en-US</language><pubDate>Mon, 23 Jun 2008 08:31:31 GMT</pubDate><lastBuildDate>Mon, 23 Jun 2008 08:31:31 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://flipcode.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-8189920746979949719</live:id><live:alias>flipcode</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>maxsdk图解</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1091.entry</link><description>&lt;div&gt;参见:&lt;/div&gt;
&lt;div&gt;3DSMAX_SDK_DavidLanier.pdf&lt;/div&gt;
&lt;div&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXKi_cv7GhhjBxXe0s8XQ-yk7w1H8IY7Qn8OWy5aYdg87nZ4nz9unyY0qVtHe02tokU" target="_blank"&gt;&lt;img height=200 alt="max_pipeline(instance)" src="http://byfiles.storage.live.com/y1pQyiAAjFojXKi_cv7GhhjBxXe0s8XQ-yk7w1H8IY7Qn8OWy5aYdg87nZ4nz9unyY0qVtHe02tokU" width=170&gt;&lt;/a&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXLh2QRt_kkZM0sdtuYKmDjOtMpRweAqGWsG0Odj8Yxx9fGYle_tJnDN7QGvr6FBCKc" target="_blank"&gt;&lt;img height=200 alt="max_pipeline(refrence)" src="http://byfiles.storage.live.com/y1pQyiAAjFojXLh2QRt_kkZM0sdtuYKmDjOtMpRweAqGWsG0Odj8Yxx9fGYle_tJnDN7QGvr6FBCKc" width=157&gt;&lt;/a&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXJg0-3w--m7OhwU4b4Nktda0N5WrdcPR-loXbwMoBVN8g1aCJ4uZeyjPCdt6eAbpg8" target="_blank"&gt;&lt;img height=200 alt="max_pipeline" src="http://byfiles.storage.live.com/y1pQyiAAjFojXJg0-3w--m7OhwU4b4Nktda0N5WrdcPR-loXbwMoBVN8g1aCJ4uZeyjPCdt6eAbpg8" width=244&gt;&lt;/a&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXIOpVhTdR113JiMkflYtW12VYAjH2bkiBN44LbK_D2v7Um29_2RpCzyR8zKxU8c6wY" target="_blank"&gt;&lt;img height=200 alt=NodeTM src="http://byfiles.storage.live.com/y1pQyiAAjFojXIOpVhTdR113JiMkflYtW12VYAjH2bkiBN44LbK_D2v7Um29_2RpCzyR8zKxU8c6wY" width=243&gt;&lt;/a&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXLn2tmRsiEjcy8f4YvvpBL2jTOgBZW_40fYmJC7a1gwDkacabl6I50sKEUw-UJDZqg" target="_blank"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+maxsdk%e5%9b%be%e8%a7%a3&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1091.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1091.entry</guid><pubDate>Tue, 18 Dec 2007 08:14:12 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1091/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1091.entry#comment</wfw:comment><dcterms:modified>2007-12-18T08:35:03Z</dcterms:modified></item><item><title>游戏中换装处理（备忘）</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1080.entry</link><description>&lt;div&gt;游戏中换装处理（备忘）&lt;/div&gt;
&lt;div&gt;一.cha 结构:&lt;br&gt;cha中可有几个model(对应为部位,可切换)&lt;br&gt;每个model可有几个mtl(即subset),  &lt;br&gt;每个mtl可作为一个pass, 该mtl中可有几层贴图&lt;br&gt;但是由于硬件多层贴图的限制可考虑只充许2层, 否则可能需要多次pass &lt;/div&gt;
&lt;div&gt;二.cha update:&lt;br&gt;updatebone(计算当前骨骼运行时矩阵) -- 注意,骨骼的骨架数据及骨骼的动画数据可共享&lt;br&gt;updatemodel(计算模型中动画)        -- 注意,模型的网格数据及模型的动画数据可共享&lt;/div&gt;
&lt;div&gt;注意:&lt;br&gt;  需要将每model中引用到的骨骼运行时矩阵(在updatebone中计算好了)拷贝到该model中, &lt;br&gt;  以便在后面渲染每个模型时能用上.&lt;br&gt;  &lt;br&gt;优化: &lt;br&gt;    人物不可见时可不更新动画,但要更新动作(即当前播放第几个动作的第几帧),&lt;br&gt;故上述两函数可再追加一个标志说明是更新动作还是动画&lt;/div&gt;
&lt;div&gt;三.cha render:&lt;br&gt;遍历渲染每一个model:&lt;br&gt;for(i loop models)&lt;br&gt;{&lt;br&gt; 1. 设置每个模型的vb和ib: (vb和ib是静态创建的)&lt;br&gt;    setstream(model's vb &amp;amp;&amp;amp; ib)&lt;br&gt; &lt;br&gt; 2. 渲染每一个模型 &lt;br&gt;   a. 把model引用到的运行时矩阵乘上MVP设置给vs&lt;br&gt;   b. 分pass画:&lt;br&gt;  for(i loop mtls){&lt;br&gt;     把每个mtl设置给vs&lt;br&gt;     drawpass(i)&lt;br&gt;  }&lt;br&gt;}&lt;br&gt;优化:&lt;br&gt;   在第２部时要把model引用到的运行时矩阵乘上MVP设置给vs中的常量寄存器，&lt;br&gt;然后用每个顶点的矩阵索引及权重进行混合（矩阵索引需要vs1.1中的寻址寄存器a0.x）&lt;/div&gt;
&lt;div&gt;另外，只有整体transform变换的模型（没有顶点或骨骼动画, 如地面上不同位置不同面向的不动的树）要与人物模型分开处理，&lt;br&gt;这类物件可用类似上述的常量矩阵数组的技术进行instancing批次渲染(带skin的instancing批次渲染由于常量寄存器已变骨骼矩阵使用，&lt;br&gt;因此一般需要硬件支持，如使用顶点纹理来保存骨骼矩阵，参见前面文章instancing批次渲染)&lt;/div&gt;
&lt;div&gt;&lt;br&gt;疑问：&lt;br&gt;目前有一个疑问，上述的渲染需不需要换成按贴图排序再渲染. &lt;br&gt;还有怎么在只支持vs1.1的显卡下实现skin instancing，或者有其它什么优化的方案？&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e6%b8%b8%e6%88%8f%e4%b8%ad%e6%8d%a2%e8%a3%85%e5%a4%84%e7%90%86%ef%bc%88%e5%a4%87%e5%bf%98%ef%bc%89&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1080.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1080.entry</guid><pubDate>Tue, 20 Nov 2007 04:31:25 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1080/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1080.entry#comment</wfw:comment><dcterms:modified>2007-11-20T04:31:25Z</dcterms:modified></item><item><title>instancing批次画</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1072.entry</link><description>&lt;div&gt;instancing批次画:&lt;/div&gt;
&lt;div&gt;具体实现参见dxsdk9.0c中的instancing_2005(未包括最后一种需要sm3.0支持的技术)&lt;br&gt;一.单个shade const:&lt;br&gt;    V( g_pEffect-&amp;gt;Begin( &amp;amp;cPasses, 0 ) );&lt;br&gt;    for( iPass = 0; iPass &amp;lt; cPasses; iPass++ )&lt;br&gt;    {&lt;br&gt;        V( g_pEffect-&amp;gt;BeginPass( iPass ) );&lt;br&gt;            &lt;br&gt;        // Render the boxes with the applied technique&lt;br&gt;        V( g_pEffect-&amp;gt;SetTexture( g_HandleTexture, g_pBoxTexture ) );&lt;/div&gt;
&lt;div&gt;        for( int nRemainingBoxes = 0; nRemainingBoxes &amp;lt; g_NumBoxes; nRemainingBoxes++ )&lt;br&gt;        {&lt;br&gt;            // set the box instancing array&lt;br&gt;            V( g_pEffect-&amp;gt;SetVector( g_HandleBoxInstance_Position, &amp;amp;g_vBoxInstance_Position[nRemainingBoxes] ) );&lt;br&gt;            V( g_pEffect-&amp;gt;SetVector( g_HandleBoxInstance_Color, (D3DXVECTOR4*)&amp;amp;g_vBoxInstance_Color[nRemainingBoxes] ) );&lt;br&gt;            &lt;br&gt;            // The effect interface queues up the changes and performs them &lt;br&gt;            // with the CommitChanges call. You do not need to call CommitChanges if &lt;br&gt;            // you are not setting any parameters between the BeginPass and EndPass.&lt;br&gt;            V( g_pEffect-&amp;gt;CommitChanges() );&lt;br&gt;            &lt;br&gt;            V( pd3dDevice-&amp;gt;DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 4 * 6, 0, 6 * 2 ) );&lt;br&gt;        }&lt;/div&gt;
&lt;div&gt;        V( g_pEffect-&amp;gt;EndPass() );&lt;br&gt;    }&lt;br&gt;    V( g_pEffect-&amp;gt;End() );&lt;/div&gt;
&lt;div&gt;二.多个shade const(因为使用类似于矩阵板实现skin bone的方法,所以存在冲突不能同时使用在骨骼动画中)&lt;br&gt;    V( g_pEffect-&amp;gt;Begin( &amp;amp;cPasses, 0 ) );&lt;br&gt;    for( iPass = 0; iPass &amp;lt; cPasses; iPass++ )&lt;br&gt;    {&lt;br&gt;        V( g_pEffect-&amp;gt;BeginPass( iPass ) );&lt;br&gt;            &lt;br&gt;        // Render the boxes with the applied technique&lt;br&gt;        V( g_pEffect-&amp;gt;SetTexture( g_HandleTexture, g_pBoxTexture ) );&lt;/div&gt;
&lt;div&gt;        int nRemainingBoxes = g_NumBoxes;&lt;br&gt;        while( nRemainingBoxes &amp;gt; 0 )&lt;br&gt;        {&lt;br&gt;            // determine how many instances are in this batch (up to g_nNumBatchInstance)           &lt;br&gt;            int nRenderBoxes = min( nRemainingBoxes, g_nNumBatchInstance );&lt;/div&gt;
&lt;div&gt;            // set the box instancing array&lt;br&gt;            V( g_pEffect-&amp;gt;SetVectorArray( g_HandleBoxInstance_Position, g_vBoxInstance_Position + g_NumBoxes - nRemainingBoxes, nRenderBoxes) );&lt;br&gt;            V( g_pEffect-&amp;gt;SetVectorArray( g_HandleBoxInstance_Color, (D3DXVECTOR4*)(g_vBoxInstance_Color + g_NumBoxes - nRemainingBoxes), nRenderBoxes) );&lt;br&gt;            &lt;br&gt;            // The effect interface queues up the changes and performs them &lt;br&gt;            // with the CommitChanges call. You do not need to call CommitChanges if &lt;br&gt;            // you are not setting any parameters between the BeginPass and EndPass.&lt;br&gt;            V( g_pEffect-&amp;gt;CommitChanges() );&lt;br&gt;            &lt;br&gt;            V( pd3dDevice-&amp;gt;DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, nRenderBoxes * 4 * 6, 0, nRenderBoxes * 6 * 2 ) );&lt;/div&gt;
&lt;div&gt;            // subtract the rendered boxes from the remaining boxes&lt;br&gt;            nRemainingBoxes -= nRenderBoxes;&lt;br&gt;        }&lt;/div&gt;
&lt;div&gt;        V( g_pEffect-&amp;gt;EndPass() );&lt;br&gt;    }&lt;br&gt;    V( g_pEffect-&amp;gt;End() );&lt;/div&gt;
&lt;div&gt;&lt;br&gt;三. vs3.0 的hwinstance(需要多流INSTANCEDATA支持):&lt;br&gt;   这种方法是GPU通过虚拟复制（virtually duplicating）把顶点从第一个流打包到第二个流中。(也就是硬件使用多流和自动打包的方式帮忙实际了类似上述第二种的instance批次画)&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;    // Stream zero is our model, and its frequency is how we communicate the number of instances required,&lt;br&gt;    // which in this case is the total number of boxes&lt;br&gt;    V( pd3dDevice-&amp;gt;SetStreamSource( 0, g_pVBBox, 0, sizeof(BOX_VERTEX)) );&lt;br&gt;    V( pd3dDevice-&amp;gt;SetStreamSourceFreq( 0, D3DSTREAMSOURCE_INDEXEDDATA | g_NumBoxes ) );&lt;br&gt;        &lt;br&gt;    // Stream one is the instancing buffer, so this advances to the next value&lt;br&gt;    // after each box instance has been drawn, so the divider is 1.&lt;br&gt;    V( pd3dDevice-&amp;gt;SetStreamSource( 1, g_pVBInstanceData, 0, sizeof( BOX_INSTANCEDATA_POS ) ) );&lt;br&gt;    V( pd3dDevice-&amp;gt;SetStreamSourceFreq( 1, D3DSTREAMSOURCE_INSTANCEDATA | 1ul ) );&lt;/div&gt;
&lt;div&gt;    V( pd3dDevice-&amp;gt;SetIndices( g_pIBBox ) );&lt;br&gt;        &lt;br&gt;    // Render the scene with this technique&lt;br&gt;    // as defined in the .fx file&lt;br&gt;    V( g_pEffect-&amp;gt;SetTechnique( g_HandleTechnique ) );&lt;br&gt;        &lt;br&gt;    V( g_pEffect-&amp;gt;Begin( &amp;amp;cPasses, 0 ) );&lt;br&gt;    for( iPass = 0; iPass &amp;lt; cPasses; iPass++ )&lt;br&gt;    {&lt;br&gt;        V( g_pEffect-&amp;gt;BeginPass( iPass ) );&lt;br&gt;            &lt;br&gt;        // Render the boxes with the applied technique&lt;br&gt;        V( g_pEffect-&amp;gt;SetTexture( g_HandleTexture, g_pBoxTexture ) );&lt;br&gt;            &lt;br&gt;        // The effect interface queues up the changes and performs them &lt;br&gt;        // with the CommitChanges call. You do not need to call CommitChanges if &lt;br&gt;        // you are not setting any parameters between the BeginPass and EndPass.&lt;br&gt;        V( g_pEffect-&amp;gt;CommitChanges() );&lt;br&gt;            &lt;br&gt;        V( pd3dDevice-&amp;gt;DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 4 * 6, 0, 6 * 2 ) );&lt;br&gt;            &lt;br&gt;        V( g_pEffect-&amp;gt;EndPass() );&lt;br&gt;    }&lt;br&gt;    V( g_pEffect-&amp;gt;End() );&lt;br&gt;        &lt;br&gt;    V( pd3dDevice-&amp;gt;SetStreamSourceFreq( 0, 1 ) );&lt;br&gt;    V( pd3dDevice-&amp;gt;SetStreamSourceFreq( 1, 1 ) );&lt;/div&gt;
&lt;div&gt;&lt;br&gt;四. 带骨骼实现的批次(顶点纹理方式):&lt;/div&gt;
&lt;div&gt;    上述方法不好同时实现skinning, 如果需要实现skinning，可以尝试把所有实体的所有骨骼信息储存为一张纹理，之后为相应的实体选择正确的骨骼，这需要用到Shader Model3.0中的顶点纹理访问功能。如果使用这种技术，那么访问顶点纹理带来的性能消耗是不确定的，应该实现进行测试。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;具体例子也可以参考:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=366247"&gt;http://www.gamedev.net/community/forums/topic.asp?topic_id=366247&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;a href="http://creators.xna.com/Headlines/developmentaspx/archive/2007/01/01/Mesh-Instancing.aspx"&gt;http://creators.xna.com/Headlines/developmentaspx/archive/2007/01/01/Mesh-Instancing.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;NoInstancing:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXLftSevUhkifiGA5r1j_zgeMRX5nn-Br6upFGqNEVP9G-T0wLnSOs-4C1Hr6RD4XNQ" target="_blank"&gt;&lt;img height=81 alt=NoInstancing src="http://byfiles.storage.live.com/y1pQyiAAjFojXLftSevUhkifiGA5r1j_zgeMRX5nn-Br6upFGqNEVP9G-T0wLnSOs-4C1Hr6RD4XNQ" width=300&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;ShaderInstancing:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXJj_1GEcCOVMomf7m3sZLUFXcf4iwZGbqmn-8u88ONI94HKmasSosi6mK3dGt1AOMM" target="_blank"&gt;&lt;img height=83 alt=ShaderInstancing src="http://byfiles.storage.live.com/y1pQyiAAjFojXJj_1GEcCOVMomf7m3sZLUFXcf4iwZGbqmn-8u88ONI94HKmasSosi6mK3dGt1AOMM" width=300&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;HardwareInstancing:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXLdPTnpaJnaVVHhhSBmYqBFkKGGB0b6buAe9j0PvKkEpHSS1QYsXPr3d_LV07xzYuk" target="_blank"&gt;&lt;img height=112 alt=HardwareInstancing src="http://byfiles.storage.live.com/y1pQyiAAjFojXLdPTnpaJnaVVHhhSBmYqBFkKGGB0b6buAe9j0PvKkEpHSS1QYsXPr3d_LV07xzYuk" width=300&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;VFetchInstancing:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXL61Sl3orOtdV0RXkxx6-0q5oYs2ukw1GlSK9KdqmzcDqwQ2frt9H8orxcJNckHWdw" target="_blank"&gt;&lt;img height=131 alt=VFetchInstancing src="http://byfiles.storage.live.com/y1pQyiAAjFojXL61Sl3orOtdV0RXkxx6-0q5oYs2ukw1GlSK9KdqmzcDqwQ2frt9H8orxcJNckHWdw" width=300&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXKB9DL1L-DUUxs2uGSvUMIwvWGjHNbOPUt1GgPBsFTY0Ecm-BJjX2yzB6j7Arq4eww" target="_blank"&gt;&lt;/a&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+instancing%e6%89%b9%e6%ac%a1%e7%94%bb&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1072.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1072.entry</guid><pubDate>Mon, 19 Nov 2007 02:58:09 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1072/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1072.entry#comment</wfw:comment><dcterms:modified>2007-11-19T09:14:59Z</dcterms:modified></item><item><title>WOW的地形shader祥细解释</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1055.entry</link><description>&lt;div&gt;WOW的地形shader祥细解释&lt;/div&gt;
&lt;div&gt;&lt;a href="mailto:flipcode@msn.com"&gt;flipcode@msn.com&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;SPXG // 标识&lt;br&gt;// 用到5张图片:&lt;br&gt;{&lt;br&gt;   blendTexture  = 0&lt;br&gt;   layer0Texture = 1&lt;br&gt;   layer1Texture = 2&lt;br&gt;   layer2Texture = 3&lt;br&gt;   layer3Texture = 4&lt;br&gt;}&lt;br&gt;!!ARBfp1.0&lt;/div&gt;
&lt;div&gt;// 定义常量:&lt;br&gt;PARAM c[1] = { { 1, 0.30000001, 0.69999999 } };&lt;/div&gt;
&lt;div&gt;// 声明3个寄存器:&lt;br&gt;TEMP R0;&lt;br&gt;TEMP R1;&lt;br&gt;TEMP R2;&lt;/div&gt;
&lt;div&gt;// 开始混合:&lt;br&gt;// 一.第0层和第1层使用第4张图的x通道作为alpha进行混合:&lt;br&gt;TEX R1, fragment.texcoord[0], texture[0], 2D;&lt;br&gt;TEX R0, fragment.texcoord[1], texture[1], 2D;&lt;br&gt;ADD R2, R0, -R1;&lt;br&gt;// r2=Tex1-Tex0&lt;/div&gt;
&lt;div&gt;TEX R0, fragment.texcoord[4], texture[4], 2D;&lt;br&gt;MAD R2, R0.x, R2, R1;&lt;br&gt;// r2 = Tex4.x*r2+Tex0&lt;/div&gt;
&lt;div&gt;// 说明:&lt;br&gt;// 其中的Tex4.x是对应第1层alpha值, 下面把Tex4.x当a1看&lt;br&gt;// 即 r2 = a1 * (Tex1-Tex0) + Tex0&lt;br&gt;// 转换一下即是: Tex0*(1-a1)+a1*Tex1, 呵呵,看到了吧,这就是混合公式!&lt;/div&gt;
&lt;div&gt;// 二.第2层和前面结果使用第4张图的y通道作为alpha进行混合:&lt;br&gt;TEX R1, fragment.texcoord[2], texture[2], 2D;&lt;br&gt;ADD R1, R1, -R2;&lt;br&gt;// r1=Tex2-r2&lt;/div&gt;
&lt;div&gt;MAD R2, R0.y, R1, R2;&lt;br&gt;// r2 = Tex4.y*r1+r2, 即 a2*r1+r2 = a2*(Tex2-r2)+r2, 即r2*(1-a2)+Tex2*a2, 其中r2即是上次0和1层混合后的结果&lt;/div&gt;
&lt;div&gt;// 三.第3层和前面结果使用第4张图的z通道作为alpha进行混合:&lt;br&gt;TEX R1, fragment.texcoord[3], texture[3], 2D;&lt;br&gt;ADD R1, R1, -R2;&lt;br&gt;// r1=Tex3-r2&lt;/div&gt;
&lt;div&gt;MAD R1, R0.z, R1, R2;&lt;br&gt;// r1=a3*r1+r2 , 即 a3*r1+r2 = a3*(Tex3-r2)+r2, 即r2*(1-a3)+Tex3*a3&lt;br&gt;// 这样r1就保存了最终的混合结果&lt;/div&gt;
&lt;div&gt;// 四.让阴影地表光泽系数为0(Tex4.w即a通道代表地形的阴影,0为阴影,1为正常.而每层贴图中的a通道是光泽通道,所以R1.w保存的是最终的光泽通道值):&lt;br&gt;MUL R0.x, R1.w, R0.w;&lt;br&gt;// r0.x = r1.w(光泽)*Tex4.w(阴影值, 是阴影则=0,否则=1)&lt;/div&gt;
&lt;div&gt;// 计算削减系数?&lt;br&gt;MAD R0.w, R0, c[0].y, c[0].z; // r0乘上0.3(削减了30％)再加上一个常量0.69999999&lt;/div&gt;
&lt;div&gt;// 反射高光 = secondary_color(反射光)*光泽:&lt;br&gt;MUL R0.xyz, R0.x, fragment.color.secondary; &lt;/div&gt;
&lt;div&gt;// 贴图最终color = 最终贴图混出的color*削减系数:&lt;br&gt;MUL R1.xyz, R1, R0.w; &lt;/div&gt;
&lt;div&gt;// 贴图最终color * primary_color(光照色或是顶点色) + 反射高光:&lt;br&gt;MAD result.color.xyz, R1, fragment.color.primary, R0; &lt;/div&gt;
&lt;div&gt;// alpha:&lt;br&gt;MOV result.color.w, c[0].x; &lt;/div&gt;
&lt;div&gt;END&lt;br&gt;   &lt;br&gt;   &lt;br&gt;   &lt;br&gt;参考资料:&lt;br&gt;&amp;lt;WOW的地形渲染&amp;gt;:&lt;br&gt;&lt;a href="http://dev.csdn.net/author/ZERO2046/1b8df53b7f034e7999d70e0cac5665f6.html"&gt;http://dev.csdn.net/author/ZERO2046/1b8df53b7f034e7999d70e0cac5665f6.html&lt;/a&gt;&lt;br&gt;魔兽世界的地形渲染，基本上有三种渲染路径：固定渲染管线（其中是不是又分几种就不清楚了）；shader（带高光）；shader（不带高光）&lt;br&gt;　　用到shader的渲染路径又分别针对1层，2层，3层，4层（最多允许每个chunk使用4层纹理）专门写了shader代码。&lt;br&gt;　　用MyWarCraftStudio打开WOW的misc.mpq包，shader \ pixel \ 目录下以&amp;quot;terrain&amp;quot;打头的bls文件就是地形渲染使用的shader，带有&amp;quot;_s&amp;quot;后缀的是带高光的渲染，否则就是不带高光的。&lt;br&gt;　　我仔细看了其中的terrain4_s.bls（用UltraEdit之类的工具可以直接当成文本文件打开）。是汇编形式的ps代码，由于之前俺只用过c形式的HLSL所以看起来有点吃力，好在还是看明白了。&lt;br&gt;　　texture0~3就是待混合的4层纹理，每层纹理的a通道是该层纹理对应的高光通道；texture4是一张用来控制混合权重的alpha纹理。texture4的r,g,b通道分别对应texture1~3的alpha值，而texture4.a则代表地形的阴影，0为阴影，1为正常。&lt;br&gt;　　混合的公式为res_n = res_n-1 * ( 1 - alpha_n ) + texture_n * alpha_n。其中n代表第n层纹理。res_n代表第n层混合后的结果。&lt;br&gt;　　从代码可以看出，最终混合结果的a通道（高光通道）被乘以阴影值，也就是说阴影中没有高光。同时，阴影中的diffuse光照被削减了30％。&lt;br&gt;　　1，2，3层纹理混合，以及不带高光的情况想必也没有什么特别之处，也不去细看了。&lt;br&gt;　　值得一提的是我原来一直以为WOW的地形渲染只用了ps_1_1，但从这个shader看用了5张纹理，超出了ps_1_1的4个纹理采样的限制，所以至少使用了ps_1_4（允许6个纹理采样）。而1～3层纹理混合的情况使用ps_1_1就够了。我不知道在渲染时频繁切换ps版本会不会收到性能上的惩罚，但有些显卡（比如NV的5200）同样的代码在ps_1_4上运行要比在ps_1_1上运行慢很多。&lt;br&gt;　　至于固定渲染管线的渲染路径，由于不可能看到代码，具体如何实现多层纹理混合无法揣测，集合了各层纹理混合系数的alpha图应该不能直接用于渲染，因为固定渲染管线似乎只能用a通道来控制混合系数，可能需要将这张纹理拆成4张才行。。。&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+WOW%e7%9a%84%e5%9c%b0%e5%bd%a2shader%e7%a5%a5%e7%bb%86%e8%a7%a3%e9%87%8a&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1055.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1055.entry</guid><pubDate>Wed, 14 Nov 2007 10:37:22 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1055/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1055.entry#comment</wfw:comment><dcterms:modified>2007-11-21T01:23:28Z</dcterms:modified></item><item><title>地形上网格投射阴影(备忘)</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1054.entry</link><description>&lt;p&gt;地形上网格投射阴影:&lt;br&gt;目前有很多游戏及引擎用到了这种方法,&lt;br&gt;如开源的glest即时战略游戏和OGRE3D,&lt;br&gt;方法是:&lt;br&gt;照相到对到光线方向,渲染地表到深度缓冲,再渲染要投影的物件到贴图&lt;br&gt;然后将照相机设到顶视图,设置投影映射纹理把贴图贴到地面. 
&lt;p&gt;具本参见:&lt;br&gt;Generating Mesh Shadows On Terrain Using OpenGL&lt;br&gt;&lt;a href="http://gpwiki.org/index.php/Generating_Mesh_Shadows_On_Terrain_Using_OpenGL"&gt;http://gpwiki.org/index.php/Generating_Mesh_Shadows_On_Terrain_Using_OpenGL&lt;/a&gt; 
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e5%9c%b0%e5%bd%a2%e4%b8%8a%e7%bd%91%e6%a0%bc%e6%8a%95%e5%b0%84%e9%98%b4%e5%bd%b1(%e5%a4%87%e5%bf%98)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1054.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1054.entry</guid><pubDate>Wed, 14 Nov 2007 09:30:35 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1054/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1054.entry#comment</wfw:comment><dcterms:modified>2007-11-14T09:31:40Z</dcterms:modified></item><item><title>地形pvs</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1053.entry</link><description>&lt;p&gt;地形pvs&lt;br&gt;将地形分成n*n个区域,分成32层&lt;br&gt;然后,遍历每个区域, 在每个区域上的每层上向其它区域拉一直接,测试它们之间是否有障碍(不用测试三角形只用比较经过的区域内每个格子高度),是则表示当前所在区域看不见所测区域,保存此PVS供用.&lt;br&gt;注意PVS要用bit来保存,否则很大
&lt;p&gt;参见:&lt;br&gt;GameDev.net -- Terrain Geomorphing in the Vertex Shader&lt;br&gt;&lt;a href="http://www.gamedev.net/columns/hardcore/geomorph/"&gt;http://www.gamedev.net/columns/hardcore/geomorph/&lt;/a&gt;
&lt;p&gt;geomorph可将格子进行4次lod, 并在不同lod的格子边界进行插入点形成新的三角形(以免出现T形裂缝)&lt;br&gt;由于lod形成的高度差,所以还可以设置一个error充许值.具体参见原文(该地形也实现了类似目前一些网游所用的alpha混合多层贴图)
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e5%9c%b0%e5%bd%a2pvs&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1053.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1053.entry</guid><pubDate>Wed, 14 Nov 2007 09:24:43 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1053/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1053.entry#comment</wfw:comment><dcterms:modified>2007-11-14T09:24:43Z</dcterms:modified></item><item><title>地形碰撞高度计算(备忘)</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1052.entry</link><description>&lt;p&gt;&lt;br&gt;地形碰撞计算:&lt;br&gt;一.如果是鼠标点击地面,&lt;br&gt;可将射线固定长度并分段,然后用射线与每一个分段上的点所落在的地面tile(两个三角形)进行求交,&lt;br&gt;相交则返回对应位置,否则继续与下一个段上的点所落在的地面tile求交&lt;br&gt;/*&lt;br&gt;      0      1&lt;br&gt;       ----&amp;gt;&lt;br&gt;      | \  |&lt;br&gt;      |  \ |&lt;br&gt;    2 V ---  3    &lt;br&gt;*/&lt;br&gt;这里不讨论点击屏幕求射线方法与射线分段处理,只算求交&lt;br&gt;如下d3d求交得出uv,再求位置:&lt;br&gt; VECTOR3 vPickPos;&lt;br&gt; // 右边:&lt;br&gt; if( D3DXIntersectTri(&amp;amp;v0, &amp;amp;v1, &amp;amp;v3, &amp;amp;vOrig, &amp;amp;vDir, &amp;amp;u, &amp;amp;v, NULL) == TRUE)&lt;br&gt; {&lt;br&gt;  vPickPos = v0 + u * (v1 - v0) + v * (v3 - v0); &lt;br&gt;  return vPickPos.z;&lt;br&gt; }&lt;br&gt; // 左边:&lt;br&gt; if( D3DXIntersectTri(&amp;amp;v0, &amp;amp;v3, &amp;amp;v2, &amp;amp;vOrig, &amp;amp;vDir, &amp;amp;u, &amp;amp;v, NULL) == TRUE)&lt;br&gt; {&lt;br&gt;  vPickPos = v0 + u * (v3 - v0) + v * (v2 - v0);  &lt;br&gt;  return vPickPos.z;&lt;br&gt; }
&lt;p&gt;二.如果是仅是求地表某点高度&lt;br&gt;则可用uv重心求法(注意上述第一点的d3d的那个uv重心求法不太一样,他的uv跟他的向量走?)&lt;br&gt; float u = (fX-(int)fX);&lt;br&gt; float v = (fY-(int)fY);
&lt;p&gt; float p0 = fHeight[0];&lt;br&gt; float p1 = fHeight[1];&lt;br&gt; float p2 = fHeight[2];&lt;br&gt; float p3 = fHeight[3];
&lt;p&gt; if(u&amp;gt;v){ // 右边&lt;br&gt;  return p0 + u * (p1 - p0) + v * (p3 - p1);; &lt;br&gt; }&lt;br&gt; else{  // 左边&lt;br&gt;  return  p0 + u * (p3 - p2) + v * (p2 - p0);&lt;br&gt; }
&lt;p&gt; 
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e5%9c%b0%e5%bd%a2%e7%a2%b0%e6%92%9e%e9%ab%98%e5%ba%a6%e8%ae%a1%e7%ae%97(%e5%a4%87%e5%bf%98)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1052.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1052.entry</guid><pubDate>Wed, 14 Nov 2007 09:10:16 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1052/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1052.entry#comment</wfw:comment><dcterms:modified>2007-11-14T09:10:16Z</dcterms:modified></item><item><title>d3d中实现简单的水</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1046.entry</link><description>&lt;h4 style="margin-bottom:0px"&gt;1. 最简单的一张带alpha的贴图直接uv动画&lt;br&gt;2. 另一种是使用序列贴图, 即水的动画贴图,可在每个自定义大小的格子播放相同的一帧图片来实现.&lt;/h4&gt;
&lt;h4 style="margin-bottom:0px"&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXL1UAbjX5-iMIMUoMSvqRpNfC4gJDxATWuGkZ1HPrq7ecLvx5WFXL30Cba6vqm5Rn4" target="_blank"&gt;&lt;img height=219 alt=tt src="http://byfiles.storage.live.com/y1pQyiAAjFojXL1UAbjX5-iMIMUoMSvqRpNfC4gJDxATWuGkZ1HPrq7ecLvx5WFXL30Cba6vqm5Rn4" width=297&gt;&lt;/a&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXLOwGYm9JBPmttaGyasM5KHIqXPrcrHWWdnqSe2T0BAm66kLrtt-BgvkuShLFbyFlk" target="_blank"&gt;&lt;/a&gt;&lt;br&gt;3. 反射水面:&lt;br&gt;   上述其中一种方法再加上带bump map效果的反射图 &lt;/h4&gt;
&lt;p style="margin-bottom:0px"&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXLOwGYm9JBPmttaGyasM5KHIqXPrcrHWWdnqSe2T0BAm66kLrtt-BgvkuShLFbyFlk" target="_blank"&gt;&lt;img height=152 alt=water src="http://byfiles.storage.live.com/y1pQyiAAjFojXLOwGYm9JBPmttaGyasM5KHIqXPrcrHWWdnqSe2T0BAm66kLrtt-BgvkuShLFbyFlk" width=204&gt;&lt;/a&gt;  
&lt;p style="margin-bottom:0px"&gt;下面给出最后一种具体例子: 
&lt;h4 style="margin-bottom:0px"&gt;用d3d固定管道实现bump mapping振动/移动的水: &lt;/h4&gt;
&lt;p&gt;(注意:该例子只用D3DTOP_BUMPENVMAP没用D3DTOP_BUMPENVMAPLUMINANCE):&lt;br&gt;  // 混合状态:&lt;br&gt;  m_pD3DDevice-&amp;gt;SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
&lt;p&gt;  // 贴图基台0:&lt;br&gt;  // 贴图因子(见后面的alpha参数D3DTA_TFACTOR):&lt;br&gt;  m_pD3DDevice-&amp;gt;SetRenderState(D3DRS_TEXTUREFACTOR, 0x90000000);&lt;br&gt;  // 设置Bump map: 就是一些uv偏移值,保存在bump贴图中(还可以保存一个附加的光照值)&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTexture(0, m_pTexBump);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_BUMPENVMAP);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTA_DIFFUSE);//D3DTOP_DISABLE);&lt;br&gt;                // bump矩阵(参见上面msdn链接说明):&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(0, D3DTSS_BUMPENVMAT00, F2DW(0.05f));&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(0, D3DTSS_BUMPENVMAT01, F2DW(0.0f));&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(0, D3DTSS_BUMPENVMAT10, F2DW(0.0f));&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(0, D3DTSS_BUMPENVMAT11, F2DW(0.05f));&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(0, D3DTSS_BUMPENVLSCALE, F2DW(1.0f));&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(0, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f));&lt;br&gt;                // uv矩阵(uv动画用):&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTransform(D3DTS_TEXTURE0, &amp;amp;m_MatTransEau);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); 
&lt;p&gt;                // 贴图基台1:&lt;br&gt;                // 反射图(可实时计算):&lt;br&gt;  // Etage 1 : affichage de la texture de r閒lexion&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTexture(1, m_pEnvMiroir-&amp;gt;GetMiroir());&lt;br&gt;                // &lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState (1, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState (1, D3DTSS_COLORARG1, D3DTA_TEXTURE);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState (1, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState (1, D3DTSS_ALPHAARG1, D3DTA_TFACTOR);&lt;br&gt;                // uv矩阵(投影矩阵,将贴图映射到水面用):&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTransform(D3DTS_TEXTURE1, &amp;amp;m_pScene-&amp;gt;GetCameraCourante()-&amp;gt;GetMatriceProjectionTexture());&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_PROJECTED |D3DTTFF_COUNT3);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetSamplerState(1, D3DSAMP_ADDRESSU,  D3DTADDRESS_CLAMP);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetSamplerState(1, D3DSAMP_ADDRESSV,  D3DTADDRESS_CLAMP); 
&lt;p&gt;                // set fvf, vb 和 ib:&lt;br&gt;  m_pD3DDevice-&amp;gt;SetFVF(D3DFVF_CUSTOMVERTEX);&lt;br&gt;  m_pD3DDevice-&amp;gt;SetStreamSource(0, m_pVB, 0, sizeof(CUSTOMVERTEX));&lt;br&gt;  m_pD3DDevice-&amp;gt;SetIndices(m_pIB); 
&lt;p&gt;                // draw:&lt;br&gt;  m_pD3DDevice-&amp;gt;DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, NB_VERTEX_EAU, 0, NB_TRIANGLE_EAU); 
&lt;p&gt;提示: 
&lt;p&gt;上述的bump矩阵只是简单的偏移,实际的uv动画使用了另一个贴图uv矩阵(每帧更新,使得uv移动)来设置的, 
&lt;p&gt;另外一个更好技巧是可以使用bump矩阵直接应用sin函数,这样会使用得水波有一定的振动,效果挺好: 
&lt;p&gt;   D3DXMATRIX matBumpMat; 
&lt;p&gt;   const static DWORD startick(GetTickCount());&lt;br&gt;   DWORD dwtime=GetTickCount()-startick;&lt;br&gt;   float time=(float)dwtime/1000;&lt;br&gt;   FLOAT r = 0.005f;&lt;br&gt;   matBumpMat._11 = r*cosf(time*8.0f);&lt;br&gt;   matBumpMat._12 = r*sinf(time*8.0f);&lt;br&gt;   matBumpMat._21 = r*sinf(time*8.0f);&lt;br&gt;   matBumpMat._22 =-r*cosf(time*8.0f); 
&lt;p&gt;   m_pD3DDevice-&amp;gt;SetTextureStageState(0,D3DTSS_BUMPENVMAT00,F2DW(matBumpMat._11));&lt;br&gt;   m_pD3DDevice-&amp;gt;SetTextureStageState(0,D3DTSS_BUMPENVMAT01,F2DW(matBumpMat._12));&lt;br&gt;   m_pD3DDevice-&amp;gt;SetTextureStageState(0,D3DTSS_BUMPENVMAT10,F2DW(matBumpMat._21));&lt;br&gt;   m_pD3DDevice-&amp;gt;SetTextureStageState(0,D3DTSS_BUMPENVMAT11,F2DW(matBumpMat._22)); 
&lt;p&gt;&lt;br&gt;上述方法需要检测是否支持 D3DTEXOPCAPS_BUMPENVMAP 
&lt;p&gt;关于bump mapping参见msdn: 
&lt;p&gt;1. Bump Mapping (Direct3D 9)&lt;br&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb172379.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb172379.aspx&lt;/a&gt; 
&lt;p&gt;2. Bump Mapping Formulas (Direct3D 9)&lt;br&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb172380.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb172380.aspx&lt;/a&gt; 
&lt;p&gt;3. Bump Map Pixel Formats (Direct3D 9)&lt;br&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb172381.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb172381.aspx&lt;/a&gt; 
&lt;p&gt;4.Using Bump Mapping (Direct3D 9)&lt;br&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/bb206304.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb206304.aspx&lt;/a&gt; 
&lt;p&gt;原理参见第2点,使用方法参见第4点 
&lt;p&gt;  
&lt;p&gt;附: 
&lt;p&gt;关于bumpmap图是可以直接程序创建的,下面给出该方法的代码(这是从 盖小房（BYOH）source code中看到的,直接贴这里可参考): 
&lt;p&gt;LPDIRECT3DTEXTURE9 CreateBumpMap(LPDIRECT3DDEVICE9 device,  DWORD dwWidth, DWORD dwHeight,D3DFORMAT d3dBumpFormat )&lt;br&gt;{&lt;br&gt; LPDIRECT3DTEXTURE9 psBumpMap; 
&lt;p&gt;// Create the bump map texture&lt;br&gt; if( FAILED( device-&amp;gt;CreateTexture( dwWidth, dwHeight, 1, 0/* Usage */,&lt;br&gt;  d3dBumpFormat, D3DPOOL_MANAGED,&amp;amp;psBumpMap,NULL ) ) )&lt;br&gt;  return NULL; 
&lt;p&gt;// Lock the surface and write in some bumps for the waves&lt;br&gt; D3DLOCKED_RECT d3dlr;&lt;br&gt; psBumpMap-&amp;gt;LockRect( 0, &amp;amp;d3dlr, 0, 0 );&lt;br&gt; CHAR* pDst = (CHAR*)d3dlr.pBits;&lt;br&gt; CHAR  iDu=0, iDv=0; 
&lt;p&gt; for( DWORD y=0; y&amp;lt;dwHeight; y++ )&lt;br&gt; {&lt;br&gt;  CHAR* pPixel = pDst;&lt;br&gt;  for( DWORD x=0; x&amp;lt;dwWidth; x++ )&lt;br&gt;  {&lt;br&gt;   FLOAT fx = x/(FLOAT)dwWidth - 0.5f;&lt;br&gt;   FLOAT fy = y/(FLOAT)dwHeight - 0.5f;&lt;br&gt;   FLOAT r = sqrtf( fx*fx + fy*fy );&lt;br&gt;//  iDu  = (CHAR)( 32 * cosf( 300.0f * r ) * expf( -r * 5.0f ) );&lt;br&gt;   iDu += (CHAR)( 128 * cosf( 100.0f * ( fx + fy ) ) );&lt;br&gt;//  iDu += (CHAR)( 16 * cosf( 140.0f * ( fx * 0.85f - fy ) ) );&lt;br&gt;//  iDv  = (CHAR)( 32 * sinf( 300.0f * r ) * expf( -r * 5.0f ) );&lt;br&gt;   iDv += (CHAR)( 128 * sinf( 100.0f * ( fx + fy ) ) );&lt;br&gt;//  iDv += (CHAR)( 16 * sinf( 140.0f * ( fx * 0.85f - fy ) ) );&lt;br&gt;   *pPixel++ = iDu;&lt;br&gt;   *pPixel++ = iDv;&lt;br&gt;  }&lt;br&gt;  pDst += d3dlr.Pitch;&lt;br&gt; }&lt;br&gt; psBumpMap-&amp;gt;UnlockRect(0); 
&lt;p&gt; return psBumpMap;&lt;br&gt;}&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+d3d%e4%b8%ad%e5%ae%9e%e7%8e%b0%e7%ae%80%e5%8d%95%e7%9a%84%e6%b0%b4&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1046.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1046.entry</guid><pubDate>Mon, 12 Nov 2007 08:14:32 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1046/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1046.entry#comment</wfw:comment><dcterms:modified>2007-11-13T01:02:46Z</dcterms:modified></item><item><title>区域选择显示图</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1041.entry</link><description>&lt;p&gt;最近做的魔兽里区域选择显示图, 这个与地面贴花不一样,要求边框不会因为区域放大而跟着 
&lt;p&gt;缩放(与魔兽不一样的是中间不用小格子省点顶点), 而关于地面贴花可以用匹配地形网格再放绽放uv进行调整 
&lt;p&gt;并且设置边框模式或clamp模式(图片边框需透明)而简单得到,当然复杂的也可以用投影贴图来作,(类似于实时影子的作法: 
&lt;p&gt;先渲染场景深度,再调相机到灯光处渲染需需投影的物件到贴图上,最后将贴图以顶视图方式投影到地形上) 
&lt;p&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXLNVLMh1Y4xKcYpr9P7-MfUDzZraoLoquOngt-dI7TGEJ88KaaafPc7VEtZq9V_E9g" target="_blank"&gt;&lt;img height=200 alt="{A751E3AF-7568-4CEE-9B5C-8086E61082FB}" src="http://byfiles.storage.live.com/y1pQyiAAjFojXLNVLMh1Y4xKcYpr9P7-MfUDzZraoLoquOngt-dI7TGEJ88KaaafPc7VEtZq9V_E9g" width=238&gt;&lt;/a&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXImNQq1l1vNFNqc8k-VmTrlsqy3tSNYXOnWx44mhS_jAAMhwa-ZRNbPk0e0PqYxokg" target="_blank"&gt;&lt;img height=200 alt="{FF92B66A-87B6-4B20-A4C5-C2AEFF66E7E9}" src="http://byfiles.storage.live.com/y1pQyiAAjFojXImNQq1l1vNFNqc8k-VmTrlsqy3tSNYXOnWx44mhS_jAAMhwa-ZRNbPk0e0PqYxokg" width=229&gt;&lt;/a&gt;&lt;a href="http://byfiles.storage.live.com/y1pQyiAAjFojXIN0aBly_rdARq4GD98hOx6cL56sU6Mh94JDfPQC75jtdyMdU-TWrqJkSc9v8YMn2E" target="_blank"&gt;&lt;/a&gt; 
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e5%8c%ba%e5%9f%9f%e9%80%89%e6%8b%a9%e6%98%be%e7%a4%ba%e5%9b%be&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1041.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1041.entry</guid><pubDate>Thu, 08 Nov 2007 01:38:22 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1041/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1041.entry#comment</wfw:comment><dcterms:modified>2007-11-08T01:39:01Z</dcterms:modified></item><item><title>real time 3d scene post processing</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1039.entry</link><description>&lt;div&gt;
&lt;div&gt;具体请参见&amp;lt;&amp;lt;real time 3d scene post processing&amp;gt;&amp;gt;:&lt;br&gt;&lt;a href="http://ati.amd.com/developer/gdce/Oat-ScenePostprocessing.pdf"&gt;http://ati.amd.com/developer/gdce/Oat-ScenePostprocessing.pdf&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下面说说简单的hdr原理, &lt;br&gt;读取hdr文件&lt;br&gt;将颜色转到64位浮点原贴图中&lt;br&gt;将原贴图以1/4大小渲染到downsample贴图中（只取高光，即亮度低于１的被过滤掉）&lt;br&gt;对downsample进行横向和纵向blur&lt;/div&gt;
&lt;div&gt;最后将blur与原贴图合成tone map, 即按比例混合在一起（并调整uv越近图中心的越亮，最后还进行高光指数pow）&lt;br&gt;最后的tone map就是最终的贴图了&lt;/div&gt;
&lt;div&gt; 具体参见hdr教程参见(非常简单):&lt;br&gt;&lt;a href="http://www.gamedev.net/columns/hardcore/hdrrendering/"&gt;http://www.gamedev.net/columns/hardcore/hdrrendering/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;另外bloom作法一般是类似的(只是可以不用精度浮点贴图)：&lt;/div&gt;
&lt;div&gt;渲染场景到原贴图&lt;/div&gt;
&lt;div&gt;取出高亮部分（只取高光，即亮度在一定值以上）&lt;/div&gt;
&lt;div&gt;blur 一下&lt;/div&gt;
&lt;div&gt;最后与原贴图混合一下得出最终的tone map&lt;/div&gt;
&lt;div&gt;&lt;br&gt;附&lt;br&gt;如下是azure的一个bloom处理方法:&lt;br&gt;&lt;a href="http://www.azure.com.cn/article.asp?id=195"&gt;http://www.azure.com.cn/article.asp?id=195&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;uniform sampler2D texture;&lt;br&gt;uniform float blurfactor;&lt;br&gt;uniform float expfactor;&lt;br&gt;const float cdelp = 0.001953125;&lt;br&gt;uniform float sharpness;&lt;/div&gt;
&lt;div&gt;float4 xposure(float4 cl,float e)&lt;br&gt;{&lt;br&gt; return ( exp(expfactor) - exp(expfactor-e)) * cl;&lt;br&gt;}&lt;/div&gt;
&lt;div&gt;void main( float2 texcoord : TEXCOORD0, &lt;br&gt;    out float4 finalColor : COLOR)&lt;br&gt;{&lt;br&gt; float delp = blurfactor* cdelp;&lt;br&gt; float4 texColor = tex2D(texture, texcoord);&lt;br&gt; float4 color = texColor*2.0 / 22.0;&lt;br&gt; color += tex2D(texture,float2(texcoord.x+delp, texcoord.y+delp))*5.0 /22.0;&lt;br&gt; color += tex2D(texture,float2(texcoord.x+delp, texcoord.y- delp))*5.0 /22.0;&lt;br&gt; color += tex2D(texture,float2(texcoord.x- delp, texcoord.y- delp))*5.0 /22.0;&lt;br&gt; color += tex2D(texture,float2(texcoord.x- delp, texcoord.y+delp))*5.0 /22.0; &lt;br&gt; float e = color.r * 0.3 + color.g * 0.59 + color.b * 11;&lt;br&gt; finalColor = xposure(texColor*sharpness + color*(1-sharpness),e);&lt;br&gt;}&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="http://freespace.virgin.net/hugo.elias/graphics/x_posure.htm"&gt;&lt;/a&gt;&lt;/div&gt; &lt;/div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+real+time+3d+scene+post+processing&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1039.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1039.entry</guid><pubDate>Thu, 01 Nov 2007 03:20:55 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1039/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1039.entry#comment</wfw:comment><dcterms:modified>2007-11-01T05:03:03Z</dcterms:modified></item><item><title>设备获取</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1032.entry</link><description>&lt;div&gt;设备获取&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;windows.h&amp;gt;&lt;br&gt;#include &amp;lt;setupapi.h&amp;gt;&lt;br&gt;#include &amp;lt;devguid.h&amp;gt;&lt;br&gt;#include &amp;lt;regstr.h&amp;gt;&lt;/div&gt;
&lt;div&gt;#pragma comment(lib, &amp;quot;setupapi.lib&amp;quot;)&lt;/div&gt;
&lt;div&gt;int main( int argc, char *argv[ ], char *envp[ ] )&lt;br&gt;{&lt;br&gt;    HDEVINFO hDevInfo;&lt;br&gt;    SP_DEVINFO_DATA DeviceInfoData;&lt;br&gt;    DWORD i;&lt;/div&gt;
&lt;div&gt;    // Create a HDEVINFO with all present devices.&lt;br&gt;    hDevInfo = SetupDiGetClassDevs(NULL,&lt;br&gt;        0, // Enumerator&lt;br&gt;        0,&lt;br&gt;        DIGCF_PRESENT | DIGCF_ALLCLASSES );&lt;br&gt;    &lt;br&gt;    if (hDevInfo == INVALID_HANDLE_VALUE)&lt;br&gt;    {&lt;br&gt;        // Insert error handling here.&lt;br&gt;        return 1;&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    // Enumerate through all devices in Set.&lt;br&gt;    &lt;br&gt;    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);&lt;br&gt;    for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&lt;br&gt;        &amp;amp;DeviceInfoData);i++)&lt;br&gt;    {&lt;br&gt;        DWORD DataT;&lt;br&gt;        LPTSTR buffer = NULL;&lt;br&gt;        DWORD buffersize = 0;&lt;br&gt;        &lt;br&gt;        // &lt;br&gt;        // Call function with null to begin with, &lt;br&gt;        // then use the returned buffer size &lt;br&gt;        // to Alloc the buffer. Keep calling until&lt;br&gt;        // success or an unknown failure.&lt;br&gt;        // &lt;br&gt;        while (!SetupDiGetDeviceRegistryProperty(&lt;br&gt;            hDevInfo,&lt;br&gt;            &amp;amp;DeviceInfoData,&lt;br&gt;            SPDRP_DEVICEDESC,&lt;br&gt;            &amp;amp;DataT,&lt;br&gt;            (PBYTE)buffer,&lt;br&gt;            buffersize,&lt;br&gt;            &amp;amp;buffersize))&lt;br&gt;        {&lt;br&gt;            if (GetLastError() == &lt;br&gt;                ERROR_INSUFFICIENT_BUFFER)&lt;br&gt;            {&lt;br&gt;                // Change the buffer size.&lt;br&gt;                if (buffer) LocalFree(buffer);&lt;br&gt;                buffer = (char*)LocalAlloc(LPTR,buffersize);&lt;br&gt;            }&lt;br&gt;            else&lt;br&gt;            {&lt;br&gt;                // Insert error handling here.&lt;br&gt;                break;&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;        &lt;br&gt;        printf(&amp;quot;Result:[%s]\n&amp;quot;,buffer);&lt;br&gt;        &lt;br&gt;        if (buffer) LocalFree(buffer);&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    &lt;br&gt;    if ( GetLastError()!=NO_ERROR &amp;amp;&amp;amp;&lt;br&gt;         GetLastError()!=ERROR_NO_MORE_ITEMS )&lt;br&gt;    {&lt;br&gt;        // Insert error handling here.&lt;br&gt;        return 1;&lt;br&gt;    }&lt;br&gt;    &lt;br&gt;    //  Cleanup&lt;br&gt;    SetupDiDestroyDeviceInfoList(hDevInfo);&lt;br&gt;    &lt;br&gt;    return 0;&lt;br&gt;}&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e8%ae%be%e5%a4%87%e8%8e%b7%e5%8f%96&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1032.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1032.entry</guid><pubDate>Tue, 23 Oct 2007 07:11:51 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1032/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1032.entry#comment</wfw:comment><dcterms:modified>2007-10-23T07:11:51Z</dcterms:modified></item><item><title>获取显存的方法</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1019.entry</link><description>&lt;div&gt;获取显存的方法: &lt;br&gt;1. dx7 ddraw方法:&lt;br&gt;   GetAvailableVidMem( DWORD &amp;amp;dwTotal, DWORD &amp;amp;dwFree );&lt;br&gt;   主要问题：&lt;br&gt;      发现在一台机器的vista系统下创建ddraw时crash!&lt;br&gt;2. dx9下设备查询方法: &lt;br&gt;   GetAvailableTextureMem();&lt;br&gt;   主要问题:  &lt;br&gt;      只获得剩余显存大小（包括AGP），不知道总显存大小.&lt;br&gt;此函数msdn说明:&lt;br&gt;IDirect3DDevice9::GetAvailableTextureMem() returns the total available memory, including AGP. Allocating resources based on an assumption of how much video memory you have is not a great idea. For example, what if the card is running under a Unified Memory Architecture (UMA) or is able to compress the textures? There might be more space available than you might have thought. You should create resources and check for 'out of memory' errors, then scale back on the textures. For example, you could remove the top mip-levels of your textures.&lt;/div&gt;
&lt;div&gt;3. dxdiag的方法:&lt;br&gt;   需要创建dxidag相关的com对象来查询，只知道总的，不知道当前所剩的.&lt;/div&gt;
&lt;div&gt;4. 其它（16位系统的中断获取方法不在考虑范围内）:&lt;br&gt;   通过WMI获取系统信息(包括显卡及显存信息)&lt;/div&gt;
&lt;div&gt;&lt;br&gt;我们的解决方案：&lt;br&gt;因为第３和第４方法相对麻烦，而且不知道会不会因为写多这些代码在不同的玩家机器上引起其它的crash问题&lt;br&gt;所以不考虑第３和第４方法.&lt;/div&gt;
&lt;div&gt;目前MPRender提供第１和第２种方法，第１种ddraw方法用在初始init.log中并且判断系统如果是vista的系统第一种方法将不起作用.　当crash发现需输出显存信息时先尝试使用第１种ddraw方法, 不行（vista系统不使用）则使用第２种方法仅打印所剩显存大小.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;第４种方式csdn论坛上一位网友给出的代码:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;// videmem.cpp : Defines the entry point for the console application.&lt;br&gt;//&lt;/div&gt;
&lt;div&gt;&lt;br&gt;#include &amp;quot;stdafx.h&amp;quot;&lt;br&gt;//   Get   video   card   name   and   memory   size.   &lt;br&gt;//tested   by   onega   VC20003,windows   2003   &lt;/div&gt;
&lt;div&gt;#include   &amp;quot;stdafx.h&amp;quot;   &lt;br&gt;#define   _WIN32_DCOM   &lt;br&gt;#include   &amp;lt;iostream&amp;gt;   &lt;br&gt;using   namespace   std;   &lt;br&gt;#include   &amp;lt;comdef.h&amp;gt;   &lt;br&gt;#include   &amp;lt;Wbemidl.h&amp;gt;   &lt;/div&gt;
&lt;div&gt;#   pragma   comment(lib,   &amp;quot;wbemuuid.lib&amp;quot;)   &lt;/div&gt;
&lt;div&gt;int   main(int   argc,   char   **argv)   &lt;br&gt;{   &lt;br&gt; HRESULT   hres;   &lt;br&gt;    &lt;br&gt; //   Step   1:   --------------------------------------------------   &lt;br&gt; //   Initialize   COM.   ------------------------------------------   &lt;br&gt;    &lt;br&gt; hres   =     CoInitializeEx(0,   COINIT_MULTITHREADED);     &lt;br&gt; if   (FAILED(hres))   &lt;br&gt; {   &lt;br&gt;  cout   &amp;lt;&amp;lt;   &amp;quot;Failed   to   initialize   COM   library.   Error   code   =   0x&amp;quot;     &lt;br&gt;   &amp;lt;&amp;lt;   hex   &amp;lt;&amp;lt;   hres   &amp;lt;&amp;lt;   endl;   &lt;br&gt;  return   1;                                     //   Program   has   failed.   &lt;br&gt; }   &lt;br&gt;    &lt;br&gt; //   Step   2:   --------------------------------------------------   &lt;br&gt; //   Set   general   COM   security   levels   --------------------------   &lt;br&gt; //   Note:   If   you   are   using   Windows   2000,   you   need   to   specify   -   &lt;br&gt; //   the   default   authentication   credentials   for   a   user   by   using   &lt;br&gt; //   a   SOLE_AUTHENTICATION_LIST   structure   in   the   pAuthList   ----   &lt;br&gt; //   parameter   of   CoInitializeSecurity   ------------------------   &lt;br&gt;    &lt;br&gt; hres   =     CoInitializeSecurity(   &lt;br&gt;  NULL,     &lt;br&gt;  -1,                                                     //   COM   authentication   &lt;br&gt;  NULL,                                                 //   Authentication   services   &lt;br&gt;  NULL,                                                 //   Reserved   &lt;br&gt;  RPC_C_AUTHN_LEVEL_DEFAULT,       //   Default   authentication     &lt;br&gt;  RPC_C_IMP_LEVEL_IMPERSONATE,   //   Default   Impersonation       &lt;br&gt;  NULL,                                                 //   Authentication   info   &lt;br&gt;  EOAC_NONE,                                       //   Additional   capabilities     &lt;br&gt;  NULL                                                   //   Reserved   &lt;br&gt;  );   &lt;br&gt;    &lt;br&gt;    &lt;br&gt; if   (FAILED(hres))   &lt;br&gt; {   &lt;br&gt;  cout   &amp;lt;&amp;lt;   &amp;quot;Failed   to   initialize   security.   Error   code   =   0x&amp;quot;     &lt;br&gt;   &amp;lt;&amp;lt;   hex   &amp;lt;&amp;lt;   hres   &amp;lt;&amp;lt;   endl;   &lt;br&gt;  CoUninitialize();   &lt;br&gt;  return   1;                                         //   Program   has   failed.   &lt;br&gt; }   &lt;br&gt;    &lt;br&gt; //   Step   3:   ---------------------------------------------------   &lt;br&gt; //   Obtain   the   initial   locator   to   WMI   -------------------------   &lt;br&gt;    &lt;br&gt; IWbemLocator   *pLoc   =   NULL;   &lt;br&gt;    &lt;br&gt; hres   =   CoCreateInstance(   &lt;br&gt;  CLSID_WbemLocator,                             &lt;br&gt;  0,     &lt;br&gt;  CLSCTX_INPROC_SERVER,     &lt;br&gt;  IID_IWbemLocator,   (LPVOID   *)   &amp;amp;pLoc);   &lt;br&gt;    &lt;br&gt; if   (FAILED(hres))   &lt;br&gt; {   &lt;br&gt;  cout   &amp;lt;&amp;lt;   &amp;quot;Failed   to   create   IWbemLocator   object.&amp;quot;   &lt;br&gt;   &amp;lt;&amp;lt;   &amp;quot;   Err   code   =   0x&amp;quot;   &lt;br&gt;   &amp;lt;&amp;lt;   hex   &amp;lt;&amp;lt;   hres   &amp;lt;&amp;lt;   endl;   &lt;br&gt;  CoUninitialize();   &lt;br&gt;  return   1;                                   //   Program   has   failed.   &lt;br&gt; }   &lt;br&gt;    &lt;br&gt; //   Step   4:   -----------------------------------------------------   &lt;br&gt; //   Connect   to   WMI   through   the   IWbemLocator::ConnectServer   method   &lt;br&gt;    &lt;br&gt; IWbemServices   *pSvc   =   NULL;   &lt;br&gt;    &lt;br&gt; //   Connect   to   the   root\cimv2   namespace   with   &lt;br&gt; //   the   current   user   and   obtain   pointer   pSvc   &lt;br&gt; //   to   make   IWbemServices   calls.   &lt;br&gt; hres   =   pLoc-&amp;gt;ConnectServer(   &lt;br&gt;  _bstr_t(L&amp;quot;ROOT\\CIMV2&amp;quot;),   //   Object   path   of   WMI   namespace   &lt;br&gt;  NULL,                                         //   User   name.   NULL   =   current   user   &lt;br&gt;  NULL,                                         //   User   password.   NULL   =   current   &lt;br&gt;  0,                                               //   Locale.   NULL   indicates   current                             &lt;br&gt;  NULL,                                         //   Security   flags.   &lt;br&gt;  0,                                               //   Authority   (e.g.   Kerberos)                   &lt;br&gt;  0,                                               //   Context   object     &lt;br&gt;  &amp;amp;pSvc                                         //   pointer   to   IWbemServices   proxy   &lt;br&gt;  );   &lt;br&gt;    &lt;br&gt; if   (FAILED(hres))   &lt;br&gt; {   &lt;br&gt;  cout   &amp;lt;&amp;lt;   &amp;quot;Could   not   connect.   Error   code   =   0x&amp;quot;     &lt;br&gt;   &amp;lt;&amp;lt;   hex   &amp;lt;&amp;lt;   hres   &amp;lt;&amp;lt;   endl;   &lt;br&gt;  pLoc-&amp;gt;Release();             &lt;br&gt;  CoUninitialize();   &lt;br&gt;  return   1;                                 //   Program   has   failed.   &lt;br&gt; }   &lt;br&gt;    &lt;br&gt; cout   &amp;lt;&amp;lt;   &amp;quot;Connected   to   ROOT\\CIMV2   WMI   namespace&amp;quot;   &amp;lt;&amp;lt;   endl;   &lt;br&gt;    &lt;br&gt;    &lt;br&gt; //   Step   5:   --------------------------------------------------   &lt;br&gt; //   Set   security   levels   on   the   proxy   -------------------------   &lt;br&gt;    &lt;br&gt; hres   =   CoSetProxyBlanket(   &lt;br&gt;  pSvc,                                                 //   Indicates   the   proxy   to   set   &lt;br&gt;  RPC_C_AUTHN_WINNT,                       //   RPC_C_AUTHN_xxx   &lt;br&gt;  RPC_C_AUTHZ_NONE,                         //   RPC_C_AUTHZ_xxx   &lt;br&gt;  NULL,                                                 //   Server   principal   name     &lt;br&gt;  RPC_C_AUTHN_LEVEL_CALL,             //   RPC_C_AUTHN_LEVEL_xxx     &lt;br&gt;  RPC_C_IMP_LEVEL_IMPERSONATE,   //   RPC_C_IMP_LEVEL_xxx   &lt;br&gt;  NULL,                                                 //   client   identity   &lt;br&gt;  EOAC_NONE                                         //   proxy   capabilities     &lt;br&gt;  );   &lt;br&gt;    &lt;br&gt; if   (FAILED(hres))   &lt;br&gt; {   &lt;br&gt;  cout   &amp;lt;&amp;lt;   &amp;quot;Could   not   set   proxy   blanket.   Error   code   =   0x&amp;quot;     &lt;br&gt;   &amp;lt;&amp;lt;   hex   &amp;lt;&amp;lt;   hres   &amp;lt;&amp;lt;   endl;   &lt;br&gt;  pSvc-&amp;gt;Release();   &lt;br&gt;  pLoc-&amp;gt;Release();             &lt;br&gt;  CoUninitialize();   &lt;br&gt;  return   1;                               //   Program   has   failed.   &lt;br&gt; }   &lt;br&gt;    &lt;br&gt; //   Step   6:   --------------------------------------------------   &lt;br&gt; //   Use   the   IWbemServices   pointer   to   make   requests   of   WMI   ----   &lt;br&gt;    &lt;br&gt; //   For   example,   get   the   name   of   the   operating   system   &lt;br&gt; _bstr_t   wmi_query_str(&amp;quot;SELECT   *   FROM   Win32_VideoController&amp;quot;);   &lt;br&gt; //bstr_t(&amp;quot;SELECT   *   FROM   Win32_OperatingSystem&amp;quot;)   &lt;br&gt; IEnumWbemClassObject*   pEnumerator   =   NULL;   &lt;br&gt; hres   =   pSvc-&amp;gt;ExecQuery(   &lt;br&gt;  bstr_t(&amp;quot;WQL&amp;quot;),     &lt;br&gt;  wmi_query_str,   &lt;br&gt;  WBEM_FLAG_FORWARD_ONLY   |   WBEM_FLAG_RETURN_IMMEDIATELY,     &lt;br&gt;  NULL,   &lt;br&gt;  &amp;amp;pEnumerator);   &lt;br&gt;    &lt;br&gt; if   (FAILED(hres))   &lt;br&gt; {   &lt;br&gt;  cout   &amp;lt;&amp;lt;   &amp;quot;Query   for   operating   system   name   failed.&amp;quot;   &lt;br&gt;   &amp;lt;&amp;lt;   &amp;quot;   Error   code   =   0x&amp;quot;     &lt;br&gt;   &amp;lt;&amp;lt;   hex   &amp;lt;&amp;lt;   hres   &amp;lt;&amp;lt;   endl;   &lt;br&gt;  pSvc-&amp;gt;Release();   &lt;br&gt;  pLoc-&amp;gt;Release();   &lt;br&gt;  CoUninitialize();   &lt;br&gt;  return   1;                               //   Program   has   failed.   &lt;br&gt; }   &lt;br&gt;    &lt;br&gt; //   Step   7:   -------------------------------------------------   &lt;br&gt; //   Get   the   data   from   the   query   in   step   6   -------------------   &lt;br&gt;    &lt;br&gt; IWbemClassObject   *pclsObj;   &lt;br&gt; ULONG   uReturn   =   0;   &lt;br&gt;    &lt;br&gt; while   (pEnumerator)   &lt;br&gt; {   &lt;br&gt;  HRESULT   hr   =   pEnumerator-&amp;gt;Next(WBEM_INFINITE,   1,     &lt;br&gt;   &amp;amp;pclsObj,   &amp;amp;uReturn);   &lt;br&gt;  &lt;br&gt;  if(0   ==   uReturn)   &lt;br&gt;  {   &lt;br&gt;   break;   &lt;br&gt;  }   &lt;br&gt;  &lt;br&gt;  VARIANT   vtProp;   &lt;br&gt;  VariantInit(&amp;amp;vtProp);   &lt;br&gt;  &lt;br&gt;  //   Get   the   value   of   the   Name   property   &lt;br&gt;  hr   =   pclsObj-&amp;gt;Get(L&amp;quot;Caption&amp;quot;,   0,   &amp;amp;vtProp,   0,   0);   &lt;br&gt;  wcout   &amp;lt;&amp;lt;   &amp;quot;   Caption   :   &amp;quot;   &amp;lt;&amp;lt;   vtProp.bstrVal   &amp;lt;&amp;lt;   endl;   &lt;br&gt;  VariantClear(&amp;amp;vtProp);   &lt;br&gt;  &lt;br&gt;  hr   =   pclsObj-&amp;gt;Get(L&amp;quot;AdapterRAM&amp;quot;,   0,   &amp;amp;vtProp,   0,   0);   &lt;br&gt;  wcout   &amp;lt;&amp;lt;   &amp;quot;   AdapterRAM   :   &amp;quot;&amp;lt;&amp;lt;   vtProp.lVal/(1024*1024)&amp;lt;&amp;lt;&amp;quot;   MB&amp;quot;   &amp;lt;&amp;lt;   endl;   &lt;br&gt;  VariantClear(&amp;amp;vtProp);   &lt;br&gt;  &lt;br&gt; }   &lt;br&gt;    &lt;br&gt; //   Cleanup   &lt;br&gt; //   ========   &lt;br&gt;    &lt;br&gt; pSvc-&amp;gt;Release();   &lt;br&gt; pLoc-&amp;gt;Release();   &lt;br&gt; pEnumerator-&amp;gt;Release();   &lt;br&gt; pclsObj-&amp;gt;Release();   &lt;br&gt; CoUninitialize();   &lt;br&gt;    &lt;br&gt; return   0;       //   Program   successfully   completed.   &lt;br&gt;    &lt;br&gt;  }&lt;br&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e8%8e%b7%e5%8f%96%e6%98%be%e5%ad%98%e7%9a%84%e6%96%b9%e6%b3%95&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1019.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1019.entry</guid><pubDate>Thu, 27 Sep 2007 06:35:04 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1019/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1019.entry#comment</wfw:comment><dcterms:modified>2007-09-27T06:35:04Z</dcterms:modified></item><item><title>ogl绘制两圆(转)</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1017.entry</link><description>&lt;div&gt;ogl绘制两圆 (转)&lt;br&gt;  &lt;/div&gt;
&lt;div&gt;#include &amp;lt;math.h&amp;gt; &lt;br&gt;#include &amp;lt;vector&amp;gt; &lt;br&gt;#include &amp;lt;gl/glut.h&amp;gt; &lt;/div&gt;
&lt;div&gt;#pragma comment(lib, &amp;quot;opengl32.lib&amp;quot;) &lt;br&gt;#pragma comment(lib, &amp;quot;glu32.lib&amp;quot;) &lt;br&gt;#pragma comment(lib, &amp;quot;glut32.lib&amp;quot;) &lt;/div&gt;
&lt;div&gt;const float PI = 3.14159265358979323846f; &lt;/div&gt;
&lt;div&gt;struct MyVector &lt;br&gt;{ &lt;br&gt;float x; &lt;br&gt;float y; &lt;br&gt;float z; &lt;br&gt;}; &lt;/div&gt;
&lt;div&gt;&lt;br&gt;class StackedSphere &lt;br&gt;{ &lt;br&gt;public: &lt;/div&gt;
&lt;div&gt;StackedSphere(const float radius = 1.0f, const unsigned int stacks = 8, const unsigned int slices = 16); &lt;br&gt;void render() const; &lt;/div&gt;
&lt;div&gt;private: &lt;br&gt;std::vector&amp;lt;MyVector&amp;gt; geometryData_; &lt;br&gt;std::vector&amp;lt;unsigned short&amp;gt; indexData_; &lt;/div&gt;
&lt;div&gt;}; &lt;/div&gt;
&lt;div&gt;StackedSphere::StackedSphere(const float radius, const unsigned int stacks, const unsigned int slices) &lt;br&gt;{ &lt;br&gt;unsigned int stackNumber = 0; &lt;br&gt;for (stackNumber = 0; stackNumber &amp;lt;= stacks; ++stackNumber) &lt;br&gt;{ &lt;br&gt;for (unsigned int sliceNumber = 0; sliceNumber &amp;lt; slices; ++sliceNumber) &lt;br&gt;{ &lt;br&gt;float theta = stackNumber * PI / stacks; &lt;br&gt;float phi = sliceNumber * 2 * PI / slices; &lt;br&gt;float sinTheta = sin(theta); &lt;br&gt;float cosTheta = cos(theta); &lt;/div&gt;
&lt;div&gt;float sinPhi = sin(phi); &lt;br&gt;float cosPhi = cos(phi); &lt;/div&gt;
&lt;div&gt;MyVector ge = {radius * cosPhi * sinTheta, radius * sinPhi * sinTheta, radius * cosTheta}; &lt;br&gt;geometryData_.push_back(ge); &lt;br&gt;} &lt;br&gt;} &lt;br&gt;for (stackNumber = 0; stackNumber &amp;lt; stacks; ++stackNumber) &lt;br&gt;{ &lt;br&gt;for (unsigned int sliceNumber = 0; sliceNumber &amp;lt;= slices; ++sliceNumber) &lt;br&gt;{ &lt;br&gt;indexData_.push_back((stackNumber * slices) + (sliceNumber % slices)); &lt;br&gt;indexData_.push_back(((stackNumber + 1) * slices) + (sliceNumber % slices)); &lt;br&gt;} &lt;br&gt;} &lt;br&gt;} &lt;/div&gt;
&lt;div&gt;void StackedSphere::render() const &lt;br&gt;{ &lt;br&gt;glVertexPointer(3, GL_FLOAT, 0, &amp;amp;geometryData_[0]); &lt;br&gt;glEnableClientState(GL_VERTEX_ARRAY); &lt;br&gt;glDrawElements(GL_TRIANGLE_STRIP, indexData_.size(), GL_UNSIGNED_SHORT, &amp;amp;indexData_[0]); &lt;br&gt;} &lt;/div&gt;
&lt;div&gt;class SpiralSphere &lt;br&gt;{ &lt;/div&gt;
&lt;div&gt;public: &lt;/div&gt;
&lt;div&gt;SpiralSphere(const float radius = 1.0f, const unsigned int loops = 8, const unsigned int segmentsPerLoop = 16); &lt;br&gt;void render() const; &lt;/div&gt;
&lt;div&gt;private: &lt;/div&gt;
&lt;div&gt;std::vector&amp;lt;MyVector &amp;gt; geometryData_; &lt;br&gt;std::vector&amp;lt;unsigned short&amp;gt; indexData_; &lt;/div&gt;
&lt;div&gt;}; &lt;/div&gt;
&lt;div&gt;SpiralSphere::SpiralSphere(const float radius, const unsigned int loops, const unsigned int segmentsPerLoop) &lt;br&gt;{ &lt;br&gt;unsigned int loopSegmentNumber = 0; &lt;br&gt;for (loopSegmentNumber = 0; loopSegmentNumber &amp;lt; segmentsPerLoop; ++loopSegmentNumber) &lt;br&gt;{ &lt;br&gt;float theta = 0; &lt;br&gt;float phi = loopSegmentNumber * 2 * PI / segmentsPerLoop; &lt;br&gt;float sinTheta = sin(theta); &lt;br&gt;float sinPhi = sin(phi); &lt;br&gt;float cosTheta = cos(theta); &lt;br&gt;float cosPhi = cos(phi); &lt;/div&gt;
&lt;div&gt;MyVector ge = {radius * cosPhi * sinTheta, radius * sinPhi * sinTheta, radius * cosTheta}; &lt;br&gt;geometryData_.push_back(ge); &lt;/div&gt;
&lt;div&gt;} &lt;/div&gt;
&lt;div&gt;unsigned int loopNumber = 0; &lt;br&gt;for (loopNumber = 0; loopNumber &amp;lt;= loops; ++loopNumber) &lt;br&gt;{ &lt;br&gt;for (unsigned int loopSegmentNumber = 0; loopSegmentNumber &amp;lt; segmentsPerLoop; ++loopSegmentNumber) &lt;br&gt;{ &lt;br&gt;float theta = (loopNumber * PI / loops) + ((PI * loopSegmentNumber) / (segmentsPerLoop * loops)); &lt;br&gt;if (loopNumber == loops) &lt;br&gt;{ &lt;br&gt;theta = PI; &lt;br&gt;} &lt;br&gt;float phi = loopSegmentNumber * 2 * PI / segmentsPerLoop; &lt;br&gt;float sinTheta = sin(theta); &lt;br&gt;float sinPhi = sin(phi); &lt;br&gt;float cosTheta = cos(theta); &lt;br&gt;float cosPhi = cos(phi); &lt;/div&gt;
&lt;div&gt;MyVector ge = {radius * cosPhi * sinTheta, radius * sinPhi * sinTheta, radius * cosTheta}; &lt;br&gt;geometryData_.push_back(ge); &lt;/div&gt;
&lt;div&gt;} &lt;br&gt;} &lt;/div&gt;
&lt;div&gt;for (loopSegmentNumber = 0; loopSegmentNumber &amp;lt; segmentsPerLoop; ++loopSegmentNumber) &lt;br&gt;{ &lt;br&gt;indexData_.push_back(loopSegmentNumber); &lt;br&gt;indexData_.push_back(segmentsPerLoop + loopSegmentNumber); &lt;br&gt;} &lt;/div&gt;
&lt;div&gt;for (loopNumber = 0; loopNumber &amp;lt; loops; ++loopNumber) &lt;br&gt;{ &lt;br&gt;for (unsigned int loopSegmentNumber = 0; loopSegmentNumber &amp;lt; segmentsPerLoop; ++loopSegmentNumber) &lt;br&gt;{ &lt;br&gt;indexData_.push_back(((loopNumber + 1) * segmentsPerLoop) + loopSegmentNumber); &lt;br&gt;indexData_.push_back(((loopNumber + 2) * segmentsPerLoop) + loopSegmentNumber); &lt;br&gt;} &lt;br&gt;} &lt;br&gt;} &lt;/div&gt;
&lt;div&gt;void SpiralSphere::render() const &lt;br&gt;{ &lt;br&gt;glVertexPointer(3, GL_FLOAT, 0, &amp;amp;geometryData_[0]); &lt;br&gt;glEnableClientState(GL_VERTEX_ARRAY); &lt;br&gt;glDrawElements(GL_TRIANGLE_STRIP, indexData_.size(), GL_UNSIGNED_SHORT, &amp;amp;indexData_[0]); &lt;br&gt;} &lt;/div&gt;
&lt;div&gt;StackedSphere sphere1(4, 8, 16); &lt;br&gt;SpiralSphere sphere2(4, 8, 16); &lt;br&gt;int r = 0; &lt;/div&gt;
&lt;div&gt;void reshape(int width, int height){ &lt;br&gt;if (height == 0) &lt;br&gt;{ &lt;br&gt;height = 1; &lt;br&gt;} &lt;br&gt;glMatrixMode(GL_PROJECTION); &lt;br&gt;glLoadIdentity(); &lt;br&gt;glViewport(0, 0, width, height); &lt;br&gt;gluPerspective(45.0f, GLfloat(width) / GLfloat(height), 0.1f, 50.0f); &lt;br&gt;glMatrixMode(GL_MODELVIEW); &lt;br&gt;glLoadIdentity(); &lt;br&gt;} &lt;/div&gt;
&lt;div&gt;void display(){ &lt;br&gt;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); &lt;br&gt;glLoadIdentity(); &lt;br&gt;glTranslatef(0, 0, -25); &lt;br&gt;glPushMatrix(); &lt;br&gt;glTranslatef(-5, 0, 0); &lt;br&gt;glRotatef(r, 0, 1, 0); &lt;br&gt;sphere1.render(); &lt;br&gt;glPopMatrix(); &lt;br&gt;glPushMatrix(); &lt;br&gt;glTranslatef(5, 0, 0); &lt;br&gt;glRotatef(r, 0, 1, 0); &lt;br&gt;sphere2.render(); &lt;br&gt;glPopMatrix(); &lt;br&gt;glutSwapBuffers(); &lt;br&gt;r++; &lt;br&gt;} &lt;/div&gt;
&lt;div&gt;int main(int argc, char** argv) &lt;br&gt;{ &lt;br&gt;glutInit(&amp;amp;argc, argv); &lt;br&gt;glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); &lt;br&gt;glutInitWindowPosition(0, 0); &lt;br&gt;glutInitWindowSize(512,512); &lt;br&gt;glutCreateWindow(&amp;quot;Sphere Test&amp;quot;); &lt;br&gt;glutReshapeFunc(reshape); &lt;br&gt;glutDisplayFunc(display); &lt;br&gt;glutIdleFunc(display); &lt;br&gt;glPolygonMode(GL_FRONT, GL_LINE); &lt;br&gt;glPolygonMode(GL_BACK, GL_LINE); &lt;br&gt;glutMainLoop(); &lt;br&gt;return 0; &lt;br&gt;} &lt;br&gt; &lt;br&gt; &lt;br&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+ogl%e7%bb%98%e5%88%b6%e4%b8%a4%e5%9c%86(%e8%bd%ac)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1017.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1017.entry</guid><pubDate>Thu, 06 Sep 2007 01:20:26 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1017/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1017.entry#comment</wfw:comment><dcterms:modified>2007-09-06T01:20:26Z</dcterms:modified></item><item><title>常用链接(转)</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1004.entry</link><description>&lt;div&gt;&lt;span&gt;常用链接(转)&lt;/span&gt;&lt;br&gt;来自: &lt;a href="http://www.hays.com.cn/viewthread.php?tid=256"&gt;http://www.hays.com.cn/viewthread.php?tid=256&lt;/a&gt;&lt;br&gt;
&lt;div style="font-size:12px"&gt;Graphics Engines&lt;br&gt;Ogre 3D (&lt;a href="http://www.ogre3d.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.ogre3d.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Nebula Device (&lt;a href="http://www.radonlabs.de/nebula.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.radonlabs.de/nebula.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Haddd (&lt;a href="http://www.haddd.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.haddd.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Irrlicht (&lt;a href="http://irrlicht.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://irrlicht.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Haaf's Game Engine (&lt;a href="http://hge.relishgames.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://hge.relishgames.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (hardware accelerated 2D games engine)&lt;br&gt;&lt;br&gt;Axiom 3D (&lt;a href="http://www.axiom3d.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.axiom3d.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (OGRE for .NET)&lt;br&gt;TrueVision (&lt;a href="http://truevision.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://truevision.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Revolution3D (&lt;a href="http://www.revolution3d.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.revolution3d.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Genesis3D (&lt;a href="http://www.genesis3d.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.genesis3d.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Crystal Space 3D (&lt;a href="http://www.crystalspace3d.org/tikiwiki/tiki-view_articles.php)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.crystalspace3d.org/tikiwiki/tiki-view_articles.php)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Panda3D (&lt;a href="http://panda3d.etc.cmu.edu/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://panda3d.etc.cmu.edu/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Quake 2 Source Code (&lt;a href="http://www.fileshack.com/file.x?fid=7547)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.fileshack.com/file.x?fid=7547)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Quake 2 (&lt;a href="http://www.fileplanet.com/6621/0/fileinfo/Quake-II-Source-Code-v3.21)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.fileplanet.com/6621/0 ... -Source-Code-v3.21)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (complete sources)&lt;br&gt;&lt;br&gt;Tenebrae (&lt;a href="http://tenebrae.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://tenebrae.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (Quake with per pixel lights and shaders)&lt;br&gt;Wild Magic (&lt;a href="http://www.geometrictools.com/index.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.geometrictools.com/index.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (David Eberly's engine)&lt;br&gt;Apocalyx (&lt;a href="http://apocalyx.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://apocalyx.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;ClanLib Game SDK (&lt;a href="http://www.clanlib.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.clanlib.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;DevLib (&lt;a href="http://www.devlib-central.org/mambo/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.devlib-central.org/mambo/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;kjAPI (&lt;a href="http://www.kjapi.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.kjapi.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Portable Game Library (PLIB) (&lt;a href="http://plib.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://plib.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;RealmForge GDK (&lt;a href="http://realmforge.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://realmforge.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Delta3D (&lt;a href="http://delta3d.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://delta3d.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;G3D (&lt;a href="http://g3d-cpp.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://g3d-cpp.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;NeoEngine (&lt;a href="http://www.neoengine.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.neoengine.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;QuakeForge (&lt;a href="http://www.quakeforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.quakeforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;XEngine (&lt;a href="http://xengine.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://xengine.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Yake (&lt;a href="http://www.yake.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.yake.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Kyra Sprite Engine (&lt;a href="http://www.grinninglizard.com/kyra/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.grinninglizard.com/kyra/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Libraries&lt;br&gt;Free Game Development Libraries (&lt;a href="http://abattoir.wolfpaw.net/personal/gamelibs.php)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://abattoir.wolfpaw.net/personal/gamelibs.php)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (external list)&lt;br&gt;Graphics:&lt;br&gt;Crazy Eddie's GUI system (&lt;a href="http://www.cegui.org.uk/modules/news/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.cegui.org.uk/modules/news/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Cal3D (&lt;a href="http://cal3d.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://cal3d.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (character animation library)&lt;br&gt;GLFW (&lt;a href="http://glfw.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://glfw.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (OpenGL Framework)&lt;br&gt;&lt;br&gt;GLee (&lt;a href="http://elf-stone.com/glee.php)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://elf-stone.com/glee.php)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (OpenGL easy extension library)&lt;br&gt;DevIL (&lt;a href="http://openil.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://openil.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Game Texture Loader (&lt;a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=334348)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.gamedev.net/community ... sp?topic_id=334348)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;SDL (&lt;a href="http://www.libsdl.org)/" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.libsdl.org)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Cpw (&lt;a href="http://www.mathies.com/cpw/about.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.mathies.com/cpw/about.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (another OGL framework)&lt;br&gt;Allegro (&lt;a href="http://www.talula.demon.co.uk/allegro/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.talula.demon.co.uk/allegro/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Open Scene Graph (&lt;a href="http://www.openscenegraph.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.openscenegraph.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Corona (&lt;a href="http://corona.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://corona.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Titan (&lt;a href="http://titan.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://titan.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;SFont (&lt;a href="http://www.linux-games.com/sfont/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.linux-games.com/sfont/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;CxImage (&lt;a href="http://www.xdp.it/cximage.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.xdp.it/cximage.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;CImg (&lt;a href="http://cimg.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://cimg.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;FreeImage (&lt;a href="http://freeimage.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://freeimage.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;BMF_Font (&lt;a href="http://trenki.gippsbiz.com/bmf/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://trenki.gippsbiz.com/bmf/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;BFont (&lt;a href="http://www.cs.unibo.it/~dbilli/bfont/bfont.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.cs.unibo.it/%7Edbilli/bfont/bfont.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;FreeType (freetype.sf.net) (font rendering library)&lt;br&gt;&lt;br&gt;PaintLib (&lt;a href="http://www.paintlib.de/paintlib/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.paintlib.de/paintlib/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;GLEW (&lt;a href="http://glew.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://glew.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (OpenGL extension wrangler library)&lt;br&gt;gluX&lt;br&gt;(&lt;a href="http://www-evasion.imag.fr/Membres/Sylvain.Lefebvre/glux/)GLUT" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www-evasion.imag.fr/Membres/Sylvain.Lefebvre/glux/)GLUT&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (&lt;a href="http://www.opengl.org/resources/libraries/glut/glut_downloads.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.opengl.org/resources/ ... lut_downloads.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;FreeGLUT (&lt;a href="http://freeglut.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://freeglut.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Open Inventor (&lt;a href="http://oss.sgi.com/projects/inventor/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://oss.sgi.com/projects/inventor/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;FTGL (&lt;a href="http://homepages.paradise.net.nz/henryj/code/index.html#FTGL)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://homepages.paradise.net.nz/henryj/code/index.html#FTGL)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (OpenGL Font Library&lt;br&gt;&lt;br&gt;nVidia Scene Graph SDK (&lt;a href="http://developer.nvidia.com/object/nvsg_home.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://developer.nvidia.com/object/nvsg_home.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;OpenSG (&lt;a href="http://www.opensg.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.opensg.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;ParaGUI (&lt;a href="http://www.paragui.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.paragui.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;LibUFO (&lt;a href="http://libufo.sourceforge.net/index.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://libufo.sourceforge.net/index.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (OpenGL GUI Toolkit)&lt;br&gt;GPUmesh (&lt;a href="http://www-evasion.imag.fr/Membres/Sylvain.Lefebvre/GPUmesh/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www-evasion.imag.fr/Membres/Sylvain.Lefebvre/GPUmesh/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;GNU Triangulated Surface Library (&lt;a href="http://gts.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://gts.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;libASE (&lt;a href="http://interreality.org/projects/libase)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://interreality.org/projects/libase)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;lib3DS (&lt;a href="http://lib3ds.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://lib3ds.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;GLOD (&lt;a href="http://www.cs.jhu.edu/~graphics/GLOD/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.cs.jhu.edu/%7Egraphics/GLOD/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (Geometric Level of Detail for OpenGL)&lt;br&gt;Video:&lt;br&gt;FFmpeg (&lt;a href="http://ffmpeg.sourceforge.net/index.php)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://ffmpeg.sourceforge.net/index.php)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Dirac (&lt;a href="http://sourceforge.net/projects/dirac)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://sourceforge.net/projects/dirac)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Theora (&lt;a href="http://www.theora.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.theora.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;XviD (&lt;a href="http://www.xvid.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.xvid.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Networking:&lt;br&gt;RakNet (&lt;a href="http://www.rakkarsoft.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.rakkarsoft.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;OpenTNL (&lt;a href="http://www.opentnl.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.opentnl.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (Torque network library)&lt;br&gt;HawkNL (&lt;a href="http://www.hawksoft.com/hawknl/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.hawksoft.com/hawknl/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;OpenPlay (&lt;a href="http://developer.apple.com/darwin/projects/openplay/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://developer.apple.com/darwin/projects/openplay/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;ReplicaNet (&lt;a href="http://www.replicanet.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.replicanet.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Game Networking Engine (&lt;a href="http://www.rit.edu/~jpw9607/gne/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.rit.edu/%7Ejpw9607/gne/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Sound:&lt;br&gt;FMOD (&lt;a href="http://www.fmod.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.fmod.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;OpenAL (&lt;a href="http://www.openal.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.openal.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Audiere (&lt;a href="http://audiere.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://audiere.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;BASS (&lt;a href="http://www.un4seen.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.un4seen.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;libsndfile (&lt;a href="http://www.mega-nerd.com/libsndfile/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.mega-nerd.com/libsndfile/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Ogg Vorbis (&lt;a href="http://www.vorbis.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.vorbis.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Physics and Collision:&lt;br&gt;Open Dynamics Engine (ODE) (&lt;a href="http://ode.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://ode.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Tokamak (&lt;a href="http://www.tokamakphysics.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.tokamakphysics.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Newton Game Dynamics (&lt;a href="http://www.physicsengine.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.physicsengine.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;NovodeX SDK (&lt;a href="http://www.ageia.com/novodex.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.ageia.com/novodex.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Physical (&lt;a href="http://physical.alecrivers.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://physical.alecrivers.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;True Axis (&lt;a href="http://www.trueaxis.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.trueaxis.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Open Dynamics Framework (&lt;a href="http://www.physicstools.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.physicstools.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;ColDet (&lt;a href="http://photoneffect.com/coldet/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://photoneffect.com/coldet/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (Free 3D Collision Detection Library)&lt;br&gt;Opcode (&lt;a href="http://www.codercorner.com/Opcode.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.codercorner.com/Opcode.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;RAPID (&lt;a href="http://www.cs.unc.edu/~geom/OBB/OBBT.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.cs.unc.edu/%7Egeom/OBB/OBBT.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;FreeSOLID (&lt;a href="http://www.win.tue.nl/~gino/solid/index.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.win.tue.nl/%7Egino/solid/index.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;V-Collide (&lt;a href="http://www.cs.unc.edu/~geom/V_COLLIDE/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.cs.unc.edu/%7Egeom/V_COLLIDE/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Scripting and XML:&lt;br&gt;Lua (&lt;a href="http://www.lua.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.lua.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;AngelScript (&lt;a href="http://www.angelcode.com/angelscript/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.angelcode.com/angelscript/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;CInt (&lt;a href="http://root.cern.ch/root/Cint.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://root.cern.ch/root/Cint.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;EOS (&lt;a href="http://eosscript.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://eosscript.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;GameMonkey Script (&lt;a href="http://www.somedude.net/gamemonkey/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.somedude.net/gamemonkey/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Guile (&lt;a href="http://www.gnu.org/software/guile/guile.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.gnu.org/software/guile/guile.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;IO (&lt;a href="http://www.iolanguage.com/about/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.iolanguage.com/about/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;javascript (&lt;a href="http://www.mozilla.org/js/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.mozilla.org/js/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Squirrel (&lt;a href="http://squirrel.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://squirrel.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Small (&lt;a href="http://www.compuphase.com/small.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.compuphase.com/small.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Ruby (&lt;a href="http://www.ruby-lang.org/en/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.ruby-lang.org/en/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Python (&lt;a href="http://www.python.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.python.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Tcl (&lt;a href="http://tcl.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://tcl.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Perl (&lt;a href="http://www.perl.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.perl.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;LibXML (&lt;a href="http://xmlsoft.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://xmlsoft.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;TinyXML (&lt;a href="http://www.grinninglizard.com/tinyxml/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.grinninglizard.com/tinyxml/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Expat (&lt;a href="http://expat.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://expat.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Apache XML libraries (&lt;a href="http://xml.apache.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://xml.apache.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;ezXML (&lt;a href="http://ezxml.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://ezxml.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Compression and File Systems:&lt;br&gt;zlib (&lt;a href="http://www.zlib.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.zlib.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;bzip2 (&lt;a href="http://www.bzip.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.bzip.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;LZMA SDK (&lt;a href="http://www.7-zip.org/sdk.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.7-zip.org/sdk.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;LZO (&lt;a href="http://www.oberhumer.com/opensource/lzo/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.oberhumer.com/opensource/lzo/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;PhysicsFS (&lt;a href="http://icculus.org/physfs/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://icculus.org/physfs/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;#ZipLib (&lt;a href="http://www.icsharpcode.net/OpenSource/SharpZipLib/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.icsharpcode.net/OpenSource/SharpZipLib/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (native C# archive library)&lt;br&gt;&lt;br&gt;SharpFS (&lt;a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=391656)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.gamedev.net/community ... sp?topic_id=391656)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (native C# VFS)&lt;br&gt;unrarlib (&lt;a href="http://www.unrarlib.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.unrarlib.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;ZipArchive (&lt;a href="http://www.artpol-software.com/index_zip.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.artpol-software.com/index_zip.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Note: Much of the above lists (but not all) were taken from this page (&lt;a href="http://abattoir.wolfpaw.net/personal/gamelibs.php)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://abattoir.wolfpaw.net/personal/gamelibs.php)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;, maintained by Kylotan here (&lt;a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=291432)." target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.gamedev.net/community ... p?topic_id=291432).&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Applications and Utilities:&lt;br&gt;&lt;br&gt;Development Environments:&lt;br&gt;Code::Blocks IDE (&lt;a href="http://www.codeblocks.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.codeblocks.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Dev-C++ (&lt;a href="http://www.bloodshed.net/devcpp.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.bloodshed.net/devcpp.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Visual Studio 2005 betas (&lt;a href="http://lab.msdn.microsoft.com/vs2005/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://lab.msdn.microsoft.com/vs2005/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;SharpDevelop (&lt;a href="http://www.icsharpcode.net/OpenSource/SD/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.icsharpcode.net/OpenSource/SD/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;ActivePython (&lt;a href="http://www.activestate.com/Products/ActivePython/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.activestate.com/Products/ActivePython/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Graphics Development:&lt;br&gt;gDEBugger (&lt;a href="http://www.gremedy.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.gremedy.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;FX Composer (&lt;a href="http://developer.nvidia.com/object/fx_composer_home.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://developer.nvidia.com/object/fx_composer_home.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;RenderMonkey (&lt;a href="http://www.ati.com/developer/rendermonkey/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.ati.com/developer/rendermonkey/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;NVIDIA SDK (&lt;a href="http://developer.nvidia.com/object/sdk_home.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://developer.nvidia.com/object/sdk_home.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;ATI Radeon SDK (&lt;a href="http://www.ati.com/developer/radeonSDK.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.ati.com/developer/radeonSDK.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;DirectX Developer Center (&lt;a href="http://msdn.microsoft.com/directx/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://msdn.microsoft.com/directx/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;NVIDIA Cg (&lt;a href="http://developer.nvidia.com/page/cg_main.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://developer.nvidia.com/page/cg_main.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Sh (&lt;a href="http://libsh.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://libsh.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (shader language)&lt;br&gt;Modeling:&lt;br&gt;SoftImage|XSI Mod Tool (&lt;a href="http://www.softimage.com/community/xsi_mod_tool/default.aspx)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.softimage.com/community/xsi_mod_tool/default.aspx)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Milkshape 3D (&lt;a href="http://www.swissquake.ch/chumbalum-soft/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.swissquake.ch/chumbalum-soft/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (not free, $25)&lt;br&gt;Wings 3D (&lt;a href="http://www.wings3d.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.wings3d.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Blender (&lt;a href="http://www.blender3d.com/cms/Home.2.0.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.blender3d.com/cms/Home.2.0.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Anim8or (&lt;a href="http://www.anim8or.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.anim8or.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;DeleD (&lt;a href="http://www.delgine.com/index.php?filename=product_deled&amp;amp;menus=off)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.delgine.com/index.php ... eled&amp;amp;menus=off)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;World Building:&lt;br&gt;Quake Army Knife (QuArK) (&lt;a href="http://dynamic.gamespy.com/~quark/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://dynamic.gamespy.com/%7Equark/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;GtkRadiant (&lt;a href="http://www.qeradiant.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.qeradiant.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Getic3D (&lt;a href="http://www.zalsoft.com/index.php)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.zalsoft.com/index.php)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Audio:&lt;br&gt;ModPlug (&lt;a href="http://www.modplug.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.modplug.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Audacity (&lt;a href="http://audacity.sourceforge.net/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://audacity.sourceforge.net/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;SynthEdit (&lt;a href="http://www.synthedit.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.synthedit.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Buzz Machines (&lt;a href="http://www.buzzmachines.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.buzzmachines.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;KVR Audio (&lt;a href="http://www.kvraudio.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.kvraudio.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (not actually software, but has tons of links)&lt;br&gt;Images:&lt;br&gt;&lt;br&gt;Paint.NET (excellent free image editor)&lt;br&gt;(&lt;a href="http://www.eecs.wsu.edu/paint.net/)The" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.eecs.wsu.edu/paint.net/)The&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; GIMP (&lt;a href="http://www.gimp.org/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.gimp.org/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;BMFont (&lt;a href="http://www.angelcode.com/products/bmfont/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.angelcode.com/products/bmfont/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (font texture generator)&lt;br&gt;&lt;br&gt;Media&lt;br&gt;Textures:&lt;br&gt;Transmogrifying Textures Vol. I (NVIDIA) (&lt;a href="http://developer.nvidia.com/object/IO_TTVol_01.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://developer.nvidia.com/object/IO_TTVol_01.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Mayang's Free Textures (&lt;a href="http://www.mayang.com/textures/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.mayang.com/textures/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;3D Cafe's Free Textures (&lt;a href="http://www.3dcafe.com/asp/textures.asp)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.3dcafe.com/asp/textures.asp)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Absolute Background Textures Archive (&lt;a href="http://www.grsites.com/textures/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.grsites.com/textures/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Image * After (&lt;a href="http://www.imageafter.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.imageafter.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Media Link's Free Backgrounds and Textures (&lt;a href="http://my.erinet.com/~cunning1/textures.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://my.erinet.com/%7Ecunning1/textures.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Free Game Textures (&lt;a href="http://www.vb3d.com/Textures.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.vb3d.com/Textures.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Seamless Textures -- Absolute Cross (&lt;a href="http://www.absolutecross.com/graphics/textures/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.absolutecross.com/graphics/textures/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;3D Millenium Free Textures (&lt;a href="http://www.m3corp.com/a/download/3d_textures/pages/index.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.m3corp.com/a/download/3d_textures/pages/index.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Pixel Poke (&lt;a href="http://www.pixelpoke.com/FREE PIXELS.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.pixelpoke.com/FREE%20PIXELS.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;The Texture Studio (&lt;a href="http://www.planethalflife.com/studio/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.planethalflife.com/studio/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Textures (&lt;a href="http://astronomy.swin.edu.au/~pbourke/texture/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://astronomy.swin.edu.au/%7Epbourke/texture/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Marlin Studios (&lt;a href="http://www.marlinstudios.com/samples/samples.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.marlinstudios.com/samples/samples.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Free Foto (&lt;a href="http://www.freefoto.com/browse.jsp?id=33-00-0)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.freefoto.com/browse.jsp?id=33-00-0)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Free Textures (&lt;a href="http://www.noctua-graphics.de/english/freetex_e.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.noctua-graphics.de/english/freetex_e.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Free Textures (&lt;a href="http://www.indiaeye.com/free.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.indiaeye.com/free.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;MorgueFile (&lt;a href="http://www.morguefile.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.morguefile.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Psionic3D (&lt;a href="http://www.psionic3d.co.uk/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.psionic3d.co.uk/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Models:&lt;br&gt;3D Millenium Free Models (&lt;a href="http://www.m3corp.com/a/download/models/index.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.m3corp.com/a/download/models/index.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Polycount (&lt;a href="http://www.planetquake.com/polycount/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.planetquake.com/polycount/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Marlin Studios (&lt;a href="http://www.marlinstudios.com/samples/samples.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.marlinstudios.com/samples/samples.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Free 3D Model Collections (&lt;a href="http://www.amazing3d.com/modfree.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.amazing3d.com/modfree.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Free 3D Models (&lt;a href="http://www.rocky3d.com/free3d.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.rocky3d.com/free3d.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Digital Animators Models (&lt;a href="http://www.digitalanimators.com/HTM/Resources/3dModels/3dModelsMain.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.digitalanimators.com/ ... s/3dModelsMain.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Psionic3D (&lt;a href="http://www.psionic3d.co.uk/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.psionic3d.co.uk/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Sprites&lt;br&gt;This thread has lots...and lots...and lots... (&lt;a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=272386)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.gamedev.net/community ... sp?topic_id=272386)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Sounds:&lt;br&gt;&lt;br&gt;SFX and Music Resources (&lt;a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=279518)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.gamedev.net/community ... sp?topic_id=279518)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (another long GDNet post)&lt;br&gt;Jamendo (&lt;a href="http://www.jamendo.com/us/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.jamendo.com/us/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (Creative Commons licensed music)&lt;br&gt;A1 Free Sound Effects (&lt;a href="http://www.a1freesoundeffects.com/noflash.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.a1freesoundeffects.com/noflash.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Sound Effects (&lt;a href="http://www.pacdv.com/sounds/index.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.pacdv.com/sounds/index.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Tintagel's Free Sound File Archive (&lt;a href="http://freesoundfiles.tintagel.net/Audio/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://freesoundfiles.tintagel.net/Audio/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Free Sound Effects (&lt;a href="http://www.partnersinrhyme.com/pir/PIRsfx.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.partnersinrhyme.com/pir/PIRsfx.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;Sound Hunter (&lt;a href="http://www.soundhunter.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.soundhunter.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Wav Sound Complete Archive (&lt;a href="http://www.members.tripod.com/~buggerluggs/ie/wav-dir184.htm)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.members.tripod.com/%7Ebuggerluggs/ie/wav-dir184.htm)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;deusX Sound Design (&lt;a href="http://www.deusx.com/studio.html)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.deusx.com/studio.html)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;FindSounds (&lt;a href="http://www.findsounds.com/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.findsounds.com/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; (sound search engine)&lt;br&gt;Absolute Sound Effects Archive (&lt;a href="http://www.grsites.com/sounds/)" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.grsites.com/sounds/)&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8189920746979949719&amp;page=RSS%3a+%e5%b8%b8%e7%94%a8%e9%93%be%e6%8e%a5(%e8%bd%ac)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=flipcode.spaces.live.com&amp;amp;GT1=flipcode"&gt;</description><comments>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1004.entry#comment</comments><guid isPermaLink="true">http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1004.entry</guid><pubDate>Wed, 04 Jul 2007 05:33:17 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://flipcode.spaces.live.com/blog/cns!8E578E7901A88369!1004/comments/feed.rss</wfw:commentRss><wfw:comment>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1004.entry#comment</wfw:comment><dcterms:modified>2007-07-04T05:33:17Z</dcterms:modified></item><item><title>vc常微分方程初值问题求解(转)</title><link>http://flipcode.spaces.live.com/Blog/cns!8E578E7901A88369!1003.entry</link><description>&lt;div&gt;Visual C++常微分方程初值问题求解 (转)&lt;br&gt;&lt;a href="http://www.yesky.com/20021122/1641169.shtml"&gt;http://www.yesky.com/20021122/1641169.shtml&lt;/a&gt;&lt;br&gt; &lt;br&gt;2002-11-22· ·信息产业部电子第二十二研究所青岛分所郎锐··YESKY&lt;/div&gt;
&lt;div&gt; &lt;br&gt;1 2  下一页&lt;/div&gt;
&lt;div&gt;&lt;br&gt;　　摘要：本文讲述了以计算机为辅助计算工具，分别使用欧拉算法、改进欧拉算法以及经典龙格-库塔算法对常微分方程的初值问题进行数值求解的实现算法。&lt;/div&gt;
&lt;div&gt;　　一、 引言&lt;/div&gt;
&lt;div&gt;　　在工程计算中我们经常要去解一些常微分方程，虽然在高等数学和其他一些涉及微分方程的专业书籍中介绍了不少类型的常微分方程，及各自的解法。但工程&lt;/div&gt;
&lt;div&gt;技术人员在工程和科学研究中所关心的往往只是常微分方程的近似数值解，而非从事数学研究的技术人员所注重的&amp;quot;过程&amp;quot;。采用常规的人工推导、求解无疑是效率&lt;/div&gt;
&lt;div&gt;非常低下的，而且工程上的常微分方程往往结构非常复杂，要给出一般方程解的表达式也是非常困难的。实际上到目前为止，我们只能对有限的几种特殊类型的方&lt;/div&gt;
&lt;div&gt;程求精确解，这远不能满足工程需要，对那些不能用初等函数来表达的方程就只能去求其近似的数值解，而且这样还可以借助于运算速度快的计算机来进行辅助求&lt;/div&gt;
&lt;div&gt;解，大大提高求解的速度和精度，修改也比较灵活。&lt;/div&gt;
&lt;div&gt;　　二、 使用欧拉算法及其改进算法进行一般求解&lt;/div&gt;
&lt;div&gt;　　所谓的数值求解，就是求问题的解y(x)在一系列点上的值y(xi)的近似值yi。欧拉(Euler)算法是其中最基本、最简单的算法，但其求解精度较低，一般不在&lt;/div&gt;
&lt;div&gt;工程中单独进行计算。其实现的依据是用向前差商来近似代替导数。对于常微分方程：&lt;/div&gt;
&lt;div&gt;　　dy/dx=f(x,y)，x∈[a,b]&lt;br&gt;　　y(a)=y0&lt;/div&gt;
&lt;div&gt;　　可以将区间[a,b]分成n段，那么方程在第xI点有y'(xI)=f(xI,y(xI))，再用向前差商近似代替导数则为：(y(xI+1)-y(xI))/h= f(xI,y(xI))，因此可以根&lt;/div&gt;
&lt;div&gt;据xI点和yI点的数值计算出yI+1来：&lt;/div&gt;
&lt;div&gt;　　yI+1= yI+h*f(xI ,yI)&lt;/div&gt;
&lt;div&gt;　　下面就在Visual C++ 6.0编程环境下对一个简单的常微分方程&lt;/div&gt;
&lt;div&gt;　　y'=x-y+1,x∈[0,0.5]&lt;br&gt;　　y(0)=1&lt;/div&gt;
&lt;div&gt;　　求近似数值解，由于该简单方程可以用数学方法求得其精确描述式y(x)=x+e-x，所以可以据此检验近似数值解同真实解的误差情况。对于其他一些结构复杂的&lt;/div&gt;
&lt;div&gt;常微分方程的数值解实现方法也是一样的。下面就通过代码来实现上述算法，并对计算结果作了比较：&lt;/div&gt;
&lt;div&gt;float y[6]; file://用于存放计算出的常微分方程数值解&lt;br&gt;float r; file://同真实解的误差情况&lt;br&gt;memset(y,0,sizeof(float)*6);//清零&lt;br&gt;y[0]=1; &lt;a&gt;file://y(0)=1&lt;/a&gt;&lt;br&gt;……&lt;br&gt;for(float x=0;x&amp;lt;0.6;x+=0.1) file://区间分5段，步长为0.1&lt;br&gt;{&lt;br&gt;r=x+expf(-x); file://真实解y(x)=x+e-x&lt;br&gt;y[i+1]=y[i]+0.1*(x-y[i]+1); file://数值解（近似）&lt;br&gt;r=fabs(r-y[i]); file://误差&lt;br&gt;str.Format(&amp;quot;y[%d]=%f r=%f\r\n&amp;quot;,i,y[i],r);&lt;br&gt;i++;&lt;br&gt;msg+=str;&lt;br&gt;}&lt;br&gt;AfxMessageBox(msg);&lt;br&gt;…… &lt;/div&gt;
&lt;div&gt;　　经过程序计算，得出y(xi)在各点的近似数值解及各自同真实解的误差，现列表如下，以兹对照：&lt;/div&gt;
&lt;div&gt;xI（各分点） yI （数值解） y(xi) （真实值） | y(xi)- yI | (误差) &lt;br&gt;0.0 1.000000 1.000000 0.000000 &lt;br&gt;0.1 1.000000  1.004837 0.004837 &lt;br&gt;0.2  1.010000  1.018731 0.008731 &lt;br&gt;0.3 1.029000  1.040818 0.011818 &lt;br&gt;0.4 1.056100  1.070320  0.014220 &lt;br&gt;0.5  1.090490 1.106531  0.016041 &lt;/div&gt;
&lt;div&gt;　　虽然从实验结果看误差不算太大，但这仅仅是一个用于实验的非常简单的常微分方程，对于实际工程中应用的结构复杂的方程其求解结果的误差要远比此大的&lt;/div&gt;
&lt;div&gt;多，由于还存在着局部截断误差和整体截断误差，有必要采取措施来抑制、减少误差，尽量使结果精确。在构造欧拉公式时采取的一个重要步骤--用向前差商来代&lt;/div&gt;
&lt;div&gt;替导数，如将其改为向后差商也是行的通的。此时的欧拉公式就变成了：yI+1= yI+h*f(xI+1,yI+1)，由于该式是一个隐式公式，所以可用迭代法进行计算，直至&lt;/div&gt;
&lt;div&gt;获取到满足精度要求的yI+1。从数学上可以证明，该式的局部截断误差和前面的欧拉公式的截断误差在主部上之相差正负号，所以只要将显示和隐式的两个欧拉公&lt;/div&gt;
&lt;div&gt;式相加后再行求解会大大减少误差。可以解得改进后的欧拉公式的表达式为：&lt;/div&gt;
&lt;div&gt;　　yI+1= yI+h*(f(xI, yI)+f(xI+1, yI+hf(xI,yI)))/2&lt;/div&gt;
&lt;div&gt;　　对此式进行编程，就要比前面的代码要麻烦些，需要分步对其进行计算，以达到最高的运算效率，减少运算量：&lt;/div&gt;
&lt;div&gt;……&lt;br&gt;for(float x=0;x&amp;lt;0.6;x+=0.1)&lt;br&gt;{&lt;br&gt;r=x+expf(-x);&lt;br&gt;T1=y[i]+0.1*(x-y[i]+1); file://分步进行计算&lt;br&gt;T2=y[i]+0.1*((x+0.1)-T1+1);&lt;br&gt;y[i+1]=(T1+T2)/2;&lt;br&gt;r=fabs(r-y[i]);&lt;br&gt;str.Format(&amp;quot;y[%d]=%f r=%f\r\n&amp;quot;,i,y[i],r);&lt;br&gt;i++;&lt;br&gt;msg+=str;&lt;br&gt;}&lt;br&gt;AfxMessageBox(msg); &lt;/div&gt;
&lt;div&gt;　　从下表得出的实验数据可以看出，这种经过改进的欧拉算法所存在的误差已大为减少，可以直接单独应用于实际的工程计算。误差的减少主要是由于先利用了&lt;/div&gt;
&lt;div&gt;欧拉公式对yI+1的值进行了预估，然后又利用梯形公式对预估值作了校正，从而在预估--校正的过程中减少了误差。&lt;/div&gt;
&lt;div&gt;xI（各分点） yI （数值解） y(xi) （真实值） | y(xi)- yI | (误差) &lt;br&gt;0.0  1.000000 1.000000 0.000000 &lt;br&gt;0.1  1.005000  1.004837 0.000163 &lt;br&gt;0.2  1.019025 1.018731 0.000294 &lt;br&gt;0.3  1.041218  1.040818  0.000400 &lt;br&gt;0.4  1.070802  1.070320  0.000482 &lt;br&gt;0.5 1.107076  1.106531 0.000545 &lt;/div&gt;
&lt;div&gt; &lt;br&gt;三、 使用经典龙格-库塔算法进行高精度求解&lt;/div&gt;
&lt;div&gt;　　龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。由于此算法精度高，采取措施对误差进行抑制，所以其实现原理也较复杂。同前&lt;/div&gt;
&lt;div&gt;几种算法一样，该算法也是构建在数学支持的基础之上的。对于一阶精度的欧拉公式有：&lt;/div&gt;
&lt;div&gt;　　yi＋１＝yi＋h*K1&lt;br&gt;　　K1=f(xi,yi)&lt;/div&gt;
&lt;div&gt;　　当用点xi处的斜率近似值K1与右端点xi＋１处的斜率K2的算术平均值作为平均斜率K*的近似值，那么就会得到二阶精度的改进欧拉公式：&lt;/div&gt;
&lt;div&gt;　　yi＋１＝yi＋h*( K1+ K2)/2&lt;br&gt;　　K1=f(xi,yi)&lt;br&gt;　　K2=f(xi+h,yi+h*K1)&lt;/div&gt;
&lt;div&gt;　　依次类推，如果在区间[xi,xi+1]内多预估几个点上的斜率值K1、K2、……Km，并用他们的加权平均数作为平均斜率K*的近似值，显然能构造出具有很高精度&lt;/div&gt;
&lt;div&gt;的高阶计算公式。经数学推导、求解，可以得出四阶龙格－库塔公式，也就是在工程中应用广泛的经典龙格－库塔算法：&lt;/div&gt;
&lt;div&gt;　　yi＋１＝yi＋h*( K1+ 2*K2 +2*K3+ K4)/6&lt;br&gt;　　K1=f(xi,yi)&lt;br&gt;　　K2=f(xi+h/2,yi+h*K1/2)&lt;br&gt;　　K3=f(xi+h/2,yi+h*K2/2)&lt;br&gt;　　K4=f(xi+h,yi+h*K3)&lt;/div&gt;
&lt;div&gt;　　下面的具体程序实现同改进的欧拉算法类似，只需作些必要的改动，下面将该算法的关键部分代码清单列出：&lt;/div&gt;
&lt;div&gt;……&lt;br&gt;for(float x=0;x&amp;lt;0.6;x+=0.1)&lt;br&gt;{&lt;br&gt;r=x+expf(-x);&lt;br&gt;K1=x-y[i]+1; file://求K1&lt;br&gt;K2=(x+(float)(0.1/2))-(y[i]+K1*(float)(0.1/2))+1; file://求K2&lt;br&gt;K3=(x+(float)(0.1/2))-(y[i]+K2*(float)(0.1/2))+1; file://求K3&lt;br&gt;K4=(x+0.1)-(y[i]+K3*0.1)+1; file://求K4&lt;br&gt;y[i+1]=y[i]+(float)(0.1*(K1+2*K2+2*K3+K4)/6); file://求yi+1&lt;br&gt;r=fabs(r-y[i]); file://计算误差&lt;br&gt;str.Format(&amp;quot;y[%d]=%f r=%f\r\n&amp;quot;,i,y[i],r); &lt;br&gt;i++;&lt;br&gt;msg+=str;&lt;br&gt;}&lt;br&gt;AfxMessageBox(msg); file://报告计算结果及误差情况 &lt;/div&gt;
&lt;div&gt;　　从下表记录的程序运