﻿<?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++博客-C++优雅之旅-随笔分类-DirectX</title><link>http://www.cppblog.com/eros/category/6680.html</link><description>探索C++</description><language>zh-cn</language><lastBuildDate>Wed, 07 Nov 2012 11:52:03 GMT</lastBuildDate><pubDate>Wed, 07 Nov 2012 11:52:03 GMT</pubDate><ttl>60</ttl><item><title>Direct3D材质和灯光小节</title><link>http://www.cppblog.com/eros/archive/2009/05/14/82894.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Wed, 13 May 2009 18:53:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2009/05/14/82894.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/82894.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2009/05/14/82894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/82894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/82894.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">mDevice</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetRenderState(D3DRS_AMBIENT,&nbsp;</span><span style="color: #000000;">0xffffffff</span><span style="color: #000000;">);</span></div>&nbsp; &nbsp; &nbsp; 光照
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">DirectX<font face="宋体">中有四种光照模型：</font></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">环境光：环境光没有方向和位置上的特征，只有一个颜色亮度值，不会衰减，所以在所有方向和所有物体表面投射的环境光的数量是恒定不变的。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">漫反射：漫反射在生活中最为普遍，太阳光的直射，日光灯的照射都可以用漫反射光来模拟。漫反射由光的方向和物体表面的法向量决定。漫反射光的空间位置和方向对物体的照明有很大的影响。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">镜面反射：当观察金属制品和玻璃制品的表面时，改变观察点的位置，会发现物体表面的亮度也会发生变化，这种现象称之为镜面反射。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">自发光：就是物体自身发光，通过设置材质的自发光属性<font face="Times New Roman">Emissive</font><font face="宋体">（颜色和透明度）来实现。自发光可以影响一个对象的颜色。可以使用材质的自发光来实现发光的对象，而不用在场景中添加灯光，减少了计算量。</font></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">用自发光属性创建的材质并不发射能被场景中其他物体反射的光，也就是说自发光不参与光照计算。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0"></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">有三种光源</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">点光源：点光源有颜色和位置，但是没有方向，它向所有方向发射的光都一样。在程序中需要提供点光源的颜色，位置，衰减系数等参数。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">电灯泡是点光源的一个例子。这种光的强度会随着距离物体的远近而衰减。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0"></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">方向光：只有方向和颜色属性的光源，没有位置，衰减。可以想象成从无穷远处发来的光，例如太阳光。</p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0"></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0">聚光灯：聚光灯有颜色，位置，方向，类似现实中的探照灯。聚光灯又一个明亮的内椎体和大一点的外椎体组成。光的强度从内椎体到外椎体逐渐衰减，衰减的规律由<font face="Times New Roman">Falloff,Theta(</font><font face="宋体">内锥角）和</font><font face="Times New Roman">Phi</font><font face="宋体">（外锥角）三个属性共同决定。</font></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt;" class="p0"></p>
<p style="margin-top: 0pt; margin-bottom: 0pt;" class="p0">&nbsp;&nbsp;&nbsp; DirectX<font face="宋体">中物体的颜色由光的颜色和材质的颜色共同决定</font><font face="Times New Roman">(</font><font face="宋体">和现实世界情况不同）。</font></p>
<p style="margin-top: 0pt; margin-bottom: 0pt;" class="p0">&nbsp;&nbsp;&nbsp; 默认情况下，D3D中的灯光是开启的，就是说写:<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;">mDevice-&gt;Set<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" alt="" />RenderState(D3DRS_LIGHTING,&nbsp;TRUE);</div>
&nbsp;&nbsp;&nbsp;
和忽略这一句效果一样。<br />&nbsp;&nbsp;&nbsp; <br />
<p>&nbsp;</p>
<p style="margin-top: 0pt; margin-bottom: 0pt;" class="p0">&nbsp;&nbsp;&nbsp; 如果要禁用灯光，就将这句代码中的TRUE改为FALSE。<br /></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">1 mDevice</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetRenderState(D3DRS_LIGHTING,&nbsp;FALSE);</span></div>
&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 如果禁用灯光，那么任何的材质设置都不会有效果。
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">2 mDevice</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetRenderState(D3DRS_AMBIENT,&nbsp;</span><span style="color: #000000;">0xffffffff</span><span style="color: #000000;">);</span></div>
&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 关于这两句代码(编号为1和2)，又有几种情况:<br />&nbsp;&nbsp;&nbsp; 1)1为FALSE时，启用2，那么会获得一个环境光照明，此时设置材质无效(渲染对象为白色)，纹理可以正常显示(如果有纹理)。<br />&nbsp;&nbsp;&nbsp; 2)1为TRUE时，启用2，材质设置有效，会影响渲染结果，纹理可以正常显示。<br />&nbsp;&nbsp;&nbsp; 3)1为FALSE时，禁用2，材质设置失效，纹理可以正常显示。<br />&nbsp;&nbsp;&nbsp; 4)1为TRUE时，禁用2，材质设置失效，纹理无法显示(渲染对象为黑色)。<br /><br />&nbsp; &nbsp;P.S.以上所说的材质指的是D3DMATERIAL9，不包括顶点色。带有顶点色时，1为TRUE时渲染为黑色，FALSE时为正常，和2的状态无关。<br /><br />&nbsp;&nbsp;&nbsp; 结论：当开启光照时，必须指定一种光源才能使渲染对象正确绘制(渲染状态设置的环境光或者其他3种类型的光源)。<br />
<p>&nbsp;</p>
<p style="margin-top: 0pt; margin-bottom: 0pt;" class="p0"></p><img src ="http://www.cppblog.com/eros/aggbug/82894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2009-05-14 02:53 <a href="http://www.cppblog.com/eros/archive/2009/05/14/82894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[ZT]DirectX中的投影变换</title><link>http://www.cppblog.com/eros/archive/2008/11/08/66356.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Sat, 08 Nov 2008 12:42:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2008/11/08/66356.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/66356.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2008/11/08/66356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/66356.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/66356.html</trackback:ping><description><![CDATA[<span style="font-family: 微软雅黑;">原贴地址：</span><a style="font-family: 微软雅黑;" target="_blank" href="http://blog.csdn.net/BAKER_LEE/archive/2008/08/20/2801515.aspx">http://blog.csdn.net/BAKER_LEE/archive/2008/08/20/2801515.aspx
</a><br><br style="font-family: 微软雅黑;"><span style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp; DirectX中投影变换D3DXMatrixPerspectiveFovLH（）其实产生的变换矩阵不是将3D物体转换为2D平面画面的变换。实际上
是把3D世界的物体变换到(1,1,0) (-1,1,0) (-1,-1,0) (1,-1,0) (1,1,1) (-1,1,1)
(-1,-1,1) (1,-1,1)这个小盒子中。在Jim Adams 的著作&lt;Role playing games with
DriectX 8.0&gt;和Frank Luna 的著作中&lt;Introduction to 3D Game Programming
with
DirectX9.0&gt;都把这个变换矩阵讲成从3D到2D的变换。实际上在DirectX中3D到2D的变换是由SDK自己完成的。而我们要做的是
把3D世界变换到上面那个小盒子中。 </span>
<p style="font-family: 微软雅黑;">这个变换矩阵是投影变换的预变换。</p>
<p style="font-family: 微软雅黑;">在DirectX中，把视口的高作为3D世界里面的长度：2.0f来使用的，一个视点观察世界的视野范围在Y轴上无论什么情况下都是 -1.0f到1.0f（这一点在后面来证明）。把视口的高作为y轴，顶端坐标为（x，1），底端坐标为（x，-1）。</p>
<p style="font-family: 微软雅黑;">视口：在窗体中显示3D的矩形范围，可以通过D3DDevice的SetViewPort（）来设置大小，默认的大小为窗体的大小。</p>
<p style="font-family: 微软雅黑;">变换的过程就是把点的向量乘以变换矩阵，可以得到这个点在新坐标系的对应向量，在投影变换矩阵中Z轴的值落在0~1之内，也就是说3D世界里所有的点都会被投影到以上描述的小盒子中。</p>
<p style="font-family: 微软雅黑;">我们用函数D3DXMatrixPerspectiveFovLH来获得该&#8220;投影变换&#8221;矩阵。</p>
<p style="font-family: 微软雅黑;">D3DXMATRIX * D3DXMatrixPerspectiveFovLH(</p>
<p style="font-family: 微软雅黑;">&nbsp;D3DXMATRIX *<em> pOut</em> ,</p>
<p style="font-family: 微软雅黑;">&nbsp;FLOAT <em> fovy</em> ,</p>
<p style="font-family: 微软雅黑;">&nbsp;FLOAT <em> Aspect</em> ,</p>
<p style="font-family: 微软雅黑;">&nbsp;FLOAT <em> zn</em> ,</p>
<p style="font-family: 微软雅黑;">&nbsp;FLOAT <em> zf</em> </p>
<p style="font-family: 微软雅黑;">);</p>
<p style="font-family: 微软雅黑;">其中参数fovy为y轴上的视角，Aspect为高宽比，zn为近裁面，zf为远裁面。</p>
<p style="font-family: 微软雅黑;">Y轴的视角：在DirectX的帮助文档中描述fovy为filed of view in y direction。</p>
<p style="font-family: 微软雅黑;">高宽比：一般用于全屏显示，如果我们要让3D世界充满整个窗口，就必须让高宽比等于窗口的高宽比，例如让我们的窗口正常显示&#8221;标准视野&#8221;[2X2
的一个面,顶点坐标为（1，1），（-1，1），（-1，-1），（1，-1）]，我们必须把窗口的高宽比设置成1：1，这样，标准视野就可以充满整个窗
口，否则
会在左右留出空白，这个空白是无法用VIEW，WORLD变换所能填充的，相当于word文档采用&#8220;文档&#8221;视图里面的两边的灰色区域，是无法编辑的，在一
般的3D程序里面是不允许出现这种情况的，但是我们的显示器的高宽比不是1：1，而且大部分的用户也不习惯用1：1的窗口来使用程序，我们需要调整这个标
准视野，来适应我们的窗口大小，Aspect就是这个作用，有一点需要说明的Aspect不等于1，不代表标准视野就不是（1，1），（-1，1），
（-1，-1），（1，-1），如果Aspect = 0.5
标准视野也还是（1，1），（-1，1），（-1，-1），（1，-1），只不过x轴上的单位长度的像素值 是 y轴上单位长度的像素值的2倍。</p>
<p style="font-family: 微软雅黑;">&nbsp;</p>
<p style="font-family: 微软雅黑;">裁面的作用: 在Z轴方向上，不显示z坐标小于zn的或者大于 zf的点。</p>
<p style="font-family: 微软雅黑;"><img alt="" src="http://images.cnblogs.com/cnblogs_com/baker_lee/projection2.JPG" border="0" width="297" height="203"></p>
<span style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在上图中，紫红色的线为我们要显示的面，红色的弧就是上面函数fovy</span><font style="font-family: 微软雅黑;" face="Times New Roman">的夹角，当这个夹角为90&#176;的时候，我们窗口的视野为标准视野，<span style="color: red;">当夹角缩小时，可视范围就变小，如图，从90&#176;变为60&#176;的时候，可视范围变小了，要显示的面，相对于可以范围变大了，由于我们的窗口是不变的，也就是说实际显示的像素值不变，要显示的面就相对于变大，fovy的值变小的结果就是把要显示的面变大。</span> </font>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当fovy为0的时候呢，视野就为0，就是说什么都看不到，窗口中显示的就是底色。</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当fovy变大至180&#176;的时候呢？视野的范围为视线夹角上的垂直于Z轴的且过点（0，0，1）的连线。当视线夹角变大视野范围也变大，夹角趋近于180&#176;的时候视野范围趋近于无穷大，要显示的面相对于视野范围就是0，也就是说缩小到最小就是0.所以我们在设定fovy的值为180&#176;的时候也是什么都看不见，为底色。</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那大于180&#176;的情况呢？在我们的视野理论上是不存在这种情况的，当视角大于180&#176;时，视角于Z轴垂直的连线是不会过点（0，0，1）的。但是函数放在我们面前，我们是可以输入大于180&#176;的数值，结果会如何呢？</p>
<p style="font-family: 微软雅黑;">非常神奇的事情发生了，我们的图以原点为中心旋转了180&#176;！这是无法用我们的视野理论来解释的,因为180&#176;的视野范围就已经是个极限了，&#8220;超越极限&#8221;是只能在广告中出现的词汇（如果能超越，那就不叫极限了：P）。</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在MSDN的文档中有这样一个数学公式：y-scale = cot（fovy/2）</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这下就明白了，当我们输入大于180&#176;的时候cot的值为负数。而x-scale = y-scale/ Aspect。.</p>
<p style="font-family: 微软雅黑;">也就是说，一个3D世界的点，在视野大于180&#176;的作用下，它的放大/缩小倍数不变，但是需要对X轴做一次对称变换，还要对Y轴做一次对称变换。相当于对原点做一次对称变换。</p>
<p style="font-family: 微软雅黑;">拿到这个公式，我们就可以对前面的标准做一个证明：</p>
<p style="font-family: 微软雅黑;">当fovy为90&#176; Aspect = 1的时候，就是说y-scale = cot（45&#176;） = 1 </p>
<p style="font-family: 微软雅黑;">x-scale = 1，这时y和x的缩放比都为1，没有缩放。我们显示这样一个面</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {-1.0f, -1.0f, 0.0f},</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {-1.0f, 1.0f, 0.0f},</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 1.0f, 1.0f, 0.0f},</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {-1.0f, -1.0f, 0.0f},</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 1.0f, 1.0f, 0.0f},</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 1.0f,-1.0f, 0.0f}</p>
<p style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp; 我们会发现无论怎么改变窗口的高度，这个画面的Y轴方向上都会充满整个视口。（如果我们把视口的高度和宽度设置成一样的，在X轴上也会充满整个视口）所以DirectX会以视口的高度的二分之一作为Y轴的单位长度。</p>
<br style="font-family: 微软雅黑;"><br>     <img src ="http://www.cppblog.com/eros/aggbug/66356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2008-11-08 20:42 <a href="http://www.cppblog.com/eros/archive/2008/11/08/66356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义顶点结构与D3DXCOLOR</title><link>http://www.cppblog.com/eros/archive/2008/11/08/66298.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Fri, 07 Nov 2008 20:54:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2008/11/08/66298.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/66298.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2008/11/08/66298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/66298.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/66298.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; <span style="font-family: 微软雅黑;">最近系统的学习Direct3D</span>，<span style="font-family: 微软雅黑; ">从DXSDK的例子学起。在Tut02_Vertices例子中，自定义顶点格式为：<br /><div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;CUSTOMVERTEX<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FLOAT&nbsp;x,&nbsp;y,&nbsp;z,&nbsp;rhw;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;color;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">D3DXCOLOR&nbsp;color;</span><span style="color: #008000;"><br /></span><span style="color: #000000;">};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;初始化顶点数据</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CUSTOMVERTEX&nbsp;vertices[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #000000;">150.0f</span><span style="color: #000000;">,&nbsp;&nbsp;</span><span style="color: #000000;">50.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.5f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;D3DXCOLOR(</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">)</span><span style="color: #008000;">/*</span><span style="color: #008000;">0xffff0000</span><span style="color: #008000;">*/</span><span style="color: #000000;">,&nbsp;},&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;x,&nbsp;y,&nbsp;z,&nbsp;rhw,&nbsp;color</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #000000;">250.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">250.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.5f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;D3DXCOLOR(</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">)</span><span style="color: #008000;">/*</span><span style="color: #008000;">0xff00ff00</span><span style="color: #008000;">*/</span><span style="color: #000000;">,&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span><span style="color: #000000;">50.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">250.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.5f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;D3DXCOLOR(</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0f</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">)</span><span style="color: #008000;">/*</span><span style="color: #008000;">0xff00ffff</span><span style="color: #008000;">*/</span><span style="color: #000000;">,&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;};</span></div>
&nbsp;&nbsp;&nbsp;&nbsp; 自定义格式结构体中注释掉的是我后来想用的D3DXCOLOR。原本以为将原先定义的DWORD颜色换成D3DXCOLOR类型，然后初始化的时候相应做替换就可以了，谁知道，渲染出来的三角形顶点颜色异常：<br />&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cppblog.com/images/cppblog_com/eros/wrong.JPG" alt="wrong.JPG" border="0" width="200" height="200" /><br />&nbsp;&nbsp;&nbsp;&nbsp; 正常的应该是这样<br />&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cppblog.com/images/cppblog_com/eros/right.JPG" alt="right.JPG" border="0" width="200" height="200" /><br />&nbsp;&nbsp;&nbsp;&nbsp; 百思不得其解，郁闷至极。后来终于在GameDev.net上找到近似案例(</span><span style="color: #3366ff; "><a href="http://www.gamedev.net/topic/443442-d3dfvf-mesh-showing-up-all-crazy-colors/">这里</a></span><span style="font-family: 微软雅黑;">)，琢磨一番，恍然大悟。<br />&nbsp;&nbsp;&nbsp;&nbsp; 原来，在FVF顶点格式中，D3D需要特定的内存布局，就是说，你的顶点格式中各项的类型应该满足它的期望。比如，它要求的颜色值应该是DWORD类型的32位整数值，而替换成D3DXCOLOR之后，却变成了4个float类型值(r, g, b，a)，与其期望不符，所以导致了异常的颜色。顶点结构体中颜色值还是换回DWORD类型，代码中的赋值可以正常使用，因为D3DXCOLOR有到DWORD的自动转换。<br /></span><img src ="http://www.cppblog.com/eros/aggbug/66298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2008-11-08 04:54 <a href="http://www.cppblog.com/eros/archive/2008/11/08/66298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>D3D中D3DFVF_XYZ和D3DFVF_XYZRHW的区别</title><link>http://www.cppblog.com/eros/archive/2008/07/14/56128.html</link><dc:creator>林公子</dc:creator><author>林公子</author><pubDate>Mon, 14 Jul 2008 12:48:00 GMT</pubDate><guid>http://www.cppblog.com/eros/archive/2008/07/14/56128.html</guid><wfw:comment>http://www.cppblog.com/eros/comments/56128.html</wfw:comment><comments>http://www.cppblog.com/eros/archive/2008/07/14/56128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/eros/comments/commentRss/56128.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eros/services/trackbacks/56128.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: 微软雅黑">&nbsp;&nbsp; 学习D3D9的时候遇到灵活顶点格式(FVF)中D3DFVF_XYZRHW和D3DFVF_XYZ之间差异而引起的问题。<br>参看了<span style="FONT-FAMILY: 微软雅黑">同是C++博客的一篇博文,其分析如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The RHW value, which stands for Reciprocal of Homogeneous W[<font color=#800000>1</font>], tells Direct3D that the vertices that are being used are already in screen coordinates. This value is normally used in fog and clipping calculations and should be set to 1.0.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在顶点结构体中没有RHW时，Direct3D将执行视、投影、世界等变换以及进行光线计算，之后你才能在窗口中得到你所绘制的物体。当顶点结构体中有RHW时，就像上面那段英文所述，告知Direct3D使用的顶点已经在屏幕坐标系中了，不再执行视图、投影、世界等变换和光线计算，因为D3DFVF_XYZRHW标志告诉它顶点已经经过了这些处理，并直接将顶点进行光栅操作，任何用SetTransform进行的转换都对其无效。不过这时的原点就在客户区的左上角了，其中x向右为正，y向下为正，而z的意义已经变为z-buffer的象素深度。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值得注意的是D3DFVF_XYZRHW和D3DFVF_XYZ、D3DFVF_NORMAL不能共存，因为后两个标志与前一个矛盾。在使用这种顶点时，系统需要顶点的位</span>置已经经过变换了，也就是说x、y必须在屏幕坐标系中，z必须是z-buffer中的象素深度，取值范围：0.0－1.0，离观察者最近的地方为0.0，观察范围内最远可见的地方为1.0。<br>---------------------------------------------------------------------------------------------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结合我自己的试验，有一些发现，记录下来以备忘。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D3DFVF_XYZ默认的用户区中心坐标是（0，0），而D3DFVF_XYZRHW是左上角为（0，0）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用D3DFVF_XYZ默认的为非光照的，而D3DFVF_XYZRHW是高洛德光照。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当使用D3DFVF_XYZ时，要设置渲染状态：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #000000">g_pd3dDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetRenderState(D3DRS_LIGHTING,FALSE)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">而且要设置观察矩阵和投影矩阵，例如：</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img style="WIDTH: 11px; HEIGHT: 16px" align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" width=11 height=16>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #000000">D3DXMATRIX&nbsp;matProj;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D3DXMATRIX&nbsp;matView;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;and&nbsp;set&nbsp;the&nbsp;projection&nbsp;matrix</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D3DXMatrixPerspectiveFovLH(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">matProj,&nbsp;D3DX_PI</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">4.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1.33333f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1000.0f</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_pd3dDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetTransform(D3DTS_PROJECTION,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">matProj);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;and&nbsp;set&nbsp;the&nbsp;view&nbsp;matrix</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D3DXMatrixLookAtLH(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">matView,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">D3DXVECTOR3(</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">500.0f</span><span style="COLOR: #000000">),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">D3DXVECTOR3(</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">D3DXVECTOR3(</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0f</span><span style="COLOR: #000000">));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;g_pd3dDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetTransform(D3DTS_VIEW,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">matView);</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: 微软雅黑">否则没有渲染结果。</span> 
<img src ="http://www.cppblog.com/eros/aggbug/56128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eros/" target="_blank">林公子</a> 2008-07-14 20:48 <a href="http://www.cppblog.com/eros/archive/2008/07/14/56128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>