﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-4D星宇</title><link>http://www.cppblog.com/bloodbao/</link><description>c++</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 17:15:21 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 17:15:21 GMT</pubDate><ttl>60</ttl><item><title>改写代码心得</title><link>http://www.cppblog.com/bloodbao/archive/2008/12/08/68816.html</link><dc:creator>bloodbao</dc:creator><author>bloodbao</author><pubDate>Mon, 08 Dec 2008 02:21:00 GMT</pubDate><guid>http://www.cppblog.com/bloodbao/archive/2008/12/08/68816.html</guid><wfw:comment>http://www.cppblog.com/bloodbao/comments/68816.html</wfw:comment><comments>http://www.cppblog.com/bloodbao/archive/2008/12/08/68816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodbao/comments/commentRss/68816.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodbao/services/trackbacks/68816.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;改写代码心得<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于BLOOD渲染器的API由DX9转向DX10，在转化架构和改写代码的过程中，出现很多异常。<br>在测试过程中，发现很多错误都是由于没有进行正确的初始化造成的。比如分配内存的容间，变量的正确赋值等等。已调完VB，IB，TEXTURE，RENDERTARGET等部分，还有MESH等大部未调。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特此MARK，以作记录。
<img src ="http://www.cppblog.com/bloodbao/aggbug/68816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodbao/" target="_blank">bloodbao</a> 2008-12-08 10:21 <a href="http://www.cppblog.com/bloodbao/archive/2008/12/08/68816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>clip plane模拟（抄自DXSDK）</title><link>http://www.cppblog.com/bloodbao/archive/2008/11/09/66448.html</link><dc:creator>bloodbao</dc:creator><author>bloodbao</author><pubDate>Sun, 09 Nov 2008 12:47:00 GMT</pubDate><guid>http://www.cppblog.com/bloodbao/archive/2008/11/09/66448.html</guid><wfw:comment>http://www.cppblog.com/bloodbao/comments/66448.html</wfw:comment><comments>http://www.cppblog.com/bloodbao/archive/2008/11/09/66448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodbao/comments/commentRss/66448.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodbao/services/trackbacks/66448.html</trackback:ping><description><![CDATA[<p>DX9下使用<br>D3DXPLANE plane;&nbsp;<br>&nbsp;D3DXPlaneFromPointNormal( &amp;plane, &amp;vPoint, &amp;vNormal ); //生成这个平面 <br>D3DXMatrixReflect( &amp;matReflect, &amp;plane ); //取得该平面的反射矩阵<br>//设置剪切平面，使反射面上的内容被渲染，面下的被丢弃 <br>&nbsp;m_pd3dDevice-&gt;SetClipPlane( 0, plane ); <br>&nbsp;m_pd3dDevice-&gt;SetRenderState( D3DRS_CLIPPLANEENABLE, 0x01 );<br>DX10下模拟：<br>User Clip PlanesUser Clip Planes are emulated by specifying a clip distance output from the Vertex Shader with the SV_ClipDistance[n] flag, where n is either 0 or 1. Each component can hold up to 4 clip distances in x, y, z, and w giving a total of 8 clip distances.</p>
<p>&nbsp;&nbsp;&nbsp; 用户裁减平面通过在VS里设定一个SV_ClipDistance[n]标记，定义一个裁减距离输出得到,n为0或1。这里一共能存放8个Clip Plane距离，分别使用数组两个元素的x,y,z,w通道。</p>
<p>In this scenario, each clip planes is defined by a plane equation of the form:</p>
<p>在这个场景里，每个clip plane被一个平面方程定义：</p>
<p>Ax + By + Cz + D =0;</p>
<p>Where &lt;A,B,C&gt; is the normal of the plane, and D is the distance of the plane from the origin. Plugging in any point &lt;x,y,z&gt; into this equation gives its distance from the plane. Therefore, all points &lt;x,y,z&gt; that satisfy the equation Ax + By + Cz + D = 0 are on the plane. All points that satisfy Ax + By + Cz + D &lt; 0 are below the plane. All points that satisfy Ax + By + Cz + D &gt; 0 are above the plane.</p>
<p>&lt;A,B,C&gt;是平面法向，D是平面到原点的距离。把任意点&lt;x,y,z&gt;代入方程能得到它到平面的距离。所有满足方程＝0的点在平面上，&lt;0的点在平面下而 &gt;0的点在平面上。</p>
<p>In the Vertex Shader, each vertex is tested against each plane equation to produce a distance to the clip plane. Each of the three clip distances are stored in the first three components of the output component with the semantic SV_ClipDistance0. These clip distances get interpolated over the triangle during rasterization and clipped if the value every goes below 0.</p>
<p>&nbsp;&nbsp;&nbsp; 在VS中，每个顶点会带入平面方程做测试。每个三角形的Clip距离存在SV_ClipDistance0语义输出的前三个通道中。这个距离在光栅化中被线性插值，所有小于0的像素被剔除。</p>
<img src ="http://www.cppblog.com/bloodbao/aggbug/66448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodbao/" target="_blank">bloodbao</a> 2008-11-09 20:47 <a href="http://www.cppblog.com/bloodbao/archive/2008/11/09/66448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rendering调试</title><link>http://www.cppblog.com/bloodbao/archive/2008/10/23/64881.html</link><dc:creator>bloodbao</dc:creator><author>bloodbao</author><pubDate>Thu, 23 Oct 2008 13:55:00 GMT</pubDate><guid>http://www.cppblog.com/bloodbao/archive/2008/10/23/64881.html</guid><wfw:comment>http://www.cppblog.com/bloodbao/comments/64881.html</wfw:comment><comments>http://www.cppblog.com/bloodbao/archive/2008/10/23/64881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodbao/comments/commentRss/64881.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodbao/services/trackbacks/64881.html</trackback:ping><description><![CDATA[近期较闲，主要修改rendering架构，减少DX9的接口，全面使用DX10的接口，修改变动非常大，初调试三千多个ERROR，现减为850多个，不过，内部错误还是很多。希望能在DX11发布前，全部改完。第二步，会建立更庞大的ISCENENODE，以满足快速测试和新版SCENEEDIT需要。暂记下。
<img src ="http://www.cppblog.com/bloodbao/aggbug/64881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodbao/" target="_blank">bloodbao</a> 2008-10-23 21:55 <a href="http://www.cppblog.com/bloodbao/archive/2008/10/23/64881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自制（写给自已）</title><link>http://www.cppblog.com/bloodbao/archive/2008/09/18/62223.html</link><dc:creator>bloodbao</dc:creator><author>bloodbao</author><pubDate>Thu, 18 Sep 2008 13:58:00 GMT</pubDate><guid>http://www.cppblog.com/bloodbao/archive/2008/09/18/62223.html</guid><wfw:comment>http://www.cppblog.com/bloodbao/comments/62223.html</wfw:comment><comments>http://www.cppblog.com/bloodbao/archive/2008/09/18/62223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodbao/comments/commentRss/62223.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodbao/services/trackbacks/62223.html</trackback:ping><description><![CDATA[ 不知不觉，九月已经过去太半了，而我却由于沉迷于游戏，反而没学到什么东西，这样浪费时间，真的是一种罪过。
过了一个多月时间，只简单的支持了XML和一点点LIGHT。小猫的引擎，离我承诺的精彩的水面，漂亮的粒子系统，复杂的天气系统，流畅的骨骼动画和人工智能，越来越远。
革命远未成功，小猫还需努力，为了钱和生活，多一点自制，少玩一些游戏吧！
退路已断，前方无路，人生岂能如些堕落。猫行天下，人生何缺悲壮，也需几多拼搏。十分耕耘，万分努力，或许成功！
期小猫自勉！<img src ="http://www.cppblog.com/bloodbao/aggbug/62223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodbao/" target="_blank">bloodbao</a> 2008-09-18 21:58 <a href="http://www.cppblog.com/bloodbao/archive/2008/09/18/62223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Main Features in my blood engine</title><link>http://www.cppblog.com/bloodbao/archive/2008/08/11/58530.html</link><dc:creator>bloodbao</dc:creator><author>bloodbao</author><pubDate>Mon, 11 Aug 2008 07:05:00 GMT</pubDate><guid>http://www.cppblog.com/bloodbao/archive/2008/08/11/58530.html</guid><wfw:comment>http://www.cppblog.com/bloodbao/comments/58530.html</wfw:comment><comments>http://www.cppblog.com/bloodbao/archive/2008/08/11/58530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodbao/comments/commentRss/58530.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodbao/services/trackbacks/58530.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main Features in my blood engine<br>Direct3D 9 is used to render the scene<br>User input is gathered though DirectInput <br>Single pass multi-texturing using the fixed-function pipeline (FFP) <br>Light-mapping<br>Frustum culling<br>Simple skybox<br>Keyframe Animation with GPU-based frame interpolation through a custom vertex and pixel shader written in HLSL. This technique is also known as Vertex Tweening or even Morph Target<br>Support for Quake2 models (.md2)<br>Support for DirectX models (.x)<br>Support for PCX texture loading in addition to the other image formats already supported by Direct3D<br>Support for Quake3:Arena levels<br>Lightmaps<br>Curved surfaces using Bezier patches<br>Partial support of Quake3 materials and effects (.shader)<br>Uses the BSP/PVS to quickly discard non visible geometry<br>Collision detection using the BSP tree (supports ray, sphere and box sweeps)<br>A flexible scene graph system where entities can be attached to each other in order to perform hierarchical transformations and geometry culling<br>Quake-like player movement physics<br>A powerful in-game console system:<br>Outputs vital information<br>Can take command inputs from the user<br>Console variables can be dynamically edited at runtime<br>Commands and console variable settings can be loaded from a user-specified text file (cfg)<br>Garbage collection of unused resources through reference counting<br>Control keys can be dynamically changed in-game through the console, using the bind command<br>User input is abstracted through an Action Manager which maps inputs to actions<br>A smart chase-camera controller that will detect collisions with the world to prevent the view from being occluded by other pieces of world geometry.<br>Error handling through exceptions<br>The in-game HUD can display vital performance statistics about the game, such as frames per second, total number of triangles on the screen, number of textures loaded, etc&#8230;
<img src ="http://www.cppblog.com/bloodbao/aggbug/58530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodbao/" target="_blank">bloodbao</a> 2008-08-11 15:05 <a href="http://www.cppblog.com/bloodbao/archive/2008/08/11/58530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>又失败了</title><link>http://www.cppblog.com/bloodbao/archive/2008/08/06/58118.html</link><dc:creator>bloodbao</dc:creator><author>bloodbao</author><pubDate>Wed, 06 Aug 2008 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/bloodbao/archive/2008/08/06/58118.html</guid><wfw:comment>http://www.cppblog.com/bloodbao/comments/58118.html</wfw:comment><comments>http://www.cppblog.com/bloodbao/archive/2008/08/06/58118.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodbao/comments/commentRss/58118.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodbao/services/trackbacks/58118.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了这次面试，我休息了很多天，都没工作。结果，得到的又是一个失败的结局。分析原因，都认为我的C++基础很薄弱吧，要不就是因为我以前从事的工作和现在的工作差别太大了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作为一名新手，我很迷茫，在学习的道路我没有被打败，却在两次面试中，深受打击。我不仅在想，这是否是我要选择的路。仅剩半个多月的时间，暑期就结束了，我再不出去，就没机会了。事实上，做不做游戏，我无所谓，但现在的生活一直不是我想要的。我不断地在否定自已的路上，越走越远，找不到真实的我。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;两个月很快就过去了，我只能静下心来去做事情，把这些烦人的事，都抛于脑后。路还是要走，人总是要成长的，希望能从失败中走出来。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;记下今天的失败，以作自勉。</p>
<img src ="http://www.cppblog.com/bloodbao/aggbug/58118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodbao/" target="_blank">bloodbao</a> 2008-08-06 10:36 <a href="http://www.cppblog.com/bloodbao/archive/2008/08/06/58118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DX10sample的阴影</title><link>http://www.cppblog.com/bloodbao/archive/2008/07/20/56669.html</link><dc:creator>bloodbao</dc:creator><author>bloodbao</author><pubDate>Sun, 20 Jul 2008 02:48:00 GMT</pubDate><guid>http://www.cppblog.com/bloodbao/archive/2008/07/20/56669.html</guid><wfw:comment>http://www.cppblog.com/bloodbao/comments/56669.html</wfw:comment><comments>http://www.cppblog.com/bloodbao/archive/2008/07/20/56669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodbao/comments/commentRss/56669.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodbao/services/trackbacks/56669.html</trackback:ping><description><![CDATA[<img src="http://www.cppblog.com/images/cppblog_com/bloodbao/self-shadow.jpg" border=0><br>主要是用模板缓冲区来实现。<br>DepthStencilState StencilShadow<br>{<br>&nbsp;&nbsp;&nbsp; DepthEnable = true;<br>&nbsp;&nbsp;&nbsp; DepthWriteMask = ZERO;<br>&nbsp;&nbsp;&nbsp; DepthFunc = LESS;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; StencilEnable = true;<br>&nbsp;&nbsp;&nbsp; StencilReadMask = 0xFFFFFFFF;<br>&nbsp;&nbsp;&nbsp; StencilWriteMask = 0xFFFFFFFF;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; FrontFaceStencilFunc = ALWAYS;<br>&nbsp;&nbsp;&nbsp; FrontFaceStencilPass = INCR;<br>&nbsp;&nbsp;&nbsp; FrontFaceStencilFail = Keep;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; BackFaceStencilFunc = ALWAYS;<br>&nbsp;&nbsp;&nbsp; BackFaceStencilPass = DECR;<br>&nbsp;　BackFaceStencilFail = Keep;<br>};<br>BlendState AdditiveBlending<br>{<br>&nbsp;&nbsp;&nbsp; AlphaToCoverageEnable = FALSE;<br>&nbsp;&nbsp;&nbsp; BlendEnable[0] = TRUE;<br>&nbsp;&nbsp;&nbsp; SrcBlend = SRC_ALPHA ;<br>&nbsp;&nbsp;&nbsp; DestBlend = INV_SRC_ALPHA ;<br>&nbsp;&nbsp;&nbsp; BlendOp = ADD;<br>&nbsp;&nbsp;&nbsp; SrcBlendAlpha = ZERO;<br>&nbsp;&nbsp;&nbsp; DestBlendAlpha = ZERO;<br>&nbsp;&nbsp;&nbsp; BlendOpAlpha = ADD;<br>&nbsp;&nbsp;&nbsp; RenderTargetWriteMask[0] = 0x0F;<br>};<br>
<h2><a name=Rendering_Shadows></a>Rendering Shadows</h2>
<p>At the top level, the rendering steps look like the following:</p>
<ul>
    <li>If ambient lighting is enabled, render the entire scene with ambient only.
    <li>For each light in the scene, do the following:
    <ul>
        <li>Disable depth-buffer and frame-buffer writing.
        <li>Prepare the stencil buffer render states for rendering the shadow volume.
        <li>Render the shadow volume mesh with a vertex extruding shader. This sets up the stencil buffer according to whether or not the pixels are in the shadow volume.
        <li>Prepare the stencil buffer render states for lighting.
        <li>Prepare the additive blending mode.
        <li>Render the scene for lighting with only the light being processed. </li>
    </ul>
    </li>
</ul>
<br>Shadow Volume并不是一个没有缺陷的技术。除了高像素填充率和阴影边界检测外，在绘制过程中还可能出现错误。错误的主要原因是当一个几何模型在计算自阴影时，它的面通常被完全照亮或者完全变暗，这取决于这个面是否朝向光源。光照计算必须使用顶点法向而非表面法向。对于接近平行光源的面，它会被完全照亮或者完全变暗，而实际上应该部分处于光源中。这是从stencil shadow volume中继承来的问题，在计算阴影时必须被考虑。这个问题可以通过增加mesh密度来解决，这也增加了处理mesh的时间。顶点法向和面法向越接近，表面的问题就越少。如果程序不能把问题限制在可接受的范围内，就必须考虑使用其他的算法，比如PRT或者Shadow Map。 
<img src ="http://www.cppblog.com/bloodbao/aggbug/56669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodbao/" target="_blank">bloodbao</a> 2008-07-20 10:48 <a href="http://www.cppblog.com/bloodbao/archive/2008/07/20/56669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dx10之模拟DX9</title><link>http://www.cppblog.com/bloodbao/archive/2008/07/20/56663.html</link><dc:creator>bloodbao</dc:creator><author>bloodbao</author><pubDate>Sun, 20 Jul 2008 02:31:00 GMT</pubDate><guid>http://www.cppblog.com/bloodbao/archive/2008/07/20/56663.html</guid><wfw:comment>http://www.cppblog.com/bloodbao/comments/56663.html</wfw:comment><comments>http://www.cppblog.com/bloodbao/archive/2008/07/20/56663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodbao/comments/commentRss/56663.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodbao/services/trackbacks/56663.html</trackback:ping><description><![CDATA[<p>Fixed-function Lighting Pipeline<br>ColorsOutput CalcLighting( float3 worldNormal, float3 worldPos, float3 cameraPos )<br>{<br>&nbsp;&nbsp;&nbsp; ColorsOutput output = (ColorsOutput)0.0;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;8; i++)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; //光线方向<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float3 toLight = g_lights[i].Position.xyz - worldPos;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //离光源距离<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float lightDist = length( toLight );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //atten＝（1/(a[2]*d*d+a[1]*d+a[1])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float fAtten = 1.0/dot( g_lights[i].Atten, float4(1,lightDist,lightDist*lightDist,0) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float3 lightDir = normalize( toLight );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //H<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float3 halfAngle = normalize( normalize(-cameraPos) + lightDir );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Phong方程，逐顶点光照<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.Diffuse += max(0,dot( lightDir, worldNormal ) * g_lights[i].Diffuse * fAtten) + g_lights[i].Ambient;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.Specular += max(0,pow( dot( halfAngle, worldNormal ), 64 ) * g_lights[i].Specular * fAtten );<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return output;<br>}<br>简单ALPHA测试<br>//<br>// PS for rendering with alpha test<br>//<br>float4 PSAlphaTestmain(PSSceneIn input) : COLOR0<br>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float4 color =&nbsp; tex2D( g_samLinear, g_txDiffuse, input.tex ) * input.colorD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( color.a &lt; 0.5 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; discard;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return color;<br>}<br>雾化：</p>
<p>//<br>// Calculates fog factor based upon distance<br>//<br>// E is defined as the base of the natural logarithm (2.71828)<br>float CalcFogFactor( float d )<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float fogCoeff = 1.0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( FOGMODE_LINEAR == g_fogMode )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fogCoeff = (g_fogEnd - d)/(g_fogEnd - g_fogStart);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if( FOGMODE_EXP == g_fogMode )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fogCoeff = 1.0 / pow( E, d*g_fogDensity );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if( FOGMODE_EXP2 == g_fogMode )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fogCoeff = 1.0 / pow( E, d*d*g_fogDensity*g_fogDensity );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return clamp( fogCoeff, 0, 1 );<br>}</p>
<p>Finally, the pixel shader uses the fog factor to determine how much of the original color and how much of the fog color to output to the pixel.</p>
<p>最后，PS使用雾化参数确定雾颜色和纹理颜色的混合程度。<br>return fog * normalColor + (1.0 - fog)*g_fogColor;</p>
<img src ="http://www.cppblog.com/bloodbao/aggbug/56663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodbao/" target="_blank">bloodbao</a> 2008-07-20 10:31 <a href="http://www.cppblog.com/bloodbao/archive/2008/07/20/56663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由Ｘ文件导入引发的。。</title><link>http://www.cppblog.com/bloodbao/archive/2008/07/17/56387.html</link><dc:creator>bloodbao</dc:creator><author>bloodbao</author><pubDate>Thu, 17 Jul 2008 02:26:00 GMT</pubDate><guid>http://www.cppblog.com/bloodbao/archive/2008/07/17/56387.html</guid><wfw:comment>http://www.cppblog.com/bloodbao/comments/56387.html</wfw:comment><comments>http://www.cppblog.com/bloodbao/archive/2008/07/17/56387.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodbao/comments/commentRss/56387.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodbao/services/trackbacks/56387.html</trackback:ping><description><![CDATA[<p>刚开始学习DX10，发觉模型文件已经从原来的X格式变为SDKMESH格式，也就是说DX10不直接支持X文件了，<br>那现在该怎么办，我在NVSDK下找到了他的解决方案，先用DX9的接口打开X文件，再用DX10接口来渲染文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在DX10下，缺少了很多以前在DX9下的元素。比如，光照，材质等。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要实现这些元素，就必须在SHADER下手动去实现，那就意味着你必须熟悉图形学的内容，特别是其中的光照模型等内容。<br>比如，方向光的实现：<br>&nbsp;&nbsp;&nbsp; //directional light-----------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; float3 lightDir = g_lightPos - In.worldPos;<br>&nbsp;&nbsp;&nbsp; float3 lightDirNorm = normalize(lightDir);<br>&nbsp;&nbsp;&nbsp; float3 SDir = normalize( g_lightPos - g_eyePos);<br>&nbsp;&nbsp;&nbsp; float cosGammaDir = dot(SDir, V);<br>&nbsp;&nbsp;&nbsp; float dirLighting = g_Kd*dirLightIntensity*saturate( dot( N,lightDirNorm ) );<br>&nbsp;&nbsp;&nbsp; //diffuse<br>&nbsp;&nbsp;&nbsp; float3 diffuseDirLight = dirLighting*exDir;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //airlight<br>&nbsp;&nbsp;&nbsp; float3 dirAirLight = phaseFunctionSchlick(cosGammaDir)* dirLightIntensity*float3(1-exDir.x,1-exDir.y,1-exDir.z);<br>&nbsp;&nbsp;&nbsp; //specular<br>&nbsp;&nbsp;&nbsp; float3 specularDirLight = saturate( pow(&nbsp; dot(lightDirNorm,reflVect),g_specPower)) * dirLightIntensity * g_KsDir * exDir;<br>点光源的实现：<br>&nbsp; //point light 1---------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; //diffuse surface radiance and airlight due to point light<br>&nbsp;&nbsp;&nbsp; float3 pointLightDir = g_PointLightPos - In.worldPos;<br>&nbsp;&nbsp;&nbsp; //diffuse<br>&nbsp;&nbsp;&nbsp; float3 diffusePointLight1 = calculateDiffusePointLight(0.1,Dvp,g_DSVPointLight,pointLightDir,N,V);<br>&nbsp;&nbsp;&nbsp; //airlight<br>&nbsp;&nbsp;&nbsp; float3 airlight1 = calculateAirLightPointLight(Dvp,g_DSVPointLight,g_VecPointLightEye,V);<br>&nbsp;&nbsp;&nbsp; //specular<br>&nbsp;&nbsp;&nbsp; float3 specularPointLight = Specular(g_PointLightIntensity, g_KsPoint, length(pointLightDir), Dvp, g_specPower, normalize(pointLightDir), reflVect);<br>计算点光源的漫射光：<br>float3 calculateDiffusePointLight(float Kd,float Dvp,float Dsv,float3 pointLightDir,float3 N,float3 V)<br>{</p>
<p>&nbsp;&nbsp;&nbsp; float Dsp = length(pointLightDir);<br>&nbsp;&nbsp;&nbsp; float3 L = pointLightDir/Dsp;<br>&nbsp;&nbsp;&nbsp; float thetas = acos(dot(N, L));<br>&nbsp;&nbsp;&nbsp; float lightIntensity = g_PointLightIntensity * 100;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //spotlight<br>&nbsp;&nbsp;&nbsp; float angleToSpotLight = dot(-L, g_SpotLightDir);<br>&nbsp;&nbsp;&nbsp; if(g_useSpotLight)<br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; if(angleToSpotLight &gt; g_cosSpotlightAngle)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lightIntensity *= abs((angleToSpotLight - g_cosSpotlightAngle)/(1-g_cosSpotlightAngle));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lightIntensity = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //diffuse contribution<br>&nbsp;&nbsp;&nbsp; float t1 = exp(-g_beta.x*Dsp)*max(cos(thetas),0)/Dsp;<br>&nbsp;&nbsp;&nbsp; float4 t2 = g_beta.x*Gtable.SampleLevel(samLinearClamp, float2((g_beta.x*Dsp-g_diffXOffset)*g_diffXScale, (thetas-g_diffYOffset)*g_diffYScale),0)/(2*PI);<br>&nbsp;&nbsp;&nbsp; float rCol = (t1+t2.x)*exp(-g_beta.x*Dvp)*Kd*lightIntensity/Dsp;<br>&nbsp;&nbsp;&nbsp; float diffusePointLight = float3(rCol,rCol,rCol);&nbsp; <br>&nbsp;&nbsp;&nbsp; return diffusePointLight.xxx;<br>}<br>计算高光：<br>float3 Specular(float lightIntensity, float Ks, float Dsp, float Dvp, float specPow, float3 L, float3 VReflect)<br>{<br>&nbsp;&nbsp;&nbsp; lightIntensity = lightIntensity * 100;<br>&nbsp;&nbsp;&nbsp; float LDotVReflect = dot(L,VReflect);<br>&nbsp;&nbsp;&nbsp; float thetas = acos(LDotVReflect);</p>
<p>&nbsp;&nbsp;&nbsp; float t1 = exp(-g_beta*Dsp)*pow(max(LDotVReflect,0),specPow)/Dsp;<br>&nbsp;&nbsp;&nbsp; float4 t2 = g_beta.x*G_20table.SampleLevel(samLinearClamp, float2((g_beta.x*Dsp-g_20XOffset)*g_20XScale, (thetas-g_20YOffset)*g_20YScale),0)/(2*PI);<br>&nbsp;&nbsp;&nbsp; float specular = (t1+t2.x)*exp(-g_beta.x*Dvp)*Ks*lightIntensity/Dsp;<br>&nbsp;&nbsp;&nbsp; return specular.xxx;<br>}<br>下一步，考虑如何不通过DX9接口，直接导入X文件。</p>
<img src ="http://www.cppblog.com/bloodbao/aggbug/56387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodbao/" target="_blank">bloodbao</a> 2008-07-17 10:26 <a href="http://www.cppblog.com/bloodbao/archive/2008/07/17/56387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>放假休息</title><link>http://www.cppblog.com/bloodbao/archive/2008/07/15/56197.html</link><dc:creator>bloodbao</dc:creator><author>bloodbao</author><pubDate>Tue, 15 Jul 2008 07:53:00 GMT</pubDate><guid>http://www.cppblog.com/bloodbao/archive/2008/07/15/56197.html</guid><wfw:comment>http://www.cppblog.com/bloodbao/comments/56197.html</wfw:comment><comments>http://www.cppblog.com/bloodbao/archive/2008/07/15/56197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bloodbao/comments/commentRss/56197.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bloodbao/services/trackbacks/56197.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 唉，终于放署假了，我应该做些什么了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本来想写个程序的，可是我发觉自已的自控力太差了。刚摸到一本小说，就被迷住了，以至于这一周都在看那本小说，程序方面是一点进度都有。那是本关于SC的小说，但为一个星际迷，我深深地被吸引了，每当我一摸到电脑，就不自觉地点进小说的网页中，进入那个SC的虚幻空间。<br>看完小说，本以为还能干点什么，结果又下了本DOOM启示录，又迷进去了。哎，看来小说是不能碰啦，我可不想永远呆在这个鬼地方。<br>等找到工作，再看小说吧。
<img src ="http://www.cppblog.com/bloodbao/aggbug/56197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bloodbao/" target="_blank">bloodbao</a> 2008-07-15 15:53 <a href="http://www.cppblog.com/bloodbao/archive/2008/07/15/56197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>