<?xml version="1.0" encoding="utf-8" ?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" 
			xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" 
			xmlns:cc="http://web.resource.org/cc/" xml:lang="ja">
<channel rdf:about="http://zhangci226.blog125.fc2.com/?xml">
<title>HiTechGame</title>
<link>http://zhangci226.blog125.fc2.com/</link>
<description>High-Tech Game Development</description>
<dc:language>ja</dc:language>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://zhangci226.blog125.fc2.com/blog-entry-10.html" />
<rdf:li rdf:resource="http://zhangci226.blog125.fc2.com/blog-entry-8.html" />
<rdf:li rdf:resource="http://zhangci226.blog125.fc2.com/blog-entry-7.html" />
<rdf:li rdf:resource="http://zhangci226.blog125.fc2.com/blog-entry-6.html" />
<rdf:li rdf:resource="http://zhangci226.blog125.fc2.com/blog-entry-5.html" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://zhangci226.blog125.fc2.com/blog-entry-10.html">
<link>http://zhangci226.blog125.fc2.com/blog-entry-10.html</link>
<title>Motion Analysis HTR</title>
<description> &amp;nbsp; -------------下面是应用HTR技术制作的人体骨骼动画----------*原创内容，转载请注明出处*
 </description>
<content:encoded>
<![CDATA[ <p><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/ncopy.gif"><img alt="ncopy.gif" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/ncopy.gif" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr01.jpg"><img alt="htr01.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr01.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr02.jpg"><img alt="htr02.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr02.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr03.jpg"><img alt="htr03.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr03.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr04.jpg"><img alt="htr04.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr04.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr05.jpg"><img alt="htr05.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr05.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr06.jpg"><img alt="htr06.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr06.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr07.jpg"><img alt="htr07.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr07.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr08.jpg"><img alt="htr08.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr08.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr09.jpg"><img alt="htr09.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr09.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr10.jpg"><img alt="htr10.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr10.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr11.jpg"><img alt="htr11.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr11.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr12.jpg"><img alt="htr12.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr12.jpg" /></a> <br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr13.jpg"><img alt="htr13.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/htr13.jpg" /></a>&nbsp; <br /><br /><strong><font style="BACKGROUND-COLOR: #ffcc00" color="#0000ff" size="4">-------------下面是应用HTR技术制作的人体骨骼动画----------</font></strong></p><p><strong><span></span></strong><embed src="http://www.youtube.com/v/uzmQFWkEYFU&amp;hl=ko&amp;fs=1" width="425" height="344" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"></embed></p><p><span style="COLOR: #ff0000"><strong>*原创内容，转载请注明出处*</strong></span></p> ]]>
</content:encoded>
<dc:subject>Computer Anmition</dc:subject>
<dc:date>2008-11-22T01:06:13+09:00</dc:date>
<dc:creator>三只熊熊</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://zhangci226.blog125.fc2.com/blog-entry-8.html">
<link>http://zhangci226.blog125.fc2.com/blog-entry-8.html</link>
<title>问题5-Blending</title>
<description> 下面的问题是混合（Blending），就像图中看到的一样，三个物体都是半透明状态，要实现这种效果，就要用到Blending技术。使用的混合的时候，要注意顺序，首先要绘制不使用混合的物体，在这个例子中就是背景墙和地板了，然后再绘制需要混合的物体。绘制要混合的物体的时候也要注意按照Z轴的方向从远到近来绘制。混合后的颜色是通过下面的公式来计算的：OutputPixel = SourcePixel * SourceBlendFactor + DestPexel * DestBlendFactor
 </description>
<content:encoded>
<![CDATA[ 下面的问题是混合（Blending），就像图中看到的一样，三个物体都是半透明状态，要实现这种效果，就要用到Blending技术。<br /><br /><a href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/chatper7.jpg" target="_blank"><img src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/chatper7.jpg" alt="blending" border="0" /></a><br /><br />使用的混合的时候，要注意顺序，首先要绘制不使用混合的物体，在这个例子中就是背景墙和地板了，然后再绘制需要混合的物体。绘制要混合的物体的时候也要注意按照Z<br />轴的方向从远到近来绘制。<br /><br />混合后的颜色是通过下面的公式来计算的：<br /><br /><span style="color:#0066ff">OutputPixel = SourcePixel * SourceBlendFactor + DestPexel * DestBlendFactor</span><br /><br />这里乘法颜色向量的分量相乘。在公式中：<br /><br />OutputPixel：混合后的像素。<br />SourcePixel：源像素。<br />SourceBlendFactor：源像素在混合中的比例，在[0，1]之间取值。<br />DestPexel:目的像素。<br />DestBlendFactor：目的像素在混合中的比例，在[0，1]之间取值。<br /><br />在混合之前，要使用 SetRenderState(D3DRS_ALPHABLENDENABLE, true) 来激活混合选项。然后设置混合如下：<br /><br /><span style="color:#0066ff">Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );<br />Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );</span><br /><br />这里第一个参数分别设置了源混合像素和目的混合像素。第二个参数是混合的方式，可选值很多，具体的混合方式可以参看SDK。一般都使用D3DBLEND_SRCALPHA和D3DBLEND_INVSRCALPHA。它们分别表示：<br /><br />D3DBLEND_SRCALPHA <br />Blend factor is (As, As, As, As). <br />D3DBLEND_INVSRCALPHA <br />Blend factor is ( 1 - As, 1 - As, 1 - As, 1 - As). <br /><br />图中显示了两种Blengding形式，一种是基于D3DMATERIAL9对象的Diffuse属性的Alpha值，一种是使用带有Alpha通道的纹理贴图。所以在混合的时候还要指定使用哪一种混合。如下：<br /><br />//使用Diffuse的Alpha值<br /><span style="color:#0066ff">Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);<br />Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);</span><br /><br />//使用带有Alpha通道的贴图<br /><span style="color:#0066ff">Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);<br />Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);</span><br /><br />该函数的原型是：<br /><span style="color:#0066ff">HRESULT SetTextureStageState(<br />  DWORD Stage,<br />  D3DTEXTURESTAGESTATETYPE Type,<br />  DWORD Value<br />);</span><br /><br />第一个参数是指定的纹理层，第二个参数指定纹理层表现类型，第三个参数可以在D3DTEXTUREOP中指定，也可以在D3DTA中指定。更多的信息也可以在SDK中查看。<br /><br />最后，使用了混合后，在不用的时候要立即关闭。<br /><br /><span style="color:#0066ff">SetRenderState(D3DRS_ALPHABLENDENABLE, false)</span><br /><br /> ]]>
</content:encoded>
<dc:subject>DirectX9</dc:subject>
<dc:date>2008-10-07T16:44:10+09:00</dc:date>
<dc:creator>三只熊熊</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://zhangci226.blog125.fc2.com/blog-entry-7.html">
<link>http://zhangci226.blog125.fc2.com/blog-entry-7.html</link>
<title>问题4-Textrue</title>
<description> 下面是关于D3D贴图的内容。问题很简单，就是给一个去除了上下面的立方体的内外贴图。问题描述：在一个窗口中显示一个没有上下底面的立方体，并且用8张图给立方体内部的4个面和外部的4个面贴图，并且让立方体保持旋转。首先，要用VertexBuffer和IndexBuffer建立一个没有上下底面的立方体，因为要使用贴图，贴图要使用贴图坐标，所以这里我们的Vertex结构体要修改，要加入贴图坐标（u，v），下面的图表示了一个贴图坐标。然后修改我
 </description>
<content:encoded>
<![CDATA[ <a href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/ncopy.gif" target="_blank"><img src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/ncopy.gif" alt="ncopy.gif" border="0" /></a><br /><br />下面是关于D3D贴图的内容。问题很简单，就是给一个去除了上下面的立方体的内外贴图。<br /><br />问题描述：<br /><br />在一个窗口中显示一个没有上下底面的立方体，并且用8张图给立方体内部的4个面和外部的4个面贴图，并且让立方体保持旋转。<br /><br /><a href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/Textrue.jpg" target="_blank"><img src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/Textrue.jpg" alt="Textrue.jpg" border="0" /></a><br /><br />首先，要用VertexBuffer和IndexBuffer建立一个没有上下底面的立方体，因为要使用贴图，贴图要使用贴图坐标，所以这里我们的Vertex结构体要修改，要加入贴图坐标（u，v），下面的图表示了一个贴图坐标。<br /><br /><a href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/Textrue_coordinate.jpg" target="_blank"><img src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/Textrue_coordinate.jpg" alt="Textrue_coordinate.jpg" border="0" /></a><br /><br />然后修改我们的结构体：<br /><br /><span style="color:#0066ff">struct Vertex<br />{<br />	Vertex(){}<br />	Vertex(<br />		float x, float y, float z,<br />		float nx, float ny, float nz,<br />		float u, float v)<br />	{<br />		_x  = x;  _y  = y;  _z  = z;<br />		_nx = nx; _ny = ny; _nz = nz;<br />		_u  = u;  _v  = v;<br />	}<br />    float _x, _y, _z;<br />    float _nx, _ny, _nz;<br />    float _u, _v; <span style="color:#ffffff">// texture coordinates</span>};<br />#define FVF_VERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)</span><br /><br />要使用贴图，就还要使用D3DFVF_TEX1。<br /><br />使用上面的结构构造好立方体后，就可以开始贴图了。可以使用LPDIRECT3DTEXTURE9创建一个结构体。这里要贴8张图片，所以可以创建一个数组。<br /><br /><span style="color:#0066ff">LPDIRECT3DTEXTURE9* tex = NULL;<br />tex = new LPDIRECT3DTEXTURE9[8];</span><br /><br />然后再使用D3DXCreateTextureFromFile载入要贴图的图片<br /><br /><span style="color:#0066ff">D3DXCreateTextureFromFile(_device,L"img\\banana1.bmp",&tex[0]);</span><br /><br />第一个参数是设备对象，第二个参数是图片的路径，第三个参数就是刚才创建的LPDIRECT3DTEXTURE9数组。<br /><br />最后显示贴图的时候使用SetTexture，要一个面一个面的分别显示<br /><br /><span style="color:#0066ff">_device->SetTexture(0, tex[0]);<br />_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 6, 0,2); </span><br /><br />这样一直把立方体的内外8个面完成为止。<br /><br />可能有同学不知道在立方体的内部怎么贴图，其实很简单，由于我们要贴8个图，所以我们要创建48个IndexBuffer ，24个在外面，24个在里面，在外面的24个我们用顺时针顺序，里面的24个只要使用反时针的顺序就可以了。比如<br /><br /><span style="color:#ffffff">//外面的一面</span><br /><span style="color:#0066ff">i[0] = 0; i[1] = 1; i[2] = 2;<br />i[3] = 0; i[4] = 2; i[5] = 3;</span><br /><br /><span style="color:#ffffff">//里面的一面</span><br /><span style="color:#0066ff">i[24] = 2; i[25] = 1; i[26] = 0;<br />i[27] = 3; i[28] = 2; i[29] = 0;</span><br /><br />最后也要记住使用了LPDIRECT3DTEXTURE9后要释放资源。<br /><br /><span style="color:#ff0000">*原创内容，转载请注明出处*</span><br /><br /><br /> ]]>
</content:encoded>
<dc:subject>DirectX9</dc:subject>
<dc:date>2008-09-29T17:12:47+09:00</dc:date>
<dc:creator>三只熊熊</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://zhangci226.blog125.fc2.com/blog-entry-6.html">
<link>http://zhangci226.blog125.fc2.com/blog-entry-6.html</link>
<title>问题3-D3D Lighting</title>
<description> 今天要学习的是dx中的光照。 问题描述： 在一个窗口中显示5个物体，在黑暗的环境中分别用点光源，直线光源，聚光源照射物体，并且照射光源每隔1秒自动变换，物体的颜色也每隔1秒自己随机变换颜色。  DX9供给我们三种光源：点光源（PointLight），直线光源（DirectionalLight）和聚光源（SpotLight）。点光源就是像是太阳一样，在空间一点像各个方向射出光线；直线光源就是从一个方向往另一个方向照射的光；聚光源就像一个手电筒射
 </description>
<content:encoded>
<![CDATA[ <a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/ncopy.gif"><img alt="ncopy.gif" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/ncopy.gif" /></a> <br /><br />今天要学习的是dx中的光照。 <br /><br />问题描述： <br /><br />在一个窗口中显示5个物体，在黑暗的环境中分别用点光源，直线光源，聚光源照射物体，并且照射光源每隔1秒自动变换，物体的颜色也每隔1秒自己随机变换颜色。 <br /><br /><a target="_blank" href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/Lighting.jpg"><img alt="Lighting.jpg" border="0" src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/Lighting.jpg" /></a> <br /><br /><br /><br />DX9供给我们三种光源：点光源（PointLight），直线光源（DirectionalLight）和聚光源（SpotLight）。点光源就是像是太阳一样，在空间一点像各个方向射出光线；直线光源就是从一个方向往另一个方向照射的光；聚光源就像一个手电筒射出的光一样。 <br /><br />首先，在头文件里不仅要想上次一样定义颜色，还要定义材质（Material），和光源。定义材质是为了让物体有颜色。光源可以用D3DLIGHT9这个结构体来定义，材质可以使用D3DMATERIAL9这个结构体来定义。我们来先看看这2个结构体是如何构造的，先看看D3DLIGHT9的结构<br /><br /><span style="color:#0066ff">typedef struct _D3DLIGHT9 { <br />D3DLIGHTTYPE Type;&nbsp; <br /><span style="color:#ffffff">/*光源类型*/ </span><br />D3DCOLORVALUE Diffuse; <br /><span style="color:#ffffff">/* 漫射光的颜色*/ </span><br />D3DCOLORVALUE Specular;<br /><span style="color:#ffffff"> /*&nbsp;镜面放射光的颜色 */ </span><br />D3DCOLORVALUE Ambient; <br /><span style="color:#ffffff">/* 环境光的颜色*/ </span><br />D3DVECTOR Position; <br /><span style="color:#ffffff">/* 光源位置，对于直线光源来说没有意义*/ </span><br />D3DVECTOR Direction;<br /><span style="color:#ffffff"> /* 光源照射方向，对于点光源来说没有意义*/ </span><br />float Range; <br /><span style="color:#ffffff">/* 光照射的距离，对于直线光源来说没有意义*/ </span><br />float Falloff;<br /><span style="color:#ffffff"> /* 只用来聚光源，决定聚光源圆锥形光照范围内外的强度差异，一般设置为0.1f */</span> <br />float Attenuation0; <br />float Attenuation1; <br />float Attenuation2;<br /><span style="color:#ffffff"> /*这三个主要是决定光强度的衰减程度，对于直线光源没有意义*/ </span><br />float Theta; <br /><span style="color:#ffffff">/* 指定聚光源内圆锥形的角度*/ </span><br />float Phi; <br /><span style="color:#ffffff">/* 指定聚光源外圆锥形的角度*/ </span><br />} D3DLIGHT9; </span><br /><br />这就是D3DLIGHT9 的结构，里面的内容很多，实际用的时候并没有这么复杂。下面是D3DMATERIAL9结构体。<br /><br /><span style="color:#0066ff">typedef struct _D3DMATERIAL9 {<br />    D3DCOLORVALUE   Diffuse;        <br /><span style="color:#ffffff">/* 漫反射光*/</span><br />    D3DCOLORVALUE   Ambient;       <br /><span style="color:#ffffff"> /* 环境光*/</span><br />    D3DCOLORVALUE   Specular;      <br /><span style="color:#ffffff"> /* 镜面反射光*/</span><br />    D3DCOLORVALUE   Emissive;     <br /><span style="color:#ffffff">  /* 是使物体自身放光的参数*/</span><br />    float           Power;          <br /><span style="color:#ffffff">/* 镜面反射的尖锐程度*/</span><br />} D3DMATERIAL9;</span><br /><br />这就是D3DMATERIAL9的结构，看起来要比D3DLIGHT9要简单得多。<br /><br />颜色，材质，光源定义好后，就可以使用了。<br /><br /><span style="color:#0066ff">Device->SetLight(0, &Light);</span><br /><br />这里Light就是上面的D3DLIGHT9定义的结构体。使用的时候一定要打开光照：<br /><br /><span style="color:#0066ff">Device->LightEnable(0, true);</span><br /><br />设置物体材质：<br /><br /><span style="color:#0066ff">Device->SetMaterial(&Mtrls);</span><br /><br />这里Mtrls就是上面的D3DMATERIAL9定义的结构体。<br /><br />光照设置过程大概就是这样的。下面说一下程序里要求的每隔1秒变换光源。其实就是定义一个Timer，在c++中，Timer是被回调函数回调的，所以Timer要写成回调函数的形式。<br /><br /><span style="color:#0066ff">void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime) <br />{<br />       <span style="color:#ffffff">//这里是操作代码</span>}</span><br /><br />调用的时候：<br /><br /><span style="color:#0066ff">SetTimer(0,1,1000,TimerProc);</span><br /><br />第一个参数是窗口句柄，第二个参数是Timer的序号，第三个参数是时间间隔，最后一个参数是回调函数。<br /><br />时间间隔的问题解决了，剩下就是随机变换颜色的问题了。当然就要使用随机数的函数。为了不让每次取得的随机数相同，所以还要设置随机数种子，一般都是用系统时间来作为种子。<br /><br />设置随机种子：<br /><br /><span style="color:#0066ff">srand((unsigned)time(NULL));</span><br /><br />time是取得系统时间。然后用rand()函数就可以取得随机数了。我们把材质结构体可以用一个数组的形式表示，然后用随机数来作为数组的下标就可以完成随机变换颜色的功能了。但是rand()取得随机数没有范围，所以我们还要给它设置个范围。在MSDN上查了一圈，发现了个公式：<br /><br /><span style="color:#0066ff">(double)rand() / (RAND_MAX + 1) * (range_max - range_min)+ range_min;</span><br /><br />这个公式用来返回有范围的随机数。这里RAND_MAX是个系统定义的宏，我们可以不去管它，range_max和range_min分别对应我们想要的范围的最大值和最小值。这样我们的功能就都可以实现了。<br /><br /><span style="color:#ff0000">*原创内容，转载请注明出处。*</span><br /><br /><br /> ]]>
</content:encoded>
<dc:subject>DirectX9</dc:subject>
<dc:date>2008-09-23T18:20:40+09:00</dc:date>
<dc:creator>三只熊熊</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://zhangci226.blog125.fc2.com/blog-entry-5.html">
<link>http://zhangci226.blog125.fc2.com/blog-entry-5.html</link>
<title>问题2-D3D Color</title>
<description> 这次是学习DX中对颜色的处理。使用ColorVertex这种结构体保存带有染色的顶点，然后对物体进行渲染。问题描述：    在窗口中显示两个立方体，其中一个使用D3DSHADE_GOURAUD渲染模式，一个使用D3DSHADE_FLAT渲染模式；并且使两个立方体各自绕X，Y，Z轴自转的同时，两个立方体同时绕Y轴公转。    为了要使用带颜色的定点，我们可以先在头文件里定义颜色常量，const D3DXCOLOR  WHITE( D3DCOLOR_XRGB(255, 255, 255) );const D3DXCOLOR
 </description>
<content:encoded>
<![CDATA[  <a href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/ncopy.gif" target="_blank"><img src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/ncopy.gif" alt="ncopy.gif" border="0" /></a><br /><br /><br />    这次是学习DX中对颜色的处理。使用ColorVertex这种结构体保存带有染色的顶点，然后对物体进行渲染。<br /><br />问题描述：<br /><br />    在窗口中显示两个立方体，其中一个使用D3DSHADE_GOURAUD渲染模式，一个使用D3DSHADE_FLAT渲染模式；并且使两个立方体各自绕X，Y，Z轴自转的同时，两个立方体同时绕Y轴公转。<br /><br /><a href="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/color.jpg" target="_blank"><img src="http://blog-imgs-27.fc2.com/z/h/a/zhangci226/color.jpg" alt="color.jpg" border="0" /></a><br /><br />    为了要使用带颜色的定点，我们可以先在头文件里定义颜色常量，<br /><br /><span style="color:#0066ff">const D3DXCOLOR  WHITE( D3DCOLOR_XRGB(255, 255, 255) );<br />const D3DXCOLOR  BLACK( D3DCOLOR_XRGB(  0,   0,   0) );</span><br /><br />可以像这样定义自己想要的颜色。然后定义带颜色的顶点：<br /><br /><span style="color:#0066ff">struct ColorVertex<br />{<br />	ColorVertex(){}<br />	ColorVertex(float x,float y,float z,D3DCOLOR c)<br />	{<br />		_x = x;<br />		_y = y;<br />		_z = z;<br />		_color = c;<br />	}<br />	float _x,_y,_z;<br />	D3DCOLOR _color;<br />	static const DWORD FVF;<br />};<br />const DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;</span><br /><br />    这里的结构和不带颜色的定点结构是一样的，只不过就多了一个color参数。这种定点的结构也可以当成公式一样记忆下来。要画出一个立方体，我们这里要使用设备的CreateVertexBuffer和CreateIndexBuffer，这里要注意一点，一个立方体有8个顶点，所以我们的顶点数是8，但是index的话，就有36个了，立方体是6个面，一个面是6个index，因为在画每一个面的时候，是用2个三角形组合而成的，每个三角形都要用3个index，在一个四边形中画条对角线，就可以知道了，2个三角形，虽然2个顶点是一样的，但是还是要算在总数里面，所以6×6就是36个index。<br /><br /><span style="color:#0066ff">Device->CreateVertexBuffer(<br />		8 * sizeof(ColorVertex),<br />		D3DUSAGE_WRITEONLY,<br />		ColorVertex::FVF,<br />		D3DPOOL_MANAGED,<br />		&VB,<br />		0);<br />	ColorVertex* v;<br /><br />	VB->Lock(0,0,(void**)&v,0);<br />	<br />	v[0] = ColorVertex(-1.0f, -1.0f, -1.0f, d3d::BLUE);<br />	v[1] = ColorVertex(-1.0f,  1.0f, -1.0f, d3d::PURPLE);<br />	v[2] = ColorVertex( 1.0f,  1.0f, -1.0f, d3d::RED);<br />	v[3] = ColorVertex( 1.0f, -1.0f, -1.0f, d3d::MAGENTA);<br />	v[4] = ColorVertex(-1.0f, -1.0f,  1.0f, d3d::CYAN);<br />	v[5] = ColorVertex(-1.0f,  1.0f,  1.0f, d3d::GREEN);<br />	v[6] = ColorVertex( 1.0f,  1.0f,  1.0f, d3d::YELLOW);<br />	v[7] = ColorVertex( 1.0f, -1.0f,  1.0f, d3d::WHITE);<br /><br />	VB->Unlock();<br /><br /><br />	Device->CreateIndexBuffer(<br />		36 * sizeof(WORD),<br />		D3DUSAGE_WRITEONLY,<br />		D3DFMT_INDEX16,<br />		D3DPOOL_MANAGED,<br />		&IB,<br />		0);<br /><br />	WORD* indices = 0;<br />	IB->Lock(0, 0, (void**)&indices, 0);<br /><br />	// front side<br />	indices[0]  = 0; indices[1]  = 1; indices[2]  = 2;<br />	indices[3]  = 0; indices[4]  = 2; indices[5]  = 3;<br /><br />	// back side<br />	indices[6]  = 4; indices[7]  = 6; indices[8]  = 5;<br />	indices[9]  = 4; indices[10] = 7; indices[11] = 6;<br /><br />	// left side<br />	indices[12] = 4; indices[13] = 5; indices[14] = 1;<br />	indices[15] = 4; indices[16] = 1; indices[17] = 0;<br /><br />	// right side<br />	indices[18] = 3; indices[19] = 2; indices[20] = 6;<br />	indices[21] = 3; indices[22] = 6; indices[23] = 7;<br /><br />	// top<br />	indices[24] = 1; indices[25] = 5; indices[26] = 6;<br />	indices[27] = 1; indices[28] = 6; indices[29] = 2;<br /><br />	// bottom<br />	indices[30] = 4; indices[31] = 0; indices[32] = 3;<br />	indices[33] = 4; indices[34] = 3; indices[35] = 7;<br /><br />	IB->Unlock();</span><br /><br />上面的代码就是分别设置顶点缓冲和index缓冲，VB,IB分别是<br /><br /><span style="color:#0066ff">IDirect3DVertexBuffer9* VB = 0;<br />IDirect3DIndexBuffer9*  IB = 0;</span><br /><br />    在设置顶点和index前一定要调用Lock方法，在设置完成后也一定要Unlock。还有一点要注意的地方，就是在设置index的时候，顺序是有讲究的，也就是说所有三角形（也就是indices[0]  = 0; indices[1]  = 1; indices[2]  = 2;这里决定的三角形）画线的方向必须一致。也就是说所有三角形都是顺时针方向或都是反时针方向。<br /><br />    立方体画好了后，就要设置它的旋转了。上篇文章中已经讲了绕轴自转的方法。这里主要说一下公转的方法。其实公转和简单，我之前也搞不懂，想了很久，在网上问了很多朋友，还是没有解决，最后在一次不经意的测试中发现了公转的秘密。呵呵～<br /><br />    前面说过了，让物体在替他坐标点自转，需要用平移向量点乘旋转向量，而且要注意方向，也就是平移向量要放在前面，如果这2个顺序换一下，把旋转向量放在前面，会出现什么结果呢？？答案正是我们想要的公转！所以这里我们只需要交换点乘前后参数的位子就可以了。比如：<br /><br /><span style="color:#0066ff">D3DXMatrixMultiply(&Position1,&Position1, &Ry);</span><br /><br />这样就可以让物体绕Y轴公转，公转后再让物体自转就可以到达我们的要求了。<br /><br />    最后在窗口中显示物体（当然设定投影和摄像机这里省略了）：<br /><br /><span style="color:#0066ff">Device->SetStreamSource(0, VB, 0, sizeof(ColorVertex));<br />Device->SetIndices(IB);<br />Device->SetFVF(ColorVertex::FVF);<br /><br />Device->SetTransform(D3DTS_WORLD,&Position1);<br />Device->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);<br />Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);</span><br /><br />    要显示另一个立方体，再使用后面三句就可以了，不过要改变显示的坐标哦。程序完成后，就可以看到2种不同渲染方法的差别了。<br /><br /><span style="color:#ff0000">*原创文章，转载请注明出处*</span> ]]>
</content:encoded>
<dc:subject>DirectX9</dc:subject>
<dc:date>2008-09-22T17:06:37+09:00</dc:date>
<dc:creator>三只熊熊</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
</rdf:RDF>