﻿<?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++博客-&lt;font size=5&gt;李锦俊(mybios)的blog&lt;/font&gt;-随笔分类-Direct3D</title><link>http://www.cppblog.com/mybios/category/3031.html</link><description>游戏开发 C++ Cocos2d-x OpenGL DirectX 数学 计算机图形学 SQL Server
&lt;BR&gt;
&lt;BR&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 15 Jul 2016 05:23:01 GMT</lastBuildDate><pubDate>Fri, 15 Jul 2016 05:23:01 GMT</pubDate><ttl>60</ttl><item><title>Ogre 的渲染到纹理的关键的3个步骤</title><link>http://www.cppblog.com/mybios/archive/2007/12/27/39764.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 27 Dec 2007 13:06:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2007/12/27/39764.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/39764.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2007/12/27/39764.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/39764.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/39764.html</trackback:ping><description><![CDATA[<p>好久没写技术的东西了。现在辗转间又回到了深圳工作，还是做我喜欢的游戏开发。奉献点东西给大家。</p>
<p><br />1、创建渲染目标纹理，关键要指定TU_RENDERTARGET参数，在创建这个渲染目标纹理的过程中，Ogre会自动调用&nbsp; Root::getSingleton().getRenderSystem()-&gt;attachRenderTarget把这个纹理添加到Root的渲染目标中，也就是说每帧都会渲染到这个纹理。<br />TexturePtr texture = TextureManager::getSingleton().createManual( "RttTex", <br />&nbsp;ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, <br />&nbsp;512, 512, 0, PF_R8G8B8, TU_RENDERTARGET );</p>
<p>2、获得渲染目标，有了渲染目标，才能给目标指定视口和摄像机<br />RenderTarget *rttTex = texture-&gt;getBuffer()-&gt;getRenderTarget();</p>
<p>3、给这个渲染目标指定摄像机，做了这步骤之后，每帧更新时就会把这个摄像机看到的东西渲染到texture中<br />Viewport *v = rttTex-&gt;addViewport( mReflectCam );</p>
<p>4、OK！</p><br /><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">如果本文对你的开发有所帮助，并且你手头恰好有零钱。</p><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">不如打赏我一杯咖啡，鼓励我继续分享优秀的文章。<br /><img src="http://www.cppblog.com/images/cppblog_com/mybios/222.jpg" border="0" alt="" /><br /><br /><br /><br /></p><img src ="http://www.cppblog.com/mybios/aggbug/39764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2007-12-27 21:06 <a href="http://www.cppblog.com/mybios/archive/2007/12/27/39764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>硬件兼容性的陷阱，DrawIndexedPrimitiveUP的用法</title><link>http://www.cppblog.com/mybios/archive/2006/12/25/16840.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Mon, 25 Dec 2006 07:11:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/12/25/16840.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/16840.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/12/25/16840.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/16840.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/16840.html</trackback:ping><description><![CDATA[好好的一个程序，在我的电脑（ELSA X800 256M显卡）上运行一切正常，拿到别的电脑（845G内置显卡）上。啊。花屏～～赶快调试，幸好公司的电脑也有这种内置显卡的电脑。赶快用远程调试。谁知这一调试，就花了我整整一个上午。。。赶快写下来。。。<br /><br />最终排差的原因是DrawIndexedPrimitiveUP最后一个参数<em>VertexStreamZeroStride</em> ，这个参数是用来指定顶点所占的字节数。我自作聪明的把顶点结构后增加了一个自己用的数据，如：正常的顶点结构<br />struct CUSTOMVERTEX<br />{<br /> FLOAT x, y, z,rhw;<br /> DWORD color;<br /> float u,v;<br />};<br /><br />我改了之后的顶点结构：<br />struct CUSTOMVERTEX<br />{<br /> FLOAT x, y, z,rhw;<br /> DWORD color;<br /> float u,v;<br />DWORD dwMyData; // 用来保存我自己用的数据<br />};<br /><br />结果，在我的显卡上一切正常，这个数据也有用，然后DrawIndexedPrimitiveUP的时候，也会根据最后的参数sizeof(CUSTOMVERTEX)顺利的读取相应的顶点。但是，拿到845G的内置显卡上就死活花屏。后来终于知道是这个原因，于是解决办法就是把dwMyData去掉，放到顶点结构外面去。<br /><br />顺便说说DrawIndexedPrimitiveUP的用法：<br /><strong>HRESULT DrawIndexedPrimitiveUP(</strong><br />  <b>D3DPRIMITIVETYPE</b><i>PrimitiveType</i><b>, // 图原的类型</b><br />  <b>UINT</b><i>MinVertexIndex</i><b>,  // 指定0</b><br />  <b>UINT</b><i>NumVertices</i><b>,  // 指定需要渲染的顶点的数量（如一个矩形可以由4个顶点组成，然后通过顶点索引来达到渲染2个三角形的效果，那么这里就应该填写4，而不是6）</b><br />  <b>UINT</b><i>PrimitiveCount</i><b>, // 要渲染的图原的数量（如一个矩形，由两个三角形组成，就应该填写2）</b><br />  <b>CONST void *</b><i>pIndexData</i><b>, // 索引数据指针</b><br />  <b>D3DFORMAT</b><i>IndexDataFormat</i><strong>, // 索引数据格式，一般为D3DFMT_INDEX16或D3DFMT_INDEX32</strong> <br />  <b>CONST void*</b><i>pVertexStreamZeroData</i><b>, // 顶点数据指针</b><br />  <b>UINT</b><i>VertexStreamZeroStride // 顶点大小一般为sizeof(顶点结构)</i><br /><b>);</b><br /><br />记得默认情况下渲染三角形的顺序是逆时针的（初学者经常范这个错误，本来想渲染一个矩形，结果一个三角形顺时间、另一个三角形逆时针，结果渲染出来只看到一个三角形了，被背面剔除掉了）。<br /><img src ="http://www.cppblog.com/mybios/aggbug/16840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-12-25 15:11 <a href="http://www.cppblog.com/mybios/archive/2006/12/25/16840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>顶点声明</title><link>http://www.cppblog.com/mybios/archive/2006/12/02/15891.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Sat, 02 Dec 2006 08:42:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/12/02/15891.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15891.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/12/02/15891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15891.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15891.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 顶点声明																																																																从概念上讲，顶点声明是对顶点直接内存访问（DMA）以及图形流水线的														tessellator												引擎进行编程的一种方法。顶点声明简要地表示了数据的布局及...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/12/02/15891.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-12-02 16:42 <a href="http://www.cppblog.com/mybios/archive/2006/12/02/15891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】DXUT编程指南(四):通过DXUT使用设备</title><link>http://www.cppblog.com/mybios/archive/2006/11/22/15531.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Wed, 22 Nov 2006 03:35:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/22/15531.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15531.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/22/15531.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15531.html</trackback:ping><description><![CDATA[
		<p>
				<font size="5">通过DXUT使用设备</font>
				<br />DirectX设备的创建在DXUT中得到了改进。你可以让你的应用程序直接创建设备而其它有框架提供的特征仍然可用。<br /><a href="http://blog.csdn.net/ntwilford/archive/2006/08/02/1009763.aspx#创建设备">创建设备</a><br /><a href="http://blog.csdn.net/ntwilford/archive/2006/08/02/1009763.aspx#使用你自己的设备">选择最佳的设备设置<br />修改可用的设备设置<br />降为软件顶点处理<br />使用你自己的设备</a></p>
		<p>
				<font size="4">
						<a name="创建设备">
						</a>创建设备</font>
				<br />典型地，你将通过标准的Direct3D方法创建设备<br />HRESULT CreateDevice(<br />    UINT                  Adapter,<br />    D3DDEVTYPE            DeviceType,<br />    HWND                  hFocusWindow,<br />    DWORD                 BehaviorFlags,<br />    D3DPRESENT_PARAMETERS *pPresentationParameters,<br />    IDirect3DDevice9      **ppReturnedDeviceInterface<br />);<br />这个方法需要有效的适配器，设备类型(HAL or REF),窗口句柄，行为标志(software/hardware vertex processing 和其它驱动标志)，以及呈现参数(presentation parameters).此外，D3DPRESENT_PARAMETER结构体还拥有大量的成员指定后备缓冲区，多重采样设定，交换效果，窗口模式，深度模版缓冲，刷新率，呈现间隔，以及呈现标志。<br />为所有这些参数选择有效的设定是具有挑战性的。框架通过DXUTCreateDevice函数简化了这一选择过程。<br />HRESULT DXUTCreateDevice(<br />    UINT AdapterOrdinal  = D3DADAPTER_DEFAULT,<br />    BOOL bWindowed       = TRUE,<br />    INT nSuggestedWidth  = 640,<br />    INT nSuggestedHeight = 480,<br />    LPDXUTCALLBACKISDEVICEACCEPTABLE pCallbackIsDeviceAcceptable     = NULL,<br />    LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallbackModifyDeviceSettings = NULL<br />);<br />最基本的用法是全部使用缺省参数调用：<br />DXUTCreateDevice();<br />通过这样的调用框架使用缺省设置创建一个在大多数情况下可用的设备。缺省的设置如下：<br /></p>
		<table>
				<tbody>
						<tr>
								<th>Direct3D Creation Flag</th>
								<th>Description</th>
								<th>Default Value from <strong>DXUTCreateDevice</strong></th>
						</tr>
						<tr>
								<td>AdapterFormat parameter of <a href="http://blog.csdn.net/ntwilford/archive/2006/08/02/IDirect3D9__CheckDeviceFormat.htm">CheckDeviceFormat</a></td>
								<td>Adapter surface format.</td>
								<td>Desktop display mode, or <a href="http://blog.csdn.net/ntwilford/archive/2006/08/02/D3DFORMAT.htm">D3DFMT_X8R8G8B8</a> if the desktop display mode is less than 32 bits.</td>
						</tr>
						<tr>
								<td>Adapter parameter of <strong>IDirect3D9::CreateDevice</strong></td>
								<td>Display adapter ordinal.</td>
								<td>
										<a href="http://blog.csdn.net/ntwilford/archive/2006/08/02/D3DADAPTER_DEFAULT.htm">D3DADAPTER_DEFAULT</a>
								</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. BackBufferCount</td>
								<td>Number of back buffers.</td>
								<td>2, indicating triple buffering.</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. BackBufferFormat</td>
								<td>Back buffer format.</td>
								<td>Desktop display mode, or <strong>D3DFMT_X8R8G8B8</strong> if the desktop display mode is less than 32 bits.</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. AutoDepthStencilFormat</td>
								<td>Depth format of the automatic depth-stencil surface that the device will create.</td>
								<td>
										<strong>D3DFMT_D16</strong> if the backbuffer format is 16 bits or less, or <strong>D3DFMT_D32</strong> otherwise.</td>
						</tr>
						<tr>
								<td>The DeviceType parameter of <strong>IDirect3D9::CreateDevice</strong></td>
								<td>Enumerated type of the device.</td>
								<td>D3DDEVTYPE_HAL if available, otherwise D3DDEVTYPE_REF or failure code if neither is available.</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. MultiSampleQuality</td>
								<td>Quality level.</td>
								<td>MultiSampleQuality = 0, indicating multisampling is disabled.</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. Flags</td>
								<td>Presentation parameters flags.</td>
								<td>
										<a href="http://blog.csdn.net/ntwilford/archive/2006/08/02/D3DPRESENTFLAG.htm">D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL</a>
								</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. PresentationInterval</td>
								<td>Presentation interval.</td>
								<td>
										<a href="http://blog.csdn.net/ntwilford/archive/2006/08/02/D3DPRESENT.htm">D3DPRESENT_INTERVAL_IMMEDIATE</a> for windowed mode, or <strong>D3DPRESENT_INTERVAL_DEFAULT</strong> for full-screen mode.</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. FullScreen_RefreshRateInHz</td>
								<td>Rate at which the display adapter refreshes the screen.</td>
								<td>0, indicating windowed mode.</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. BackBufferWidth and .BackBufferHeight</td>
								<td>Display mode resolution.</td>
								<td>640 x 480 pixels for windowed mode, or the desktop resolution for full-screen mode.</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. AutoDepthStencilFormat</td>
								<td>Stencil format of the automatic depth-stencil surface that the device will create.</td>
								<td>
										<strong>D3DFMT_D16</strong> if the backbuffer format is 16 bits or less, or <strong>D3DFMT_D32</strong> otherwise.</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. SwapEffect</td>
								<td>Swap effect.</td>
								<td>D3DSWAPEFFECT_DISCARD</td>
						</tr>
						<tr>
								<td>BehaviorFlags parameter of <strong>IDirect3D9::CreateDevice</strong></td>
								<td>Vertex processing flags.</td>
								<td>
										<a href="http://blog.csdn.net/ntwilford/archive/2006/08/02/D3DCREATE.htm">D3DCREATE_HARDWARE_VERTEXPROCESSING</a> if supported, otherwise <strong>D3DCREATE_SOFTWARE_VERTEXPROCESSING</strong>.</td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. Windowed</td>
								<td>Windowed or full-screen mode.</td>
								<td>true, indicating windowed mode.</td>
						</tr>
						<tr>
								<td>hFocusWindow parameter of <strong>CreateDevice</strong></td>
								<td>Handle to the created window (see <a href="http://blog.csdn.net/ntwilford/archive/2006/08/02/Using_Application_Windows_with_DXUT.htm">Using Application Windows with DXUT</a>).</td>
								<td>hWndFocus parameter of <a href="http://blog.csdn.net/ntwilford/archive/2006/08/02/DXUTSetWindow.htm">DXUTSetWindow</a></td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. hDeviceWindow</td>
								<td>Handle to the device window.</td>
								<td>hWndDeviceFullScreen or hWndDeviceWindowed parameters of <strong>DXUTSetWindow</strong></td>
						</tr>
						<tr>
								<td>
										<strong>D3DPRESENT_PARAMETERS</strong>. EnableAutoDepthStencil</td>
								<td>Depth-stencil buffer creation flag.</td>
								<td>true.</td>
						</tr>
				</tbody>
		</table>
		<br />应用程序可以通过参数传递给CreateDevice来更多的控制设备的创建，这将比使用缺省的方式更好。例如，你可以通过nSuggestedWidth and nSuggestedHeight参数改变窗口的尺寸。<br />DXUTCreateDevice(<br />    D3DADAPTER_DEFAULT,<br />    false,<br />    1024,<br />    786,<br />    NULL,<br />    NULL,<br />    NULL<br />);<br />要得到更多的控制权，应用程序可以使用这两个可选的回调函数，LPDXUTCALLBACKISDEVICEACCEPTABLE and LPDXUTCALLBACKMODIFYDEVICESETTINGS.<p><font size="4"><a name="选择最佳的设备设置"></a>选择最佳的设备设置</font><br />你可以使用IsDeviceAcceptable回调函数帮助框架为你的应用程序选择最佳的设备设置，就像下面的代码：<br />bool CALLBACK IsDeviceAcceptable(<br />D3DCAPS9*     pCaps,<br />D3DFORMAT     AdapterFormat,<br />D3DFORMAT     BackBufferFormat,<br />bool          bWindowed,<br />void*         pUserContext )<br />{<br />    // TODO: return true for acceptable settings and false otherwise.<br />    return true;<br />}<br />这个回调函数的模型基于LPDXUTCALLBACKISDEVICEACCEPTABLE原型(This callback function is modeled on the prototype LPDXUTCALLBACKISDEVICEACCEPTABLE)，框架为每个唯一的以下5个设置的有效组合调用这个函数一次：<br />D3DDEVTYPE DeviceType;<br />UINT       AdapterOrdinal;<br />D3DFORMAT  AdapterFormat;<br />D3DFORMAT  BackBufferFormat;<br />bool       Windowed;<br />注意适配器序号和设备类型没有直接的传入回调函数，而是分别作为D3DCAPS9结构体的成员。<br />通过这个回调函数，应用程序可以拒绝任何它不支持的或不想要的组合。例如，应用程序可以使用下面的代码拒绝16bits的后备缓冲区格式和所有至少不能支持像素着色器PS_2_0的设备： <br />bool CALLBACK IsDeviceAcceptable(<br />    D3DCAPS9*     pCaps,<br />    D3DFORMAT     AdapterFormat,<br />    D3DFORMAT     BackBufferFormat,<br />    bool          bWindowed )<br />{<br />    if( pCaps-&gt;PixelShaderVersion &lt; D3DPS_VERSION(2,0) )<br />     return false;<br />    if( BackBufferFormat == D3DFMT_X1R5G5B5 || BackBufferFormat == D3DFMT_R5G6B5 )<br />        return false;<br />    return true;<br />}</p><p>为每个唯一的组合调用回调函数后，框架排列剩下的可用组合，并选择它们当中最好的。排名较高的如下：<br />D3DDEVTYPE_HAL，获取硬件加速<br />如果应用程序以全屏模式显示，框架更趋向于使用匹配桌面格式的适配器格式，这样可以在全屏与窗口之间快速切换。例外的是，如果桌面显示模式小于32位，框架更趋向于D3DFMT_X8R8G8B8.<br />匹配适配器格式的后备缓冲区格式<br />在选择了这些排名高的组合后，要创建设备，行为标志和呈现参数仍然是需要的。对于这些设置,Direct3D使用上面表中的缺省值。</p><p><font size="4"><a name="修改可用的设备设置"></a>修改可用的设备设置</font><br />应用程序可以通过使用第二个可选的回调函数修改对框架可用的设置，这个函数是ModifyDeviceSettings:<br />bool CALLBACK ModifyDeviceSettings(<br />    DXUTDeviceSettings* pDeviceSettings,<br />    const D3DCAPS9*     pCaps )<br />{<br />    // TODO: Include device creation requirements here.  <br />    // 返回真创建设备返回False保持当前设置<br />    return true;<br />}<br />这个函数是基于原型LPDXUTCALLBACKMODIFYDEVICESETTINGS的。DXUTDeviceSettings结构体被框架定义为：<br />struct DXUTDeviceSettings<br />{<br />    UINT       AdapterOrdinal;<br />    D3DDEVTYPE DeviceType;<br />    D3DFORMAT  AdapterFormat;<br />    DWORD      BehaviorFlags;<br />    D3DPRESENT_PARAMETERS pp;<br />};</p><p>这个结构体包含了创建设备所需要的所有东西，除了窗口句柄,它被假定为先前创建的窗口的句柄。框架用有效的数据填充这个结构体，然后允许应用程序通过ModifyDeviceSettings回调函数改变设备创建的选择。<br />在这个回调函数中，应用程序可以在DXUTDeviceSettings结构体中改变行为标志以及呈现参数,乃至结构体中任何其它的东西。如果应用程序在回调函数中什么都不改变，设备会成功的创建。然而，对设备创建设置的任何改变都需要被设备支持，否则可能会导致设备创建失败。<br />比如，如果应用程序需要一个D3DFMT_D24S8的深度模板缓冲区格式，就必须验证设备是否支持，就像下面的代码：<br />bool CALLBACK ModifyDeviceSettings(<br />    DXUTDeviceSettings* pDeviceSettings,<br />    const D3DCAPS9*     pCaps )<br />{<br />    IDirect3D9* pD3D = DXUTGetD3DObject();<br />    if( SUCCEEDED( pD3D-&gt;CheckDeviceFormat(<br />         pDeviceSettings-&gt;AdapterOrdinal,<br />         pDeviceSettings-&gt;DeviceType,<br />         pDeviceSettings-&gt;AdapterFormat,<br />         D3DUSAGE_DEPTHSTENCIL,<br />         D3DRTYPE_SURFACE,<br />         D3DFMT_D24S8 ) ) )<br />    {<br />     if( SUCCEEDED( pD3D-&gt;CheckDepthStencilMatch(<br />             pDeviceSettings-&gt;AdapterOrdinal,<br />             pDeviceSettings-&gt;DeviceType,<br />             pDeviceSettings-&gt;AdapterFormat,<br />             pDeviceSettings-&gt;pp.BackBufferFormat,<br />             D3DFMT_D24S8 ) ) )<br />     {<br />         pDeviceSettings-&gt;pp.AutoDepthStencilFormat = D3DFMT_D24S8;<br />     }<br />    }<br />    <br />    return true;<br />}</p><p>候选的方案是，回调函数可以使用框架的CD3DEnumeration 对象验证D3DFMT_D24S8是否被支持：<br /> bool CALLBACK ModifyDeviceSettings(<br />    DXUTDeviceSettings* pDeviceSettings,<br />    const D3DCAPS9*     pCaps )<br />{<br />    CD3DEnumeration *pEnum = DXUTGetEnumeration();<br />    CD3DEnumDeviceSettingsCombo *pCombo;<br /> <br />    pCombo = pEnum-&gt;GetDeviceSettingsCombo( pDeviceSettings );<br /> <br />    if( pCombo-&gt;depthStencilFormatList.Contains( D3DFMT_D24S8 ) )<br />        pDeviceSettings-&gt;pp.AutoDepthStencilFormat = D3DFMT_D24S8;<br />        <br />    return true;<br />}</p><p>应用程序修改了设备的设置后，框架就会用新的设置创建设备。<br />DirectX April 2005 SDK Update中的更新，ModifyDeviceSettings 回调函数返回了一个bool值。如果应用程序返回true框架继续正常的创建设备。如果返回false框架不改变设备并且保持当前的设备，如果已经有一个存在的话。这允许应用程序能够拒绝框架将设备改变到程序不能使用的请求。例如，在多监视器的缺省配置下，在监视器之间拖动窗口会导致框架改变设备。然而，如果应用程序不能使用其它的设备的话，它应当可以拒绝改变，并继续使用当前的设备。</p><p><font size="4"><a name="回降到软件顶点处理"></a>回降到软件顶点处理</font><br />如果你设置一个Direct3D设备到支持像素处理却不支持顶点处理的硬件，你会因此需要改变行为标志。为了确保正确地降到软件顶点处理，谨防你不能拒绝一个基于IsDeviceAcceptable回调函数中顶点着色器版本的设备，并确保行为标志在ModifyDeviceSettings 回调函数中被正确调整。这儿有一个例子演示怎样做这些事情。<br />bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, <br />                                    const D3DCAPS9* pCaps )<br />{<br />    // If device doesn't support HW T&amp;L or doesn't support 1.1 vertex <br />    // shaders in HW, then switch to SWVP.<br />    if( (pCaps-&gt;DevCaps &amp; D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 ||<br />         pCaps-&gt;VertexShaderVersion &lt; D3DVS_VERSION(1,1) )<br />    {<br />        pDeviceSettings-&gt;BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;<br />    }</p><p>    else<br />    {<br />        pDeviceSettings-&gt;BehaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;<br />    }<br />    <br />    return true; <br />}</p><p><font size="4"><a name="使用你自己的设备"></a>使用你自己的设备</font><br />你没有必要依赖于框架来创建Direct3D设备。应用程序自己可以创建设备并将他传递给框架使用。就像应用程序可以覆盖框架的window creation 设置。简单的使用你想要的设置创建一个设备，然后调用 DXUTSetDevice函数让框架在你的设备上渲染。<br />注意：如果应用程序创建了不依赖于框架的设备，那么应用程序也必须在主循环执行完以后亲自的通过cleanup 释放设备接口。<br />另请参阅<br />通过DXUT作更高级的设备选择</p><img src ="http://www.cppblog.com/mybios/aggbug/15531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-22 11:35 <a href="http://www.cppblog.com/mybios/archive/2006/11/22/15531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】EffectFramework</title><link>http://www.cppblog.com/mybios/archive/2006/11/20/15464.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Mon, 20 Nov 2006 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/20/15464.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15464.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/20/15464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15464.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15464.html</trackback:ping><description><![CDATA[
		<p>
				<font face="宋体">
						<strong>Effect Framework</strong>
				</font>
		</p>
		<p>
				<strong>
						<font face="宋体">摘要</font>
				</strong>
		</p>
		<p>
				<font face="宋体">本文简要介绍了在DirectX 9 SDK中提供的Effect Framework支持，以及DirectX FX文件结构和Microsoft Hight Level Shading Language的基本知识。本文假定读者对DirectX Graphics有一定了解，并正在学习DirectX Effect Framework。希望能够与各位读者共同探讨、切磋。 </font>
		</p>
		<p>
				<font face="宋体">
						<strong>简介 </strong>
				</font>
		</p>
		<p>
				<font face="宋体">Effect的起源 </font>
		</p>
		<p>
				<font face="宋体">在计算机3维场景中，物体表面的材质代表了其光学特性。最简单的材质可以表现为Diffuse颜色，Specular颜色，Emissive颜色等信息的集合；而为了表现物体表面的细节，可以 在材质中加入一张纹理——这些就构成了最基本的材质信息。在以前的Direct3D程序中，这些信息可以直接传送给设备，由设备自动根据它们来计算物体表面的光学效果。但是， 仅仅有这些基本的材质信息，已经不足以满足游戏制作者的要求和游戏玩家的要求了——他们希望场景中的材质更加复杂，具有更多的细节，更加逼真。 </font>
		</p>
		<p>
				<font face="宋体">在Direct3D中，除了材质的概念，还存在一个渲染状态（Render State）的概念。在Direct3D Device中存在很多的渲染状态，它们可以在Direct3D进行渲染时控制渲染的流程和效 果，从而实现某些带有特效的材质。程序员可以通过IDirect3DDevice*::SetRenderState()方法来设置这些状态。所有的渲染状态都是一些特定的数值。对状态的设置可以通过硬 编码完成，即在程序中调用SetRenderState()方法，将设置什么样的状态“写死”在程序里，但是这样做的缺点就是太不灵活了——如果想要实现一种新的渲染状态，就需要修改 程序代码。所以更好的一种方法是将为了实现某一种特效材质的一些渲染状态值记录到一个“效果文件”中，通过在程序运行时读取该文件，从中分析出这些值，并将它们作为参 数调用SetRenderState()。这样，要想实现一种新的特效，只需修改“效果文件”而不用更改代码。 </font>
		</p>
		<p>
				<font face="宋体">Direct3D SDK是通过Effect Framework来支持这种机制的。而前面所述的“效果文件”在Direct3D中是以*.fx文件存在的。在fx文件中保存了为实现某一特效的渲染状态，包括状态名 称和它们的对应值。所以在9.0以前版本的DirectX中就已经有Effect Framework和FX文件了，早期的Effect Framework仅仅是为了实现对渲染状态进行控制。 但是随着计算机显示硬件技术的发展，图形处理单元（GPU）正在重复CPU所走过的路——新一代的GPU已经具有了可编程特性，程序员可以通过对GPU编写一段程序来控制其渲染的 输出效果。这种程序一般称为Shader程序。目前的Shader程序分成两种，Vertex Shader和Pixel Shader。Vertex Shader主要用于对3维网格模型的每一个顶点进行处理，而Pixel Shader主要用于对要绘制到屏幕上的每一个象素进行处理。通过Shader，程序员可以制作出相当丰富的实时渲染效果。</font>
		</p>
		<p>
				<font face="宋体">同CPU一样，对GPU编程也是借助一定的编程语言来进行的。 </font>
				<font face="宋体">在DirectX 8中，对GPU的编程是通过一种类似于汇编的语言进行的。而在DirectX 9中，使用了一种类似于C语言的高级语言——Microsoft High Level Shading Language (HLSL) 。</font>
		</p>
		<p>
				<font face="宋体">无论使用什么语言对GPU编程，都需要把编译好的Shader程序输送到显卡去。Direct3D Device可以通过SetVertexShader()和SetPixelShader()来向显卡输送Shader程序。然而，由 于Shader和材质具有十分紧密的关系——一般来说，一个Shader就是为了实现一种特殊的材质——最好是能够将Shader程序与材质进行整合。 所以，在DirectX 8和DirectX 9中，原来的Effect Framework发生了扩充——在原来的基础上加入了对Shader程序的支持。程序员可以把Vertex Shader和Pixel Shader程序以函数 的方式直接书写在FX文件中。</font>
		</p>
		<p>
				<font face="宋体"> .FX文件</font>
		</p>
		<p>
				<font face="宋体">FX文件中的内容大致可以分成几部分： </font>
		</p>
		<ul>
				<li>
						<font face="宋体">预编译标志 </font>
				</li>
				<li>
						<font face="宋体">变量表 </font>
				</li>
				<li>
						<font face="宋体">结构定义 </font>
				</li>
				<li>
						<font face="宋体">函数 </font>
				</li>
				<li>
						<font face="宋体">Technique </font>
				</li>
		</ul>
		<p>
				<font face="宋体">预编译标志：预编译标志包括 </font>
		</p>
		<ul>
				<li>
						<font face="宋体">#define </font>
				</li>
				<li>
						<font face="宋体">#elif </font>
				</li>
				<li>
						<font face="宋体">#else </font>
				</li>
				<li>
						<font face="宋体">#endif </font>
				</li>
				<li>
						<font face="宋体">#error </font>
				</li>
				<li>
						<font face="宋体">#if </font>
				</li>
				<li>
						<font face="宋体">#ifdef </font>
				</li>
				<li>
						<font face="宋体">#ifndef </font>
				</li>
				<li>
						<font face="宋体">#include </font>
				</li>
				<li>
						<font face="宋体">#line </font>
				</li>
				<li>
						<font face="宋体">#pragma </font>
				</li>
				<li>
						<font face="宋体">#undef </font>
				</li>
		</ul>
		<p>
				<font face="宋体">其中最常用到的是#include和#define，同C语言中的意义很相似：用#include可以在一个FX文件中引入另外一个或多个文件。#define可以定义FX文件中的宏替换。例如： </font>
		</p>
		<table cellspacing="5" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<p>
												<span class="unnamed2">
														<font face="宋体">#include "helper_Funcs.fx"</font>
												</span>
												<font face="宋体">     <span class="unnamed1">//引入一个名为helper_funcs.fx的fx文件</span><br /><span class="unnamed2">#include "public_variables.fh</span>" <span class="unnamed1">//引入一个名为public_variables.fh的文件</span><br /><span class="unnamed2">#define MATRICES_COUNT 25</span>      <span class="unnamed1">//定义宏MATRICES_COUNT为25</span><br /><span class="unnamed2">#define VSHADER VShader_2_0</span>    <span class="unnamed1">//定义宏VSHADER为VShader_2_0</span></font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font face="宋体">#include带来的好处和C中也是一样的－您可以在一个头文件中定义一些公有变量、函数等，在其他文件中引用它们－就不用写很多遍了。例如： </font>
		</p>
		<p>
				<font face="宋体">文件public.fh: </font>
		</p>
		<table cellspacing="5" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<p>
												<span class="unnamed2">
														<font face="宋体">mat4x4</font>
												</span>
												<font face="宋体"> matWorldViewProj; <span class="unnamed1">// 4x4世界－视－投影变换矩阵</span><br /></font>
												<span class="unnamed2">
														<font face="宋体">float3</font>
												</span>
												<font face="宋体"> lightPosisiton;   <span class="unnamed1">// 三维光源位置向量</span><br /><span class="unnamed2">float4</span> lightColor;     <span class="unnamed1">  // 光源的颜色</span><br /><span class="unnamed2">float</span> time;              <span class="unnamed1">// 当前时间</span></font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font face="宋体">//定义一个名为VS_OUTPUT的结构。关于结构体定义，下文中会有介绍 <br /></font>
		</p>
		<table width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<span class="unnamed2">
												<font face="宋体">struct</font>
										</span>
										<font face="宋体"> VS_INPUT <br />{<br />    <span class="unnamed2">float4</span> LocalPos : POSITION; <br />    <span class="unnamed2">float3</span> Normal : NORMAL; <br />    <span class="unnamed2">float4</span> Color : COLOR; <br />    <span class="unnamed2">float2</span> Texcoord : TEXCOORD0; <br />};</font>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
		</p>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<span class="unnamed2">
												<font face="宋体">struct VS_OUTPUT</font>
										</span>
										<font face="宋体">
												<br />{<br />   <span class="unnamed2"> float4</span> WorldPos : POSITION;<br />    <span class="unnamed2">float4</span> Color : COLOR; <br />    <span class="unnamed2">float2</span> Texcoord : TEXCOORD0; <br />}; </font>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
		</p>
		<p>
				<font face="宋体">//定义一个名为CaculateWorldPosition的函数。关于函数定义，下文中会有介绍 <br /></font>
		</p>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<span class="unnamed2">
												<font face="宋体">float3</font>
										</span>
										<font face="宋体"> CaculateWorldPosition( <span class="unnamed2">float4</span> LocalPos ) <br />{<br />    <span class="unnamed2">return</span> mul( LocalPos, matWorldViewProj); <br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
		</p>
		<p>
				<font face="宋体">这样，当我们在另外一个文件中include这个头文件时，上面所有的定义都可以直接使用了。 </font>
		</p>
		<p>
				<font face="宋体">文件client.fx: </font>
		</p>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<p class="unnamed2">
												<font face="宋体">#include "public.fh" </font>
										</p>
										<p>
												<font face="宋体">
														<br />
														<span class="unnamed2">VS_OUTPUT</span> VS_main( VS_INPUT In ) <span class="unnamed1">// 可以直接使用结构体定义VS_OUTPUT和VS_INPUT </span><br />{ <br />    VS_OUTPUT Out = 0; <br />    Out.WorldPos = CaculateWorldPosition( In.LocalPos ); <span class="unnamed1">// 可以直接使用函数</span><br />    Out.Color = In.Color; <br />    Out.Texcoord = In.Texcoord; <br />} </font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p> </p>
		<font face="宋体">
				<p>这样不仅可以复用代码，还可以使变量名、结构体、函数名的定义统一。 </p>
				<p>而#define不仅仅可以使某些常量具有比较有意义的名称，通过与#ifdef，#ifndef, #else, #endif等结合使用，还可以用来根据一些配置控制编译过程。 </p>
				<p>变量表</p>
				<p>每个FX文件都可以有若干参数变量，通过Effect Framework可以在程序中识别出这些参数的类型、名称和用途，这样就可以将程序中的一些参数输送到Effect中去，从而更加灵活 的控制效果。参数的类型很多，可以是int, float, matrix, texture等等。例如： </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<span class="unnamed2">
												<font face="宋体">matrix</font>
										</span>
										<font face="宋体"> matWorld;    <span class="unnamed1">//定义一个名为matWorld的矩阵类型参数变量</span><br /><span class="unnamed2">float</span> time;         <span class="unnamed1">//定义一个名为time的浮点类型参数变量 </span><br /><span class="unnamed2">texture</span> texDiffuse; <span class="unnamed1">//定义一个名为texDiffuse的纹理类型参数变量</span></font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>另外，每个变量还有前缀修饰符、Semantic、Annotation等，限于篇幅，在这里不再赘述，具体的介绍请参考DirectX C++帮助文档的DirectX Graphics &gt; Reference &gt; HLSL Shader Reference &gt; Variable Declaration Syntax条目。 </p>
				<p>结构定义</p>
				<p>在FX文件中可以定义结构体，这些结构体一般用于Shader函数的参数和返回值。结构体的定义与C语言方式及其类似，例如： </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<span class="unnamed2">
												<font face="宋体">struct</font>
										</span>
										<font face="宋体"> VS_OUTPUT <span class="unnamed1">//结构名称 </span><br />{ <br />    <span class="unnamed2">float4</span> Pos : POSITION; <span class="unnamed1">//成员变量。</span><br />    <span class="unnamed2">float4</span> Color : COLOR; <br />   <span class="unnamed2"> float2</span> Texcoord : TEXCOORD0; <br />}; </font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>上面每个成员变量后面的标识符是该变量的semantic，HLSL编译器根据这个标识符来确定该变量的用处。不一定非得是结构体成员变量才有semantic，一般来说Shader的输入输出参数变量都可以有semantic。</p>
				<p>函数</p>
				<p>函数部分是在Effect Framework加入了对Vertex Shader和Pixel Shader的扩充后才加入到FX文件中的。FX文件中的函数的内容可以用汇编形式书写，也可以用HLSL编写。目前一般 都是使用HLSL。用这种语言书写的函数与C语言函数十分类似，可以说，只要学过C语言，书写Shader函数就绰绰有余了。在同一个fx文件中可以定义很多函数，在函数中也可以互 相调用，但是最终Shader程序的入口将在fx文件的Technique部分中指定。对于哪个函数是Vertex shader函数，哪个是Pixel shader函数，也是在Technique中指定的。关于Technique，将在下文中介绍。 例子： </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<p>
												<span class="unnamed2">
														<font face="宋体">float4</font>
												</span>
												<font face="宋体"> CalcDiffuseColor( float3 Normal ) <br />{ <br />    <span class="unnamed2">float4</span> Color; ...<span class="unnamed1">//用于实现该函数功能的多条语句 </span><br />    <span class="unnamed2">return</span> Color; <br />} </font>
										</p>
										<p>
												<span class="unnamed2">
														<font face="宋体">VS_OUTPUT</font>
												</span>
												<font face="宋体"> Vertex_Shader( <span class="unnamed2">float4</span> InPos : POSITION, <br />                         <span class="unnamed2">float3</span> InNor : NORMAL, <br />                         <span class="unnamed2">float3</span> InTexcoord : TEXCOORD ) <br />{ <br />    <span class="unnamed2">VS_OUTPUT</span> Out; ...<span class="unnamed1">//用于实现该函数功能的多条语句 </span><br />    Out.Color = CalcDiffuseColor(InNor);<span class="unnamed1"> //函数调用 </span><br />    <span class="unnamed2">return</span> Out; <br />}</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>正如上文中所说，Shader程序分为两种：Vertex shader和Pixel shader。在fx函数中就有两种相应的函数：Vertex shader函数和Pixel Shader函数。Vertex shader函数的输入参数是网格模型中的每一个顶点数据，其输出是经过该函数特殊处理的顶点数据；而Pixel Shader函数的输入，则是经过硬件光栅化过程后经过插值的Vertex shader输出结果。至于Pixel shader的输出，一般就是经过该函数计算得到的一个颜色值，即要画到后备缓冲中一个象素上的颜色值。但是这个“颜色值”有时并不一定代表颜色。而且对于支持多RenderTarget的硬件，Pixel shader还可以有多个输出，分别对应不同的RenderTarget。</p>
				<p>technique </p>
				<p>technique是FX文件的主体，是真正设置各种渲染状态的地方，也是指定所使用的Shader程序入口的地方。在理解Technique前首先要理解Pass的概念。Pass是Technique的组成部分 ，一个Pass就代表了绘制时的一遍。通常为了达到一种效果，仅仅绘制一遍网格模型是不够的，需要向framebuffer中多次绘制，并利用设置渲染状态中的BlendState进行Alpha混合。这就是经常提到的“Muli-pass Rendering”。但是随着硬件越来越强大，Shader程序的功能越来越强，目前的趋势是所有的特效材质都将可以用越来越少个Pass来完成。 一个technique中，可以存在一个或多个Pass，但是至少要有一个Pass时该technique才会起实际作用。当存在多个pass时，默认情况下在渲染时将会按照pass在文件中的前后顺序 作为渲染时的前后顺序。technique和Pass中的内容都是以大括号括起来。 </p>
				<p>technique的例子： </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<span class="unnamed2">
												<font face="宋体">technique</font>
										</span>
										<font face="宋体"> Tec_Shader_1_X <span class="unnamed1">//定义一个名为Tec_Shader_1_X的technique </span><br />{ <br />    pass P0 <span class="unnamed1">//一个名为P0的pass</span><br />    { <br />        VertexShader = compile vs_1_1 Vertex_Shader();<span class="unnamed1"> //设置Vertex Shader程序入口函数 </span><br />        PixelShader = compile ps_1_1 Pixel_Shader();   <span class="unnamed1">//设置Pixel Shader程序入口函数 </span><br />        AlphaBlendEnable= true;                       <span class="unnamed1"> //设置渲染状态        </span><br />        SrcBlend = SrcAlpha;  <br />        DestBlend = InvSrcAlpha; <br />        ... <span class="unnamed1">//其他设置</span><br />    } <br />    pass P1<span class="unnamed1"> //一个名为P1的pass</span><br />    { <br />        ... <br />    } <br />} </font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>
						<strong>ID3DXEffect接口</strong>
				</p>
				<p>上面介绍了很多fx文件相关内容，但是在程序中如何读取和分析这些fx文件呢？在程序中对于读取fx文件，控制渲染状态、设置Shader程序等工作都是通过D3DX库中的ID3DXEffect接口来实现的。ID3DXEffect接口提供了大量的方法，基本上分为几个方面： </p>
				<ul>
						<li>获得Effect参数变量信息 
</li>
						<li>设置Effect参数变量 
</li>
						<li>获得technique信息 
</li>
						<li>设置当前使用的technique 
</li>
						<li>开始和结束使用当前的technique 
</li>
						<li>执行一个pass（渲染绘制遍） </li>
				</ul>
				<p>ID3DXEffect接口的创建： 通过D3DX库中的D3DXCreateEffectFromFile()函数，可以根据一个指定的文件的内容来创建一个ID3DXEffect接口。在该函数执行成功后，所创建的接口中就包含了文件里所对应的 所有内容，包括参数变量表、Shader程序、technique和pass等。 </p>
				<p>ID3DXEffect接口的使用： 通过该接口的方法可以获得FX文件中的所有信息，并设置参数变量和当前的technique。所有的参数变量、technique、pass、shader等等都有自己的名称，根据这些名称，通过调用ID3DXEffect::GetParameterByName()、ID3DXEffect::GetTechniqueByName()和ID3DXEffect::GetPassByName()等方法就可以获得这些对象的句柄，从而在调用 ID3DXEFFECT::Set***()进行设置时使用句柄而不是字符串进行索引来提高效率。</p>
				<p>通过ID3DXEffect::GetParameterDesc()、ID3DXEffect::GetTechniqueDesc()和GetPassDecs等方 法可以获得关于指定对象的所有细节描述信息。 D3DX库中定义了一个D3DXPARAMETER_DESC结构来专门表示参数的类型。通过ID3DXEffect::GetParameterDesc()方法，可以为一个参数获得这样一个结构的数据。 </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<span class="unnamed2">
												<font face="宋体">typedef struct</font>
										</span>
										<font face="宋体"> _D3DXPARAMETER_DESC <br />{ <br />    LPCSTR Name;               //参数变量名 <br />    LPCSTR Semantic;           //参数变量的Semantic <br />    D3DXPARAMETER_CLASS Class; //参数变量的类别，可以是标量、矢量、矩阵、对象和结构 <br />    D3DXPARAMETER_TYPE Type;   //参数变量的类型 <br />    UINT Rows;                 //数组型参数的行数 <br />    UINT Columns;              //数组型参数的列数 <br />    UINT Elements;             //数组中的元素个数 <br />    UINT Annotations;          //参数变量的Annotation个数 <br />    UINT StructMembers;        //结构型参数变量成员的个数 <br />    DWORD Flags;               //参数属性 <br />    UINT Bytes;                //参数大小，以字节记 <br />} D3DXPARAMETER_DESC; </font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>其中的参数类型可以有下列几种： </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<span class="unnamed2">
												<font face="宋体">typedef</font>
										</span>
										<font face="宋体"> enum _D3DXPARAMETER_TYPE <br />{ <br />    D3DXPT_VOID, //Void型指针 <br />    D3DXPT_BOOL, //Bool型 <br />    D3DXPT_INT, //整型 <br />    D3DXPT_FLOAT, //浮点型 <br />    D3DXPT_STRING, //字符串 <br />    D3DXPT_TEXTURE, //纹理 <br />    D3DXPT_TEXTURE1D, //一维纹理 <br />    D3DXPT_TEXTURE2D, //二维纹理 <br />    D3DXPT_TEXTURE3D, //三维纹理 <br />    D3DXPT_TEXTURECUBE, //立方体环境纹理 <br />    D3DXPT_SAMPLER, //纹理取样器 <br />    D3DXPT_SAMPLER1D, //一维纹理取样器 <br />    D3DXPT_SAMPLER2D, //二维纹理取样器 <br />    D3DXPT_SAMPLER3D, //三维纹理取样器 <br />    D3DXPT_SAMPLERCUBE, //立方体环境纹理取样器 <br />    D3DXPT_PIXELSHADER, //Pixel Shader程序 <br />    D3DXPT_VERTEXSHADER, //Vertex Shader程序 <br />    D3DXPT_PIXELFRAGMENT, //Pixel Shader片断 <br />    D3DXPT_VERTEXFRAGMENT, //Vertex Shader片断 <br />    D3DXPT_FORCE_DWORD = 0x7fffffff <br />} D3DXPARAMETER_TYPE;</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>而真正要让Effect起作用，需要在绘制网格模型前后调用ID3DXEffect::BeginPass()和EndPass方法。在调用这两个函数之前和之后，还需调用ID3DXEffect::Begin()和 ID3DXEffect::End()方法来界定此次Effect设置的起止。大致的形式如下： </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<p>
												<font face="宋体">LPD3DXEffect pd3dEffect；<span class="unnamed1"> //ID3DXEffect接口指针 </span><br />... <span class="unnamed1">//初始化该指针 </span><br />... <span class="unnamed1">//程序中的其他部分</span><br />... </font>
										</p>
										<p>
												<font face="宋体">UINT numPasses;<span class="unnamed1"> //用于接受当前所使用的technique中的pass个数 </span><br />pd3dEffect-&gt;Begin( &amp; numPasses, 0 ) <span class="unnamed1">//开始使用当前的technique </span><br /><span class="unnamed2">for</span>( UINT iPass = 0; iPass &lt; numPasses; iPass ++ ) <br />{ <br />    <span class="unnamed1">//遍历所有的pass </span><br />    pd3dEffect-&gt;BeginPass( iPass ); <span class="unnamed1">//调用BeginPass </span><br />    DrawMesh();                     <span class="unnamed1">//然后进行模型的绘制。 </span><br />    pd3dEffect-&gt;EndPass();         <span class="unnamed1"> //调用EndPass </span><br />} <br />pd3dEffect-&gt;End();                 <span class="unnamed1"> //不要忘记结束当前technique </span></font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>
						<strong>3DS MAX对DirectX 9 Shader Material的支持；Effect数据获取和导出</strong>
				</p>
				<p>在FX文件中的参数，大部分都是用来调整FX文件所指定的Effect的一些细节，例如，一种带有凹凸纹理的效果，可能在FX中就有一个参数控制着凹凸不平的程度。而这些参数是需要由美工来调整的。另外，美工也需要有一个途径能够将FX文件定义的Effect赋予到一个模型或它的一部分上去。同时美工也应该能够实时的预览该Effect在模型上的实际效果。 在以前，实现这些要求只能通过自制效果预览器、模型编辑器或者为DCC软件编写插件来完成。这对于小的工作组和工期较短的项目来说是非常困难的。幸运的是，目前的DCC软件 已经开始为游戏制作提供丰富的支持功能。通过DCC软件自身就可以预览到实时Effect的效果，并调整其参数。在《龙的传说》这个项目中，我们使用3DS MAX 6.0来作为模型建立 工具和Shader预览工具。 </p>
				<p>在3DS MAX 6.0中，新加入了一种材质类型——DirectX 9 Shader材质。这种材质是基于FX文件的。一个FX文件就可以代表一种材质。它可以同MAX中的其他材质一样赋予到模型上 。在MAX的Viewport中可以实时地观察到FX文件中设计的效果。通过为FX中的参数设置特定的Semantic，可以将这些参数与MAX中的场景信息联系起来，如摄像机位置、世界变换矩 阵等。对于控制Effect效果的一些本地参数，可以通过为它们添加特定的Annotation，使MAX能够直接识别这些参数并在用户界面中显示它们的名称和调节控件。对应不同类型的参 数，MAX可以为它们生成不同的调节控件。这样，这种材质就和MAX的其他材质一样，可以更改纹理等等的参数了。 对于美工来说，通过这种用户界面就可以调整该FX材质的参数达到最好的效果。</p>
				<p>但是美工所调整的结果必须要能够保存下来才有意义。这个工作就得由程序员来完成了。要保存3DS MAX中编辑的所有内容，需要为3DS MAX编写文件导出插件，将其内部数据保存在特定格式的文件中。在《龙的传说》这个项目中，我们使用Microsoft DirectX .X 文件。如果从头开始写导出插件，工作量是相当大的；幸运的是，在Microsoft DirectX SDK Extra中提供了一个能够导出模型和3DS MAX标准材质到X文件的插件源代码。通过修改该源代码，可以使它能够导出DirectX 9 Shader材质。在3DS MAX 6 SDK中新增加了一个IDxMaterial接口，通过查询一个IMaterial接口是否为IDxMaterial接口，就可以确定该材质是否为DirectX 9 Shader材质。通过IDxMaterial接口可以获得该材质对应的FX文件的文件名，以及其参数信息。这样就可以将它们导出了。 </p>
				<p>
						<strong>.X文件中对Effect的支持；EffectInstance和EffectDefault</strong>
				</p>
				<p>Microsoft DirectX .X文件的格式是基于模板的、可扩展的文件格式。通过为其制定新的模板，就可以在其中加入新的内容。一般的.X文件中的内容有三维场景的物体层级关系、网格模型几何数据、材质信息、动画信息等。在DirectX的众多X文件模板中有一个模板是专门用来代表Effect的实例的。当一个FX文件的参数被美工加以调整从而具备一些特定的值之后，该 FX文件和这些参数值的集合就形成了一个Effect实例。该模板的定义如下： </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<span class="unnamed2">
												<font face="宋体">template</font>
												<font face="宋体">
												</font>
										</span>
										<font face="宋体"> EffectInstance <br />{ <br />    &lt; E331F7E4-0559-4cc2-8E99-1CEC1657928F &gt; <br />    STRING EffectFilename; <br />    [ ... ] <br />} </font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>其中， EffectFilename代表了该Effect实例中的FX文件名， [ ... ]代表在其中可以插入任何X文件模板对应的数据。这样就可以代表任何类型的参数值。 </p>
				<p>然而要想让Direct3D程序能够识别[ ... ]中的内容，需要使用X文件模板中的EffectParam系列模板，包括EffectParamDWord, EffectParamFlaots, EffectParamString。通过这三种模板对应的数据，所有类型的Effect参数值都可以被记录在X文件中。 </p>
				<p>最后，EffectInstance数据需要被放置在Material数据中才可以被识别。</p>
				<p>Material模板： </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<span class="unnamed2">
												<font face="宋体">template</font>
										</span>
										<font face="宋体"> Material <br />{ <br />    &lt; 3D82AB4D-62DA-11CF-AB39-0020AF71E433 &gt; <br />    ColorRGBA faceColor; <br />    FLOAT power; <br />    ColorRGB specularColor; <br />    ColorRGB emissiveColor; <br />    [...] <br />} </font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>前面的一些颜色模板表明在Material数据中这些颜色信息是必须有的，而最后的[ ... ]则代表可以插入任何X文件模板对应的数据。我们的EffectInstance数据就可以放置在这里 。 </p>
				<p>举一个简单的例子： </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<font face="宋体">Material { <span class="unnamed1">//材质 </span><br />    0.500000;0.500000;0.500000;1.000000;;<span class="unnamed1"> //faceColor</span><br />    0.000000;<span class="unnamed1"> //power</span><br />    0.900000;0.900000;0.900000;;<span class="unnamed1"> //specularColor</span><br />    0.000000;0.000000;0.000000;;<span class="unnamed1"> //emissiveColor</span><br />    EffectInstance <br />    {                            <span class="unnamed1">//[...]，这里是EffectInstance</span><br />        "SkyboxNew01.fx";       <span class="unnamed1"> //fx文件的文件名。通过D3DXCreateEffectFromFile()可以</span><br />                                <span class="unnamed1"> //建立该文件对应的D3DXEffect对象 <br />        //下面是EffectInstance中的[...] </span><br />        EffectParamString <br />        {                        <span class="unnamed1">//EffectParamString，即字符串型参数值</span> <br />            "TexCloudTop";      <span class="unnamed1"> //参数的名称，通过该名称调用ID3DXEffect::GetXXXByName()方法</span><br />                                 <span class="unnamed1">//可以得到与fx文件中对应的参数</span>。 <br />            "DarkClouds01.jpg"; <span class="unnamed1"> //参数的值 </span><br />        } <br />        EffectParamString <br />        {                        <span class="unnamed1">//同上 </span><br />            "TexCloudBottom"; <br />            "DarkClouds02.jpg"; <br />        } <br />        EffectParamFloats <br />        {                       <span class="unnamed1">//EffectParamFloats，即浮点数组型参数值</span><br />            "Brightness";       <span class="unnamed1">//参数名称</span><br />            1;                 <span class="unnamed1"> //浮点数组大小</span><br />            0.500000;          <span class="unnamed1"> //值 </span><br />        } <br />    } <br />} </font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>当我们在程序中调用D3DXLoadMeshFromX()或D3DXLoadMeshHierarchyFromX()时，就可以通过其LPD3DXBUFFER *ppEffectInstances参数来接收到网格所用的所有EffectInstance的信息。</p>
				<p>在程序中，对应于X文件中的EffectInstance模板和EffectParam系列模板，有两个结构体用来代表Effect数据： </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<p>
												<span class="unnamed2">
														<font face="宋体">typedef struct</font>
												</span>
												<font face="宋体"> _D3DXEFFECTINSTANCE <br />{ <span class="unnamed1">//EffectInstance</span><br />    LPSTR pEffectFilename; <span class="unnamed1">//fx文件名</span><br />    DWORD NumDefaults; <span class="unnamed1">//参数个数</span><br />    LPD3DXEFFECTDEFAULT pDefaults; <span class="unnamed1">//参数数组</span><br />} D3DXEFFECTINSTANCE, *LPD3DXEFFECTINSTANCE; </font>
										</p>
										<font face="宋体">
												<p>
														<span class="unnamed2">typedef struct </span>_D3DXEFFECTDEFAULT <br />{ <span class="unnamed1">//EffectDefault，即EffectParam </span><br />    LPSTR pParamName;           <span class="unnamed1">//参数名 </span><br />    D3DXEFFECTDEFAULTTYPE Type;<span class="unnamed1"> //参数类型 </span><br />    DWORD NumBytes;             <span class="unnamed1">//参数大小，以字节记 </span><br />    LPVOID pValue;              <span class="unnamed1">//指向参数的值的指针 </span><br />} D3DXEFFECTDEFAULT, *LPD3DXEFFECTDEFAULT; </p>
												<p>需要注意的是，从文件中得到的参数类型只有以下几种： <br /><span class="unnamed2">typedef</span> enum _D3DXEFFECTDEFAULTTYPE <br />{ <br />    D3DXEDT_STRING = 1, <span class="unnamed1">//字符串 </span><br />    D3DXEDT_FLOATS = 2, <span class="unnamed1">//浮点数组 </span><br />    D3DXEDT_DWORD = 3,  <span class="unnamed1">//长整型 </span><br />    D3DXEDT_FORCE_DWORD = 0x7fffffff <span class="unnamed1">//此值不使用 </span><br />} D3DXEFFECTDEFAULTTYPE; </p>
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>在调用了D3DXLoadMeshFromX()和D3DXLoadMeshHierarchyFromX()之后，X文件中的所有Effect数据信息就以上述结构体的形式放置在ppEffectInstances中了。 另外，在从3DS MAX导出参数到X文件时，对于整型和浮点数组型的变量，它们的值将直接导出到X文件中去；而对于所有的纹理贴图文件参数，导出的仅仅是该文件的文件名。所以 在程序中需要再根据这些文件名来建立纹理对象。 在《龙的传说》中，我们使用一个自定义的CEffectInstance类来处理将文件名转换为纹理对象的过程。 一般来说，建立一个完整的CEffectInstance的过程如下： </p>
				<p>根据D3DXEFFECTINSTANCE结构中的pEffectFilename字符串寻找对应的FX文件; <br />根据该FX文件建立ID3DXEffect，并将指针保存在CEffectInstance中; <br />根据D3DXEFFECTINSTANCE结构中的pDefaults设置CEffectInstance中的参数信息： </p>
				<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
						<p>
								<br />对于长整型和浮点数组，直接拷贝； <br />对于字符串，首先调用ID3DXEffect接口中的GetParameterByName()和GetParameterDesc()方法，得到该参数的类型； 然后进一步判断： </p>
						<blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
								<p>
										<br />如果确实是字符串参数，则直接拷贝 <br />如果是纹理参数，则将该字符串作为纹理文件名建立纹理对象，并将指针保存在CEffectInstance中。 </p>
						</blockquote>
				</blockquote>
				<p>而在最新推出的DirectX 9 SDK Summer 2004中，通过ID3DXEffect::BeginParameterBlock()和ID3DXEffect::EndParameterBlock()方法，我们可以将Effect参数设置过程统一绑定到一个ParamBlock句柄上。这样，在调用ID3DXEffect::Begin()之前就可以直接使用ID3DXEffect::ApplyParameterBlock()方法来设置所有被绑定的参数值。例如： </p>
				<p>[<strong>以前的做法</strong>]： </p>
				<p>在读取参数时：获得每一个参数的句柄 </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<font face="宋体">
												<p>hParam1 = pEffect-&gt;GetParameterByName( NULL, "LightPos" ); <br />hParam2 = pEffect-&gt;GetParameterByName( NULL, "LightColor" ); <br />...</p>
												<p class="unnamed1">在实时绘制时：分别设置每一个参数 </p>
												<p>pEffect-&gt;SetValue( hParam1, value1 ); <br />pEffect-&gt;SetValue( hParam2, value2 ); <br />... <br />pEffect-&gt;Begin(); <br /><span class="unnamed1">// 绘制</span><br />... </p>
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>[<strong>在DirectX 9 SDK Summer 2004中的做法</strong>]： </p>
				<p>在读取参数时：绑定所有参数设置到同一句柄 </p>
		</font>
		<table cellspacing="0" cellpadding="0" width="500" bgcolor="#e0e0e0" border="0">
				<tbody>
						<tr>
								<td>
										<p>
												<font face="宋体">hParam1 = pEffect-&gt;GetParameterByName( NULL, "LightPos" ); <br />hParam2 = pEffect-&gt;GetParameterByName( NULL, "LightColor" ); <br />...<br />pEffect-&gt;BeginParameterBlock();<span class="unnamed1"> // 开始绑定</span><br />pEffect-&gt;SetValue( hParam, value1 ); <br />pEffect-&gt;SetValue( hParam, value2 ); <br />... <br />hParamBlock = pEffect-&gt;EndParameterBlock(); <span class="unnamed1">// 结束绑定，返回句柄 </span></font>
										</p>
										<p class="unnamed1">
												<font face="宋体">在实时绘制时：统一设置绑定值 </font>
										</p>
										<font face="宋体">
												<p>pEffect-&gt;ApplyParameterBlock( hParamBlock ); <br />pEffect-&gt;Begin; <br /><span class="unnamed1">// 绘制 </span><br />... </p>
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<font face="宋体">
				<p> </p>
				<p>这样不仅简化了在读取时对参数的分析过程，而且提高了实际绘制时参数设置过程的效率。 </p>
				<p>
						<strong>总结</strong>
				</p>
				<p>以上就是一些对于在DirectX 9.0中对Effect Framework的使用的简要介绍。总之，使用Effect来替代以前的标准材质是目前实时图形领域的发展趋势。通过Effect Framework，程序员和美工可以为实时三维程序实现多种多样的材质效果和视觉效果。 由于内容实在太多，限于篇幅，本文只是对Effect Framework中相关概念的一个总体概括和简要介绍，所以显得有些晦涩。在以后的文章中，将分批对这个Framework以及在其之上进行工作的流程进行比较详细的介绍。</p>
		</font>
<img src ="http://www.cppblog.com/mybios/aggbug/15464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-20 16:54 <a href="http://www.cppblog.com/mybios/archive/2006/11/20/15464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】渲染状态管理</title><link>http://www.cppblog.com/mybios/archive/2006/11/18/15400.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Sat, 18 Nov 2006 14:34:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/18/15400.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15400.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/18/15400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15400.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15400.html</trackback:ping><description><![CDATA[　　提高3D图形程序的性能是个很大的课题。图形程序的优化大致可以分成两大任务，一是要有好的场景管理程序，能快速剔除不可见多边形，并根据对象距相机远近选择合适的细节（LOD）；二是要有好的渲染程序，能快速渲染送入渲染管线的可见多边形。   <br />　　我们知道，使用OpenGL或Direct3D渲染图形时，首先要设置渲染状态，渲染状态用于控制渲染器的渲染行为。应用程序可以通过改变渲染状态来控制OpenGL或Direct3D的渲染行为。比如设置Vertex/Fragment Program、绑定纹理、打开深度测试、设置雾效等。  <br />　　改变渲染状态对于显卡而言是比较耗时的操作，而如果能合理管理渲染状态，避免多余的状态切换，将明显提升图形程序性能。这篇文章将讨论渲染状态的管理。  <br /><br />文档目录：  <br />　　基本思想  <br />　　实际问题  <br />　　渲染脚本  <br /><br />文档内容：  <br /><br />基本思想  <br />　　我们考虑一个典型的游戏场景，包含人、动物、植物、建筑、交通工具、武器等。稍微分析一下就会发现，实际上场景里很多对象的渲染状态是一样的，比如所有的人和动物的渲染状态一般都一样，所有的植物渲染状态也一样，同样建筑、交通工具、武器也是如此。我们可以把具有相同的渲染状态的对象归为一组，然后分组渲染，对每组对象只需要在渲染前设置一次渲染状态，并且还可以保存当前的渲染状态，设置渲染状态时只需改变和当前状态不一样的状态。这样可以大大减少多余的状态切换。下面的代码段演示了这种方法：  <br />   <br /><br />// 渲染状态组链表，由场景管理程序填充  <br />RenderStateGroupList groupList;  <br />// 当前渲染状态  <br />RenderState curState;  <br /><br />……  <br /><br />// 遍历链表中的每个组  <br />RenderStateGroup *group = groupList.GetFirst();  <br />while ( group != NULL )  <br />{   <br />     // 设置该组的渲染状态  <br />     RenderState *state = group-&gt;GetRenderState();  <br />     state-&gt;ApplyRenderState( curState );  <br /><br />     // 该渲染状态组的对象链表  <br />     RenderableObjectList *objList = group-&gt;GetRenderableObjectList();  <br />     // 遍历对象链表的每个对象  <br />     RenderableObject *obj = objList-&gt;GetFirst();  <br />     while ( obj != NULL )  <br />     {  <br />         // 渲染对象  <br />         obj-&gt;Render();  <br /><br />         obj = objList-&gt;GetNext();  <br />     }  <br /><br />     group = groupList.GetNext();   <br />}  <br />   <br />//其中RenderState类的ApplyRenderState方法形如：   <br />void RenderState::ApplyRenderState( RenderState &amp;curState )   <br />{  <br />     // 深度测试   <br />     if ( depthTest != curState.depthTest )  <br />     {  <br />         SetDepthTest( depthTest );  <br />         curState.depthTest = depthTest;  <br />     }  <br /><br />     // Alpha测试  <br />     if ( alphaTest != curState.alphaTest )  <br />     {  <br />         SetAlphaTest( alphaTest );  <br />         curState.alphaTest = alphaTest;  <br />     }  <br /><br />     // 其它渲染状态  <br />     ……  <br />}      <br /><br /><br />　　这些分组的渲染状态一般被称为Material或Shader。这里Material不同于OpenGL和Direct3D里面用于光照的材质，Shader也不同于OpenGL里面的Vertex/Fragment Program和Direct3D里面的Vertex/Pixel Shader。而是指封装了的显卡渲染图形需要的状态（也包括了OpenGL和Direct3D原来的Material和Shader）。  <br /><br />　　从字面上看，Material（材质）更侧重于对象表面外观属性的描述，而Shader（这个词实在不好用中文表示）则有用程序控制对象表面外观的含义。由于显卡可编程管线的引入，渲染状态中包含了Vertex/Fragment Program，这些小程序可以控制物体的渲染，所以我觉得将封装的渲染状态称为Shader更合适。这篇文章也将称之为Shader。  <br /><br />　　上面的代码段只是简单的演示了渲染状态管理的基本思路，实际上渲染状态的管理需要考虑很多问题。  <br />渲染状态管理的问题  <br />　  <br /><br />　消耗时间问题  <br />　　改变渲染状态时，不同的状态消耗的时间并不一样，甚至在不同条件下改变渲染状态消耗的时间也不一样。比如绑定纹理是一个很耗时的操作，而当纹理已经在显卡的纹理缓存中时，速度就会非常快。而且随着硬件和软件的发展，一些很耗时的渲染状态的消耗时间可能会有减少。因此并没有一个准确的消耗时间的数据。  <br /><br />　　虽然消耗时间无法量化，情况不同消耗的时间也不一样，但一般来说下面这些状态切换是比较消耗时间的：  <br /><br />Vertex/Fragment Program模式和固定管线模式的切换（FF，Fixed Function Pipeline）   <br /><br />Vertex/Fragment Program本身程序的切换   <br /><br />改变Vertex/Fragment Program常量   <br /><br />纹理切换   <br /><br />顶点和索引缓存（Vertex &amp; Index Buffers）切换   <br /><br />　　有时需要根据消耗时间的多少来做折衷，下面将会遇到这种情况。   <br /><br />    <br /><br />　渲染状态分类  <br />　　实际场景中，往往会出现这样的情况，一类对象其它渲染状态都一样，只是纹理和顶点、索引数据不同。比如场景中的人，只是身材、长相、服装等不同，也就是说只有纹理、顶点、索引数据不同，而其它如Vertex/Fragment Program、深度测试等渲染状态都一样。相反，一般不会存在纹理和顶点、索引数据相同，而其他渲染状态不同的情况。我们可以把纹理、顶点、索引数据不归入到Shader中，这样场景中所有的人都可以用一个Shader来渲染，然后在这个Shader下对纹理进行分组排序，相同纹理的人放在一起渲染。  <br />　多道渲染（Multipass Rendering）  <br />　　有些比较复杂的图形效果，在低档显卡上需要渲染多次，每次渲染一种效果，然后用GL_BLEND合成为最终效果。这种方法叫多道渲染Multipass Rendering，渲染一次就是一个pass。比如做逐像素凹凸光照，需要计算环境光、漫射光凹凸效果、高光凹凸效果，在NV20显卡上只需要1个pass，而在NV10显卡上则需要3个pass。Shader应该支持多道渲染，即一个Shader应该分别包含每个pass的渲染状态。  <br /><br />    不同的pass往往渲染状态和纹理都不同，而顶点、索引数据是一样的。这带来一个问题：是以对象为单位渲染，一次渲染一个对象的所有pass，然后渲染下一个对象；还是以pass为单位渲染，第一次渲染所有对象的第一个pass，第二次渲染所有对象的第二个pass。下面的程序段演示了这两种方式：  <br /><br />  以对象为单位渲染   <br /><br />// 渲染状态组链表，由场景管理程序填充  <br />ShaderGroupList groupList;  <br /><br />……  <br /><br />// 遍历链表中的每个组  <br />ShaderGroup *group = groupList.GetFirst();  <br />while ( group != NULL )  <br />{   <br />     Shader *shader = group-&gt;GetShader();  <br />   <br />     RenderableObjectList *objList = group-&gt;GetRenderableObjectList();  <br /><br />     // 遍历相同Shader的每个对象  <br />     RenderableObject *obj = objList-&gt;GetFirst();  <br />     while ( obj != NULL )  <br />     {  <br />         // 获取shader的pass数  <br />         int iNumPasses = shader-&gt;GetPassNum();  <br />         for ( int i = 0; i &lt; iNumPasses; i++ ) <br />{ <br />// 设置shader第i个pass的渲染状态 <br />shader-&gt;ApplyPass( i );  <br />             // 渲染对象  <br />             obj-&gt;Render();  <br />         }  <br /><br />         obj = objList-&gt;GetNext();  <br />     }  <br />   <br />     group = groupList-&gt;GetNext();  <br />}  <br />     <br /><br />以pass为单位渲染   <br />    <br />// 渲染状态组链表，由场景管理程序填充  <br />ShaderGroupList groupList;  <br />   <br />……  <br />    <br />for ( int i = 0; i &lt; MAX_PASSES_NUM; i++ ) <br />{ <br />// 遍历链表中的每个组 <br />ShaderGroup *group = groupList.GetFirst(); <br />while ( group != NULL ) <br />{ <br />Shader *shader = group-&gt;GetShader();  <br />         int iNumPasses = shader-&gt;GetPassNum();  <br />         // 如果shader的pass数小于循环次数，跳过此shader  <br />         if( i &gt;= iNumPasses )  <br />         {  <br />             group = groupList-&gt;GetNext();  <br />             continue;  <br />         }  <br /><br />         // 设置shader第i个pass的渲染状态  <br />         shader-&gt;ApplyPass( i );  <br /><br />         RenderableObjectList *objList =   <br />             group-&gt;GetRenderableObjectList();  <br />   <br />         // 遍历相同Shader的每个对象  <br />         RenderableObject *obj = objList-&gt;GetFirst();  <br />         while ( obj != NULL )  <br />         {  <br />             obj-&gt;Render();  <br /><br />             obj = objList-&gt;GetNext();  <br />         }  <br /><br />         group = groupList-&gt;GetNext();  <br />     }  <br />}  <br />    <br /><br />      <br />　　这两种方式各有什么优缺点呢？  <br /><br />　　以对象为单位渲染，渲染一个对象的第一个pass后，马上紧接着渲染这个对象的第二个pass，而每个pass的顶点和索引数据是相同的，因此第一个pass将顶点和索引数据送入显卡后，显卡Cache中已经有了这个对象顶点和索引数据，后续pass不必重新将顶点和索引数据拷到显卡，因此速度会非常快。而问题是每个pass的渲染状态都不同，这使得实际上每次渲染都要设置新的渲染状态，会产生大量的多余渲染状态切换。  <br /><br />　　以pass为单位渲染则正好相反，以Shader分组，相同Shader的对象一起渲染，可以只在这组开始时设置一次渲染状态，相比以对象为单位，大大减少了渲染状态切换。可是每次渲染的对象不同，因此每次都要将对象的顶点和索引数据拷贝到显卡，会消耗不少时间。  <br />　　可见想减少渲染状态切换就要频繁拷贝顶点索引数据，而想减少拷贝顶点索引数据又不得不增加渲染状态切换。鱼与熊掌不可兼得 :-(  <br />　　由于硬件条件和场景数据的情况比较复杂，具体哪种方法效率较高并没有定式，两种方法都有人使用，具体选用那种方法需要在实际环境测试后才能知道。  <br />   <br /><br />　多光源问题  <br />待续……  <br /><br />   <br /><br />　阴影问题  <br />待续……  <br /><br /><br />　  <br /><br />渲染脚本  <br />　　现在很多图形程序都会自己定义一种脚本文件来描述Shader。  <br /><br />　　比如较早的OGRE（Object-oriented Graphics Rendering Engine，面向对象图形渲染引擎）的Material脚本，Quake3的Shader脚本，以及刚问世不久的Direct3D的Effect File，nVIDIA的CgFX脚本（文件格式与Direct3D Effect File兼容），ATI RenderMonkey使用的xml格式的脚本。OGRE Material和Quake3 Shader这两种脚本比较有历史了，不支持可编程渲染管线。而后面三种比较新的脚本都支持可编程渲染管线。  <br /><br />   <br /><br />脚本  特性  范例   <br />OGRE Material 封装各种渲染状态，不支持可编程渲染管线  &gt;&gt;&gt;&gt;   <br />Quake3 Shader 封装渲染状态，支持一些特效，不支持可编程渲染管线  &gt;&gt;&gt;&gt;   <br />Direct3D Effect File 封装渲染状态，支持multipass，支持可编程渲染管线  &gt;&gt;&gt;&gt;   <br />nVIDIA CgFX脚本 封装渲染状态，支持multipass，支持可编程渲染管线  &gt;&gt;&gt;&gt;   <br />ATI RenderMonkey脚本 封装渲染状态，支持multipass，支持可编程渲染管线  &gt;&gt;&gt;&gt;   <br /><br />   <br /><br />　　使用脚本来控制渲染有很多好处：  <br /><br />可以非常方便的修改一个物体的外观而不需重新编写或编译程序   <br /><br />可以用外围工具以所见即所得的方式来创建、修改脚本文件（类似ATI RenderMonkey的工作方式），便于美工、关卡设计人员设定对象外观，建立外围工具与图形引擎的联系   <br /><br />可以在渲染时将相同外观属性及渲染状态的对象（也就是Shader相同的对象）归为一组，然后分组渲染，对每组对象只需要在渲染前设置一次渲染状态，大大减少了多余的状态切换<img src ="http://www.cppblog.com/mybios/aggbug/15400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-18 22:34 <a href="http://www.cppblog.com/mybios/archive/2006/11/18/15400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】谈论 Direct3D10特性预览</title><link>http://www.cppblog.com/mybios/archive/2006/11/18/15332.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Sat, 18 Nov 2006 01:14:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/18/15332.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15332.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/18/15332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15332.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15332.html</trackback:ping><description><![CDATA[引用 
<blockquote><a href="http://sunicdavy.spaces.live.com/blog/cns!46CE4EE212BD5943!142.entry"><font color="#0066a7">Direct3D10特性预览</font></a><br /><div><font color="#000000" size="4">将我在GameResBlog的老文章重新贴回来，发现写的还是很有味道，嘿嘿～～</font></div><div><font color="#000000" size="4"></font> </div><div><font color="#000000" size="4">刚拿到DirectX Dec2005 SDK，发现竟然有D3D10的文档和例子，速研究了一下，以下只是个人的读书笔记，仅作参考 </font><p></p><p><font color="#000000" size="4">1.去掉了固定管线<br />文档里列出了用DX10特性模拟的一些固定管线的操作，MS那么大度把DX都开源了(^O^)。</font></p><p><font color="#000000" size="4">2.去掉了以前版本DX的设备能力检查(CAPS)<br />为DX10和Windows Vista提供的显示硬件必须满足DX10的所有硬件特性。这样对于开发者就比较可以放心的使用各种硬件特性了，很类似Console平台<br />的开发。</font></p><p><font color="#000000" size="4">3.状态对象(State Object)<br />"从100多个渲染状态中解脱出来吧!"<br />D3D10对渲染状态这个概念进行淡化，一方面使用全Shader化的架构使得状态的前后设置和互相影响对渲染成功率降低到最少<br />另外对API架构也更为简洁，另一方面对一些关键渲染状态进行封装和分类。主要分类有:<br /><br />Input Layout Object 输入层对象<br />这个东西很类似D3D9里的顶点声明，也就是对用户输入数据进行整合和系统化<br /><br />Rasterizer Object 光栅化对象<br />这部分主要控制光栅器的行为：填充模式(FILL_MODE),剔除模式(CULL_MODE),多采样,DepthBias等等<br /><br />DepthStencil Object 深度缓冲对象<br />主要控制深度缓冲的行为，像Z-buffer Enable之类的<br /><br />Blend Object 混合对象<br />设置象素混合的方法，类似AlphaBlend SrcAlpha ,DestAlpha等等<br /><br />Sampler Object 采样器对象<br />设置纹理采样状态，包括过滤器和MipMap<br /><br />4.新的资源访问模式和资源视图(View)概念<br />如果对比D3D9的Shader使用代码和D3D10的类似代码会发现一个不同。<br />D3D9 Shader需要对纹理进行操作时，需要将纹理设置到Shader就可以了，而D3D10里没有那么简单，设置前必须将<br />各种资源整合后为资源创建一个视图，再提交给Shader访问。这种操作在环境贴图里是很有好处的。对于CubeMap的6张纹理<br />就可以采用一个视图设置到设备，而自己要访问每张贴图只要轻松访问视图就可以了，也就是说把资源规整和集成化。</font></p><p><font color="#000000" size="4">5.新的可编程图形层(Stage)-几何Shader(Geometry Shader)<br />原来的VS和PS只是对逐个顶点或象素进行处理，而新的GS可以对每个顶点或象素的临近顶点设置Shader。也就是可以对批量几何进行处理<br />GS的用途有:<br />点精灵<br />动态粒子系统<br />皮毛系统<br />卷积阴影<br />单Pass渲染到球形贴图<br />逐多边形材质交换<br />逐多边形材质设置<br /><br />6.设备的创建要求对ViewPort进行设置<br />D3D9里无需对ViewPort进行设置就可以进行渲染，而且默认的RenderTarget就是后备缓冲<br />而在D3D10里，这个过程变得更为自主化。取出后备缓冲的格式，将RenderTarget设置为屏幕<br />这让人感到D3D10设计更趋向于成熟的引擎设计。</font></p><p><font color="#000000" size="4">7.流输出层(Stream Output State)<br />这个层的功能是将VS和GS处理完成的数据输出给用户，由用户进行处理后再反馈给管线继续处理<br /><br />8.多边形拓扑结构从绘制代码分离<br />现在可以单独设置拓扑结构<br />g_pd3dDevice-&gt;IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST );<br />和使用Draw函数绘制了，很类似OpenGL</font></p><p><br /><font color="#000000" size="4">9.严格的设备对象创建时间验证<br />这里的设备对象就是从设备创建出来的资源。为了减少CPU占用，D3D10重新设计了硬件资源调用调度，所有的设备对象都用面向对象的方法被设备<br />管理。这种设计方法避免了在渲染期的资源创建操作。<br /><br />10.去掉BeginScene和EndScene<br />这个对于图形API确实多余</font></p><p><br /><font color="#000000" size="4">Dec2005 sdk里提供的文档让人很快想到这只是一个过渡版本<br />在DXUT的Mesh.Create函数中可以看到一个很有趣的现象：<br />创建D3D9对象，使用D3DX9里的载入X模型文件的函数载入X文件<br />将D3D9的模型数据转成D3D10的类型。这样做无非是在告诉我们一个<br />这样的信息，D3D10很有可能提供一种新的模型格式来作为研究使用<br />。Vista的图形系统Avalon从一些视频上分析，使用了大量的XML，所以<br />新的模型格式很有可能使用XML，并且X格式的解析接口确实不方便。而<br />XML的分析器可以由第三方提供。使得更多的研究人员能更方便的使用<br />这种新格式。</font></p><p><font color="#000000" size="4">顺便提供一些缩写对应的含义,这些在一些函数前缀会出现<br />IA-Input Assembler State<br />SO-Stream Output State<br />OM-Output Merger State<br />VS-Vertex Shader<br />PS-Pixel Shader<br />GS-Geometry Shader</font></p><p><font color="#000000" size="4">Powered by Davy.xu<br />msn:sunicdavy@sina.com</font></p></div></blockquote><img src ="http://www.cppblog.com/mybios/aggbug/15332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-18 09:14 <a href="http://www.cppblog.com/mybios/archive/2006/11/18/15332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】DXUT 框架函数介绍</title><link>http://www.cppblog.com/mybios/archive/2006/11/18/15331.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Sat, 18 Nov 2006 01:08:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/18/15331.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15331.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/18/15331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15331.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15331.html</trackback:ping><description><![CDATA[
		<div id="msgcns!F962D4854A8233D!184">
				<div>引用</div>
				<div>
						<u>
								<font color="#800080">DirectX SDK 2006学习笔记1——框架</font>
						</u>
				</div>
				<div>友情提醒：所谓的框架是指SDK目录下\Samples\C++\Common路径下的DXUT系列函数包装。学习框架的前提是必须有足够的Windows API，GUI编程经验，必须熟悉Windows的消息机制，回调机制，最好有万行左右的C/C++编程经验。MFC在这里没有任何用处。另外我觉得最好在看程序之前对于D3D的所有概念有点了解，什么是vertex，texture，matrix，lighting，mesh等等，以及相关的数学概念。这些都可以在网上找到中文翻译，帮助你快速入门。 
<div> </div><div>　　DXSDK2006和2003版的比起来更新了不少东西，比如DirectX10，还有Managed </div><div>DirectX等等。不过我关心的还是D3D9。除了个别接口的更改之外，DXSDK2006还提供了一套图形控件的类库，它的界面还是很漂亮的：）如图：</div><div align="center"> <img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mikefeng/234914/r_dxcontrol.gif" /></div><div>　　学习一个框架还是从它的入口学习比较方便，否则容易迷失在无穷无尽的API和层层包装之中。DXSDK2006的框架和2003版的DX9.0c框架有很大的不同。首先是2003版的框架中提供了一个CD3DApplication类，这个类对于初始化，清除，以及游戏窗口的创建，游戏主循环进行了包装。这是一个不错的类，不知道为什么在2006版中去掉了。不过不要紧，2006版的框架中提供的一些C包装函数已经足够了。在看这些函数之前，我们还是先来看看SDK目录下\Samples\C++ \Direct3D\Tutorials中有些什么吧。Tut01_CreateDevice是创建框架，这个程序不用框架，研究一下有助于了解D3D的大致工作流程。下面是winmain函数中的一部分。</div><div> </div><div align="left"><strong><span>    </span></strong><span style="COLOR: green">// Initialize Direct3D</span></div><div align="left"><strong><span>    </span></strong><span style="COLOR: blue">if</span>( <span style="COLOR: black">SUCCEEDED( <span style="COLOR: black">InitD3D</span>( <span style="COLOR: black">hWnd</span><strong> ) ) )</strong></span></div><div align="left"><strong><span>    { </span></strong></div><div align="left"><strong><span>        </span></strong><span style="COLOR: green">// Show the window</span></div><div align="left"><strong><span>        </span></strong><span style="COLOR: black">ShowWindow</span>( <span style="COLOR: black">hWnd, <span style="COLOR: black">SW_SHOWDEFAULT</span><strong> );</strong></span></div><div align="left"><strong><span>        </span></strong><span style="COLOR: black">UpdateWindow</span>( <span style="COLOR: black">hWnd<strong> );</strong></span></div><div align="left"> </div><div align="left"><strong><span>        </span></strong><span style="COLOR: green">// Enter the message loop</span></div><div align="left"><strong><span>        </span></strong><span style="COLOR: black">MSG</span><span style="COLOR: black">msg</span>; </div><div align="left"><strong><span>        </span></strong><span style="COLOR: blue">while</span>( <span style="COLOR: black">GetMessage( &amp;<span style="COLOR: black">msg</span>, <span style="COLOR: black">NULL</span>, 0, 0 ) )</span></div><div align="left"><strong><span>        {</span></strong></div><div align="left"><strong><span>            </span></strong><span style="COLOR: black">TranslateMessage</span>( &amp;<span style="COLOR: black">msg<strong> );</strong></span></div><div align="left"><strong><span>            </span></strong><span style="COLOR: black">DispatchMessage</span>( &amp;<span style="COLOR: black">msg<strong> );</strong></span></div><div align="left"><strong><span>        }</span></strong></div><div><strong><span>    }</span></strong></div><div>　　</div><div>　　在消息循环之前有个初始化设备的函数InitD3D( hWnd )，其代码如下：</div><div align="left"><span style="COLOR: black">HRESULT</span><span style="COLOR: black">InitD3D</span>( <span style="COLOR: black">HWND<span style="COLOR: black">hWnd</span><strong> )</strong></span></div><div align="left">{</div><div align="left"><strong><span>    </span></strong><span style="COLOR: blue">if</span>( <span style="COLOR: black">NULL<strong> == ( </strong><span style="COLOR: black">g_pD3D</span><strong> = </strong><span style="COLOR: black">Direct3DCreate9</span>( <span style="COLOR: black">D3D_SDK_VERSION</span><strong> ) ) )</strong></span></div><div align="left"><strong><span>        </span></strong><span style="COLOR: blue">return</span><span style="COLOR: black">E_FAIL</span>;</div><div align="left"> </div><div align="left"><strong><span>    </span></strong><span style="COLOR: black">D3DPRESENT_PARAMETERS</span><span style="COLOR: black">d3dpp</span>; </div><div align="left"><strong><span>    </span></strong><span style="COLOR: black">ZeroMemory</span>( &amp;<span style="COLOR: black">d3dpp, <span style="COLOR: blue">sizeof</span>(<span style="COLOR: black">d3dpp</span>) );</span></div><div align="left"><strong><span>    </span></strong><span style="COLOR: black">d3dpp</span>.<span style="COLOR: black">Windowed<strong> = </strong><span style="COLOR: black">TRUE</span>;</span></div><div align="left"><strong><span>    </span></strong><span style="COLOR: black">d3dpp</span>.<span style="COLOR: black">SwapEffect<strong> = </strong><span style="COLOR: black">D3DSWAPEFFECT_DISCARD</span>;</span></div><div align="left"><strong><span>    </span></strong><span style="COLOR: black">d3dpp</span>.<span style="COLOR: black">BackBufferFormat<strong> = </strong><span style="COLOR: black">D3DFMT_UNKNOWN</span>;</span></div><div align="left"> </div><div align="left"><span style="COLOR: blue">if</span>( <span style="COLOR: black">FAILED( <span style="COLOR: black">g_pD3D</span>-&gt;<span style="COLOR: black">CreateDevice</span>( <span style="COLOR: black">D3DADAPTER_DEFAULT</span>, </span></div><div align="left"><span style="COLOR: black">D3DDEVTYPE_HAL</span>,<span style="COLOR: black">hWnd,</span></div><div align="left"><span style="COLOR: black">D3DCREATE_SOFTWARE_VERTEXPROCESSING</span>,<strong> &amp;</strong><span style="COLOR: black">d3dpp, </span></div><div align="left">&amp;<span style="COLOR: black">g_pd3dDevice<strong> ) ) )</strong></span></div><div align="left"><strong><span>    {</span></strong></div><div align="left"><strong><span>        </span></strong><span style="COLOR: blue">return</span><span style="COLOR: black">E_FAIL</span>;</div><div align="left"><strong><span>    }</span></strong></div><div align="left"><strong><span>    </span></strong><span style="COLOR: blue">return</span><span style="COLOR: black">S_OK</span>;</div><div>}</div><div> </div><div style="TEXT-INDENT: 21pt">主要是调用<span style="COLOR: black">Direct3DCreate9</span><span style="COLOR: black">和</span><span style="COLOR: black">g_pD3D</span>-&gt;<span style="COLOR: black">CreateDevice</span><span style="COLOR: black">这两个函数。查看</span><span style="COLOR: black">DXSDK</span><span style="COLOR: black">文档中关于</span><span style="COLOR: black">D3DPRESENT_PARAMETERS</span><span style="COLOR: black">的定义，大致了解一下。</span></div><div style="TEXT-INDENT: 21pt">接下来要关心的就是消息循环了，在回调函数<span style="COLOR: black">MsgProc</span>中处理了两个消息，一个是<span style="COLOR: black">WM_DESTROY</span>，里面调用了Cleanup函数，另一个是WM_PAINT函数，里面调用了Render函数。Cleanup函数很简单，就是调用D3D对象及其设备对象的Release函数释放资源，而Render函数就是D3D中最重要的函数了。</div><div align="left"><span style="COLOR: black">VOID</span><span style="COLOR: black">Render</span>()</div><div align="left">{</div><div align="left"><strong><span>    </span></strong><span style="COLOR: blue">if</span>( <span style="COLOR: black">NULL==<span style="COLOR: black">g_pd3dDevice</span>)</span></div><div align="left"><strong><span>        </span></strong><span style="COLOR: blue">return</span>;</div><div align="left"> </div><div align="left"><strong><span>    </span></strong><span style="COLOR: green">// Clear the backbuffer to a blue color</span></div><div align="left"><strong><span>    </span></strong><span style="COLOR: black">g_pd3dDevice</span>-&gt;<span style="COLOR: black">Clear( 0, <span style="COLOR: black">NULL</span>, <span style="COLOR: black">D3DCLEAR_TARGET</span>, <span style="COLOR: black">D3DCOLOR_XRGB</span>(0,0,255), 1.0f, 0 );</span></div><div align="left"><strong><span>    </span></strong></div><div align="left"><strong><span>    </span></strong><span style="COLOR: green">// Begin the scene</span></div><div align="left"><strong><span>    </span></strong><span style="COLOR: blue">if</span>( <span style="COLOR: black">SUCCEEDED( <span style="COLOR: black">g_pd3dDevice</span>-&gt;<span style="COLOR: black">BeginScene</span>() ) )</span></div><div align="left"><strong><span>    </span></strong>{</div><div align="left"><strong><span>        </span></strong><span style="COLOR: green">// Rendering of scene objects can happen here</span></div><div align="left"><strong><span>    </span></strong></div><div align="left"><strong><span>        </span></strong><span style="COLOR: green">// End the scene</span></div><div align="left"><strong><span>        </span></strong><span style="COLOR: black">g_pd3dDevice</span>-&gt;<span style="COLOR: black">EndScene();</span></div><div align="left"><strong><span>    </span></strong>}</div><div align="left"> </div><div align="left"><strong><span>    </span></strong><span style="COLOR: green">// Present the backbuffer contents to the display</span></div><div align="left"><strong><span>    </span></strong><span style="COLOR: black">g_pd3dDevice</span>-&gt;<span style="COLOR: black">Present( <span style="COLOR: black">NULL</span>, <span style="COLOR: black">NULL</span>, <span style="COLOR: black">NULL</span>, <span style="COLOR: black">NULL</span>)<strong>;</strong></span></div><div>}</div><div>　　主要调用的函数有BeginScene, EndScene和Present函数。</div><div><span>    </span>对D3D应用程序有了大概了解之后就可以看空框架程序了。这个程序可以在Samples\C++\Direct3D\EmptyProject中找到。</div><div align="center"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mikefeng/234914/r_winmain.gif" /></div><div>　　从WinMain中的调用可以看到，框架首先设定一堆回调函数，很多事情的是在用户自己写的回调函数中实现。从DXUTInit开始，程序开始调用框架内的API来完成初始化——创建窗口——创建设备——主消息循环——退出等一系列操作。调查Common目录下DXUT.cpp文件就可以发现DXUTInit函数干了以下几件事情</div><div><span>①<span style="FONT: 7pt 'Times New Roman'">     </span></span>设定开始调用这个函数的标志符</div><div><span>②<span style="FONT: 7pt 'Times New Roman'">     </span></span>InitCommonControls</div><div><span>③<span style="FONT: 7pt 'Times New Roman'">     </span></span>保存当前的sticky/toggle/filter键</div><div><span>④<span style="FONT: 7pt 'Times New Roman'">     </span></span>通过事先导入winmm.dll的方法timeBeginPeriod来确保调用Sleep的准确性</div><div><span>⑤<span style="FONT: 7pt 'Times New Roman'">     </span></span>设定一些标志附，读取命令行参数</div><div><span>⑥<span style="FONT: 7pt 'Times New Roman'">     </span></span>检查版本</div><div><span>⑦<span style="FONT: 7pt 'Times New Roman'">     </span></span>获得D3D对象指针。值得一提的是框架中大部分全局变量是通过类DXUTState的静态变量state的get/set方法得到的。这些get/set方法是用宏定义的，里面调用了加锁和解锁，因此保证了全局变量设定的线程安全。这些全局性的变量包括D3D对象指针，D3D设备对象指针，BackBufferSurfaceDesc，DeviceCaps，窗口HINSTANCE，窗口句柄HWND，焦点句柄HWNDFocus，全屏设备句柄，窗口设备句柄，窗口客户端矩形，模式切换时窗口客户端矩形，模式切换时全屏客户端矩形，Time，ElapsedTime，FPS数，窗口标题，设备数据DeviceStats，以及是否暂停渲染，时间是否暂停，窗口是否激活等标志，一些窗口事件等等。这些都可以通过DXUTGETXXX/DXUTSETXXX/DXUTISXXX系列包装函数获得。</div><div><span>⑧<span style="FONT: 7pt 'Times New Roman'">     </span></span>通过DXUT_Dynamic_Direct3DCreate9创建D3D对象。很多D3D底层API都是通过动态的方式加载的，这样有利于效率的提高。</div><div><span>⑨<span style="FONT: 7pt 'Times New Roman'">     </span></span>重设全局时钟</div><div><span>⑩<span style="FONT: 7pt 'Times New Roman'">     </span></span>设定DXUTInited为true。很多DXUT系列的函数都喜欢在入口设定一个开始调这个函数的标志，在出口设定一个这个函数已经被调过的标志，这样可以在以后再次调用这个函数的时候了解当前什么工作已经做了，什么工作没做需要补做。我想这个主要是用来防止函数重入问题的吧。其他函数中的这一对函数就不再提了</div><div> </div><div>　　呼~第一个函数大致看完了，接下来是DXUTCreateWindow函数。什么？要问DXUTSetCursorSettings为什么被无视？因为这个函数不重要。DXUTCreateWindow的工作大致是这样的</div><div><span>①<span style="FONT: 7pt 'Times New Roman'">     </span></span>判断关于设备的CallBack有没有设定好</div><div><span>②<span style="FONT: 7pt 'Times New Roman'">     </span></span>判断DXUTInit()有没有被调用成功（注意不是有没有调用）。</div><div><span>③<span style="FONT: 7pt 'Times New Roman'">     </span></span>获得焦点句柄，因为窗口还没有创建，所以这个句柄应该是NULL</div><div><span>④<span style="FONT: 7pt 'Times New Roman'">     </span></span>设定HInstance</div><div><span>⑤<span style="FONT: 7pt 'Times New Roman'">     </span></span>设定窗口类</div><div><span>⑥<span style="FONT: 7pt 'Times New Roman'">     </span></span>注册窗口类</div><div><span>⑦<span style="FONT: 7pt 'Times New Roman'">     </span></span>设定窗口位置和大小。好长一段代码，汗</div><div><span>⑧<span style="FONT: 7pt 'Times New Roman'">     </span></span>创建窗口。终于。。。</div><div><span>⑨<span style="FONT: 7pt 'Times New Roman'">     </span></span>设定窗口焦点句柄，全屏设备句柄，窗口设备句柄</div><div>　　</div><div>　　接下来的函数是DXUTCreateDevice。这个函数就是用来选择最优设备并创建的。</div><div><span>①<span style="FONT: 7pt 'Times New Roman'">     </span></span>设定参数中的回调函数和上下文，以备后用</div><div><span>②<span style="FONT: 7pt 'Times New Roman'">     </span></span>检查窗口是否被成功创建，否则再调用一次DXUTCreateWindow</div><div><span>③<span style="FONT: 7pt 'Times New Roman'">     </span></span>枚举所有可能的显示模式。枚举过程非常复杂，用到了CD3DEnumeration中的一些包装函数，这些设备信息包括分辨率，颜色位深等等。这里会用到DXUTCreateDevice传进来的参数IsDeviceAcceptable</div><div><span>④<span style="FONT: 7pt 'Times New Roman'">     </span></span>如果命令行设定过显示模式，那么将刚才得到的信息覆盖。</div><div><span>⑤<span style="FONT: 7pt 'Times New Roman'">     </span></span>采用某种权重的算法找出最优显示模式（DXUTFindValidDeviceSettings）</div><div><span>⑥<span style="FONT: 7pt 'Times New Roman'">     </span></span>切换设备。这里用到了DXUTCreateDevice传进来的参数ModifyDeviceSettings。切换设备时要考虑很多问题：比如需要暂时忽略WM_SIZE消息；只有在第一次创建设备的时候才用命令行参数；按照需要调用DXUTCreate3DEnvironment和DXUTReset3DEnvironment；分全屏和窗口设备重设；重设完了根据需要处理WM_SIZE消息；显示窗口，允许WM_SIZE消息等等</div><div> </div><div>　　最后是DXUTMainLoop。</div><div><span>①<span style="FONT: 7pt 'Times New Roman'">     </span></span>检查是否有重入问题</div><div><span>②<span style="FONT: 7pt 'Times New Roman'">     </span></span>设定进入主循环标志</div><div><span>③<span style="FONT: 7pt 'Times New Roman'">     </span></span>检查设备是否已经被成功创建，没创建的话用默认参数创建一次</div><div><span>④<span style="FONT: 7pt 'Times New Roman'">     </span></span>检查前面三个函数是否成功调用。汗，又是检查</div><div><span>⑤<span style="FONT: 7pt 'Times New Roman'">     </span></span>处理窗口消息，注意只有在没有消息处理的时候才调用DXUTRender3DEnvironment()</div><div><span>⑥<span style="FONT: 7pt 'Times New Roman'">     </span></span>在消息循环退出之后清除加速表。应该是类似SHIFT+X这种键盘加速表的清除吧</div><div><span>⑦<span style="FONT: 7pt 'Times New Roman'">     </span></span>更改主循环标志</div><div> </div><div>　　还是有必要看一下主消息循环中的DXUTRender3DEnvironment</div><div><span>①<span style="FONT: 7pt 'Times New Roman'">     </span></span>检查设备是否丢失</div><div><span>②<span style="FONT: 7pt 'Times New Roman'">     </span></span>在窗口模式下检查桌面分辨率位深设定，以便重设设备</div><div><span>③<span style="FONT: 7pt 'Times New Roman'">     </span></span>尝试重设设备DXUTReset3DEnvironment</div><div><span>④<span style="FONT: 7pt 'Times New Roman'">     </span></span>判断上次渲染到现在时间(elapsed time)决定是否要进行渲染</div><div><span>⑤<span style="FONT: 7pt 'Times New Roman'">     </span></span>调用用户的FrameMove函数</div><div><span>⑥<span style="FONT: 7pt 'Times New Roman'">     </span></span>调用用户的FrameRender函数</div><div><span>⑦<span style="FONT: 7pt 'Times New Roman'">     </span></span>调用Present函数</div><div><span>⑧<span style="FONT: 7pt 'Times New Roman'">     </span></span>更新当前Frame</div><div><span>⑨<span style="FONT: 7pt 'Times New Roman'">     </span></span>根据命令行检查是否需要关闭应用程序</div><div></div><div> </div>  
<div>　　主函数看完之后，剩下的就是一些回调函数了。要正确使用这些回调函数，除了知道它们的作用之外，还需要知道这些函数是何时被调用的。下面是调用顺序</div><ul><li><span style="FONT-SIZE: 10pt">程序启动：</span><span style="FONT-SIZE: 10pt">InitApp </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt">MsgProc </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt">IsDeviceAcceptable </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt">ModifyDeviceSettings </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt"> OnCreateDevice </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt">OnResetDevice </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt"> 渲染主循环 </span></li><li><span style="FONT-SIZE: 10pt">渲染主循环：</span><span style="FONT-SIZE: 10pt">OnFrameMove </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt"> OnFrameRender</span></li><li><span style="FONT-SIZE: 10pt">改变设备：</span><span style="FONT-SIZE: 10pt">ModifyDeviceSettings </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt"> OnLostDevice </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt">根据需要调用</span><span style="FONT-SIZE: 10pt">OnDestroyDevice </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt"> OnResetDevice </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt"> 渲染主循环</span></li><li><span style="FONT-SIZE: 10pt">程序退出：</span><span style="FONT-SIZE: 10pt">OnLostDevice </span><span style="FONT-SIZE: 10pt">→</span><span style="FONT-SIZE: 10pt">OnDestroyDevice</span></li></ul><div>　　下面是各函数的作用：</div><div align="center"><table cellspacing="0" cellpadding="0" border="1"><tbody><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">InitApp</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">初始化一些图形控件和</span><span style="FONT-SIZE: 10pt">GUI</span><span style="FONT-SIZE: 10pt">的消息处理函数</span></div></td></tr><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">OnCreateDevice</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">创建设备时的回调函数，用于创建</span><span style="FONT-SIZE: 10pt">D3DPOOL_MANAGED</span><span style="FONT-SIZE: 10pt">资源</span></div></td></tr><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">OnResetDevice</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">重设设备时的回调函数，用于创建</span><span style="FONT-SIZE: 10pt">D3DPOOL_DEFAULT</span><span style="FONT-SIZE: 10pt">资源</span></div></td></tr><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">OnFrameMove</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">动画实现处，常用于矩阵转换等操作</span></div></td></tr><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">OnFrameRender</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">渲染实现处，常用于渲染场景</span></div></td></tr><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">OnLostDevice</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">设备丢失时的回调函数，释放由</span><span style="FONT-SIZE: 10pt">OnResetDevice</span><span style="FONT-SIZE: 10pt">创建的资源</span></div></td></tr><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">OnDestroyDevice</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">设备析构时的回调函数，释放由</span><span style="FONT-SIZE: 10pt">OnCreateDevice</span><span style="FONT-SIZE: 10pt">创建的资源</span></div></td></tr><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">IsDeviceAcceptable</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">创建设备时用来对所有可用设备进行过滤的函数</span></div></td></tr><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">ModifyDeviceSettings</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">更改设备时的回调函数，用于实现更改设备时所需做的其他操作</span></div></td></tr><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">MsgProc</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">安排各空件处理消息的顺序</span></div></td></tr><tr><td valign="top" width="136"><div><span style="FONT-SIZE: 10pt">OnGUIEvent</span></div></td><td valign="top" width="398"><div><span style="FONT-SIZE: 10pt">程序控件绑定的消息处理回调函数</span></div></td></tr></tbody></table></div><div> </div><div>　　以上函数均可以更换名字，这里只是用框架默认的函数名字。</div></div>
		</div>
<img src ="http://www.cppblog.com/mybios/aggbug/15331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-18 09:08 <a href="http://www.cppblog.com/mybios/archive/2006/11/18/15331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】DXUT 框架入门 2</title><link>http://www.cppblog.com/mybios/archive/2006/11/18/15329.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Sat, 18 Nov 2006 01:02:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/18/15329.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15329.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/18/15329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15329.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15329.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这章主要介绍一下DXUT 里面的GUI元素。要在图形界面中添加GUI元素，首先要定义一个DialogResourceManager对象用来管理对话框资源。DialogResourceManager 管理渲染时状态、Sprite控制批量显示更新、对话框字体、纹理等等。CDXUTDialog 相当于MFC里面的对话框，作为各种控件资源的容器。CD3DSettingsDlg 是一个ms已经写好的对话框类...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/18/15329.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-18 09:02 <a href="http://www.cppblog.com/mybios/archive/2006/11/18/15329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】DXUT 框架入门 1</title><link>http://www.cppblog.com/mybios/archive/2006/11/18/15328.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Sat, 18 Nov 2006 01:01:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/18/15328.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15328.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/18/15328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15328.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15328.html</trackback:ping><description><![CDATA[
		<div id="msgcns!F962D4854A8233D!178">
				<div>CD3DApplication 框架类已经光荣的退役了，取而代之的是DXUT*系列函数。在这篇文章中将要简单介绍DXUT框架的应用。</div>
				<div>
						<a href="http://download.microsoft.com/download/8/b/8/8b8ea37d-44b2-469f-bda7-610fd173cb25/dxsdk_oct2006.exe">
								<font color="#0066a7">最近的directx 下载地址</font>
						</a>， 这里面包含了64位操作系统库以及directx10等等，directx10 的程序例子只能运行在windows vista 上面。尽管可以编译，但缺少directx3d10 运行库. 在安装sdk之后，别忘记安装Redist目录中最新的directx运行库。</div>
				<div>在vc.net-&gt;tools-&gt;options中配置头文件以及库文件地址。</div>
				<p align="left">
						<img alt="" src="http://tkfiles.storage.msn.com/x1pIuxx1VYmtQuQwDvrRKBkroZ8J_E5jUg7pEOCry03Z2NDhfZIJ4m8ArhvXfkzjazOksTCLI0PYVb7hCvDgipy8UxFGg9KvmJ_upajmt6kTl1qYz0VKQkyOPvIWsvc4r8DUjLXFoTNxv8" />
				</p>
				<p>使用dxut框架进行directx设计时，拷贝directx sdk 安装目录\Samples\C++\中的Common文件内容到你的程序目录下(如下图)。</p>
				<p align="left">
						<img alt="" src="http://tkfiles.storage.msn.com/x1pIuxx1VYmtQuQwDvrRKBkrl_l_gjtfcgqB1gOKfUB73lGYWMfO4aTW96_FDoA5efV3E9qf_T6os0_4cse2Hm1r2D1FDiu5Gt3WdEuxTkKWQL0aijqR2VHWIuj8mitOsJb" />
				</p>
				<div>创建一个名为dxut 的windows apllication 空工程,然后在vc solution explorer 中项目下加入common目录(添加存在文件，注意dxsound两个文件没有加入)，然后添加一个源文件main.cpp</div>
				<p align="left">
						<img alt="" src="http://tkfiles.storage.msn.com/x1pIuxx1VYmtQuQwDvrRKBkrhwgnxCu_VnEhZX4wpAeSlFifJSyv6daRU5cRHDC8Lxo3KXe8Qiao9g2ZcYJxUXp9lpW_XMGz0zvXF_xNMr2Do66PGQVFwxUrq4OQ1xBxImG-rQimZ31G6w" />
				</p>
				<div>然后在vc solution explorer 中项目上点右键进入项目属性页(property pages)加入附加的common目录作为附加头文件搜索目录,同样在属性页的 linker-&gt;input-&gt;addtional dependencies 中加入 dxerr.lib dxguid.lib d3dx9.lib d3d9.lib winmm.lib comctl32.lib 等链接库</div>
				<p align="left">
						<img alt="" src="http://tkfiles.storage.msn.com/x1pIuxx1VYmtQuQwDvrRKBkrnpwMc44ewW3Yqa--uzupCv0Mjl9tVd56wLCSg5nu1o2tbv7IpY-zrWzWyX6o7IR2jz3XuqDW62nUTAj_Hp9K4REism1d0hUMT0CbfTm5LCR" />
				</p>
				<p>main.cpp 源文件内容如下：<br /></p>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">#include </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">dxstdafx.h</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">--------------------------------------------------------------------------------------<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 当Directx3D设备被创建后，这个回调函数马上被调用，因为D3DPOOL_MANAGED资源在设备被销毁后<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 需要重新装载,这里是最佳创建D3DPOOL_MANAGED资源的地方，创建的资源应在 OnDestroyDevice <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 函数中销毁 。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">--------------------------------------------------------------------------------------</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pd3dDevice, </span>
						<span style="COLOR: #0000ff">const</span>
						<span style="COLOR: #000000"> D3DSURFACE_DESC</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pBackBufferSurfaceDesc, </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pUserContext )<br /><img id="Codehighlighter1_464_480_Open_Image" onclick="this.style.display='none'; Codehighlighter1_464_480_Open_Text.style.display='none'; Codehighlighter1_464_480_Closed_Image.style.display='inline'; Codehighlighter1_464_480_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_464_480_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_464_480_Closed_Text.style.display='none'; Codehighlighter1_464_480_Open_Image.style.display='inline'; Codehighlighter1_464_480_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_464_480_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_464_480_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> S_OK;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">--------------------------------------------------------------------------------------<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 当direct3d设备被复位后，这个函数立即被调用，这里最好放置D3DPOOL_DEFAULT 资源代码，因为这<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 这些资源在设备丢失后需要重新装载。在这里创建的资源应该在OnLostDevice 函数中释放<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">--------------------------------------------------------------------------------------</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">HRESULT CALLBACK OnResetDevice( IDirect3DDevice9</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pd3dDevice, </span>
						<span style="COLOR: #0000ff">const</span>
						<span style="COLOR: #000000"> D3DSURFACE_DESC</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pBackBufferSurfaceDesc, </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pUserContext )<br /><img id="Codehighlighter1_900_916_Open_Image" onclick="this.style.display='none'; Codehighlighter1_900_916_Open_Text.style.display='none'; Codehighlighter1_900_916_Closed_Image.style.display='inline'; Codehighlighter1_900_916_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_900_916_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_900_916_Closed_Text.style.display='none'; Codehighlighter1_900_916_Open_Image.style.display='inline'; Codehighlighter1_900_916_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_900_916_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_900_916_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> S_OK;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">--------------------------------------------------------------------------------------<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 在Direct3D设备进入lost状态后在IDirect3DDevice9::Reset 调用之前调用此函数，在OnResetDevice <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 中创建的资源必须在这里释放，通常包括所有的D3DPOOL_DEFAULT 资源，<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">--------------------------------------------------------------------------------------</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> CALLBACK OnLostDevice( </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pUserContext )<br /><img id="Codehighlighter1_1263_1266_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1263_1266_Open_Text.style.display='none'; Codehighlighter1_1263_1266_Closed_Image.style.display='inline'; Codehighlighter1_1263_1266_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1263_1266_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1263_1266_Closed_Text.style.display='none'; Codehighlighter1_1263_1266_Open_Image.style.display='inline'; Codehighlighter1_1263_1266_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_1263_1266_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1263_1266_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">-------------------------------------------------------------------------------------- <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">这个回调函数在每帧的开始被调用，这个在你的程序中用来处理场景更新最好的位置，但不能包含实际的<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">场景渲染调用，渲染工作应该放在OnFrameRender 回调函数中。常用于矩阵转换、摄像机等操作。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">--------------------------------------------------------------------------------------</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> CALLBACK OnFrameMove( IDirect3DDevice9</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pd3dDevice, </span>
						<span style="COLOR: #0000ff">double</span>
						<span style="COLOR: #000000"> fTime, </span>
						<span style="COLOR: #0000ff">float</span>
						<span style="COLOR: #000000"> fElapsedTime, </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pUserContext )<br /><img id="Codehighlighter1_1661_1663_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1661_1663_Open_Text.style.display='none'; Codehighlighter1_1661_1663_Closed_Image.style.display='inline'; Codehighlighter1_1661_1663_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1661_1663_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1661_1663_Closed_Text.style.display='none'; Codehighlighter1_1661_1663_Open_Image.style.display='inline'; Codehighlighter1_1661_1663_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_1661_1663_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1661_1663_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">--------------------------------------------------------------------------------------<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">此回调函数在每Frame最后被调用，在场景上执行所有的渲染调用，当窗口需要重绘（处理WM_PAINT消<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">息）时此函数也会被调用（此时不调用OnFrameMove），在此函数返回后，DXUT将调用<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">IDirect3DDevice9::Present 来显示翻转链中下一个缓冲区内容。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">--------------------------------------------------------------------------------------</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> CALLBACK OnFrameRender( IDirect3DDevice9</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pd3dDevice, </span>
						<span style="COLOR: #0000ff">double</span>
						<span style="COLOR: #000000"> fTime, </span>
						<span style="COLOR: #0000ff">float</span>
						<span style="COLOR: #000000"> fElapsedTime, </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pUserContext )<br /><img id="Codehighlighter1_2104_2307_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2104_2307_Open_Text.style.display='none'; Codehighlighter1_2104_2307_Closed_Image.style.display='inline'; Codehighlighter1_2104_2307_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2104_2307_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2104_2307_Closed_Text.style.display='none'; Codehighlighter1_2104_2307_Open_Image.style.display='inline'; Codehighlighter1_2104_2307_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_2104_2307_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2104_2307_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> HRESULT hr;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> V( pd3dDevice</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">Clear(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">, NULL, D3DCLEAR_TARGET </span>
								<span style="COLOR: #000000">|</span>
								<span style="COLOR: #000000"> D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">), </span>
								<span style="COLOR: #000000">1.0f</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">) );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(SUCCEEDED(pd3dDevice</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">BeginScene()))<br /><img id="Codehighlighter1_2267_2305_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2267_2305_Open_Text.style.display='none'; Codehighlighter1_2267_2305_Closed_Image.style.display='inline'; Codehighlighter1_2267_2305_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2267_2305_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2267_2305_Closed_Text.style.display='none'; Codehighlighter1_2267_2305_Open_Image.style.display='inline'; Codehighlighter1_2267_2305_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
								<span id="Codehighlighter1_2267_2305_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_2267_2305_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">更新图像</span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">  pd3dDevice</span>
										<span style="COLOR: #000000">-&gt;</span>
										<span style="COLOR: #000000">EndScene();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">-------------------------------------------------------------------------------------- <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">此回调函数在direct3d设备被销毁时调用，通常发生在程序终止，在OnCreateDevice 中创建的资源，要<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">在这里释放，通常包含所有的D3DPOOL_MANAGED资源<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">IDirect3DDevice9::Present 来显示翻转链中下一个缓冲区内容。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">--------------------------------------------------------------------------------------</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> CALLBACK OnDestroyDevice( </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pUserContext )<br /><img id="Codehighlighter1_2678_2682_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2678_2682_Open_Text.style.display='none'; Codehighlighter1_2678_2682_Closed_Image.style.display='inline'; Codehighlighter1_2678_2682_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2678_2682_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2678_2682_Closed_Text.style.display='none'; Codehighlighter1_2678_2682_Open_Image.style.display='inline'; Codehighlighter1_2678_2682_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_2678_2682_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2678_2682_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> )<br /><img id="Codehighlighter1_2739_3501_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2739_3501_Open_Text.style.display='none'; Codehighlighter1_2739_3501_Closed_Image.style.display='inline'; Codehighlighter1_2739_3501_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2739_3501_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2739_3501_Closed_Text.style.display='none'; Codehighlighter1_2739_3501_Open_Image.style.display='inline'; Codehighlighter1_2739_3501_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_2739_3501_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2739_3501_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 设置回调函数，这些函数允许DXUT通知应用程序更换设备，用户输入和窗口消息。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 回调函数是可选的，因此你要做的仅是设置你感兴趣的事件的回调函数。</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000"> DXUTSetCallbackDeviceCreated( OnCreateDevice );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> DXUTSetCallbackDeviceReset( OnResetDevice );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> DXUTSetCallbackDeviceLost( OnLostDevice );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> DXUTSetCallbackFrameRender( OnFrameRender );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> DXUTSetCallbackFrameMove( OnFrameMove );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 初始化DXUT并创建想要的Win32窗口和应用程序的Direct3D设备。调用这些<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 可选函数中的每一个，此外它们允许你设置几个选项来控制框架的行为。</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000"> DXUTInit( TRUE, TRUE, TRUE );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">directx 编码是unicode环境，所以字符串之前要加 L 。</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000"> DXUTCreateWindow( L</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Welcome to topameng.spaces.live.com</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000"> );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> DXUTCreateDevice( D3DADAPTER_DEFAULT, TRUE, </span>
								<span style="COLOR: #000000">640</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">480</span>
								<span style="COLOR: #000000"> );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 通过DXUT来处理消息循环并分派渲染调用。当在空闲时间和处理窗口消息的<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 时间间隔时，框架将调用OnFrameMove和OnFrameRender回调函数。</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000"> DXUTMainLoop();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> DXUTGetExitCode();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</div>
				<p> </p>
				<div>direct3d Memory Pools（内存池）<br />表面和其它一些D3D资源被放在多种内存池中。内存池的种类由D3DPOOL枚举类型的一个成员来指定。它可以为下列几种：<br />1．D3DPOOL_DEFAULT——表示D3D将根据资源的类型和用途把它们放在最合适的地方。这有可能是显存、AGP内存或者系统内存中。值得注意的是，这种内存池中的资源必须要在IDirect3DDevice9::Reset被调用之前消毁掉，然后必须重新初始化。<br />2．D3DPOOL_MANAGED——资源将由D3D管理并且按设备的需要来指定放在显存还是放在AGP内存中，同时备份这些资源到系统内存中。当应用程序访问和改变资源，也会对系统内存造成影响。<br />3．D3DPOOL_SYSTEMMEM——指定资源放在系统内存中。<br />4．D3DPOOL_SCRATCH——规定资源放在系统内存中，它与D3DPOOL_SYSTEMMEM不同之处在于使用这个参数使图形设备不能访问本内存池的资源，但资源可以被复制出去。</div>
				<div>
				</div>
				<div>也可以打开direct sdk 安装目录Samples\C++\Direct3D\EmptyProject  例子，基本和上面是相同的</div>
		</div>
<img src ="http://www.cppblog.com/mybios/aggbug/15328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-18 09:01 <a href="http://www.cppblog.com/mybios/archive/2006/11/18/15328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创翻译】开启Direct3D调试模式！</title><link>http://www.cppblog.com/mybios/archive/2006/11/17/15297.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Fri, 17 Nov 2006 07:14:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/17/15297.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15297.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/17/15297.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15297.html</trackback:ping><description><![CDATA[
		<h1>
				<font style="BACKGROUND-COLOR: #ffffff" color="#0000ff" size="3">声明：此文章翻译自DirectX 9.0C OCT 2006 SDK的Direct3D For C++帮助文档的Enabling Direct3D Debug Information主题，前面部分有些没有翻译的。</font>
		</h1>
		<h1>在#include &lt;D3D9.h&gt;语句前面加上以下这条语句即可：</h1>
		<h1>
				<font color="#ff0000">#define D3D_DEBUG_INFO</font>
		</h1>
		<h1>关闭调试时查看D3D Device对象的情况<br /><img height="191" alt="D3D_DEBUG_INFO1[1].gif" src="http://www.cppblog.com/images/cppblog_com/mybios/ArticlePics/D3D_DEBUG_INFO1[1].gif" width="549" border="0" /></h1>
		<p>
				<font size="6">
						<strong>开启调试时查看D3D对象的情况</strong>
				</font>
				<br />
				<img height="288" alt="D3D_DEBUG_INFO2[1].gif" src="http://www.cppblog.com/images/cppblog_com/mybios/ArticlePics/D3D_DEBUG_INFO2[1].gif" width="554" border="0" />
		</p>
		<p> </p>
		<p>
		</p>
		<h2>
				<a name="Use_the_Call_Stack_for_Extended_Debug">
				</a>为外部调试使用调用堆栈</h2>
		<p>当 Direct3D 调试模式开启之后，你可以在任何时候查看对象的调用堆栈。这会导致你的程序非常慢，但是可以使用此功能检查资源泄漏（内存泄漏的一种）。开启调用堆栈，设置这个注册表键值为1即可：</p>
		<pre class="clsCode">\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Direct3D\\
D3D9Debugging\\EnableCreationStack
</pre>
		<p>开启D3D调试模式，然后重建你的工程，系统将会给你访问这个附加的变量：<br />  LPCWSTR CreationCallStack;<br /></p>
		<p>这个变量存储着每次创建对象时的调用堆栈。这会导致你的程序非常慢，但是可以使用此功能检查资源泄漏。</p>
		<p> </p>
<img src ="http://www.cppblog.com/mybios/aggbug/15297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-17 15:14 <a href="http://www.cppblog.com/mybios/archive/2006/11/17/15297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】把D3D画面渲染到桌面！不用创建任何窗口</title><link>http://www.cppblog.com/mybios/archive/2006/11/17/15295.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Fri, 17 Nov 2006 06:54:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/17/15295.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15295.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/17/15295.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15295.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15295.html</trackback:ping><description><![CDATA[
		<p>   其实这个很简单，只是创建设备的时候那个hwnd有点不一样！<br />   可能有人就会说，用GetDesktopWindows()获得桌面的句柄不就行了？那就错了！这样会没有效果的！正确的代码如下：<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">    HWND hWnd </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> FindWindowEx(GetDesktopWindow() , </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000"> , </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">Progman</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> , </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">Program Manager</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    hWnd </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> FindWindowEx(hWnd , </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000"> , </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">SHELLDLL_DefView</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> , </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    hWnd </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> FindWindowEx(hWnd , </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000"> , </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">SysListView32</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> , </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">FolderView</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 初始化 D3D 设备</span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">    InitD3D(hWnd);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<br />是不是很简单！哈哈。<br /><br />显示的时候，如果想渲染在桌面的一角，则可以这样写：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 显示在左上角，128×128宽</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">        RECT rect;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        rect.left </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        rect.right </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        rect.top </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        rect.bottom </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 显示</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">        g_pd3dDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Present(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rect , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><img src ="http://www.cppblog.com/mybios/aggbug/15295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-17 14:54 <a href="http://www.cppblog.com/mybios/archive/2006/11/17/15295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】今天参照转贴的渲染到纹理做了一个例子，效果还不错，哈哈</title><link>http://www.cppblog.com/mybios/archive/2006/11/17/15278.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Fri, 17 Nov 2006 01:18:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/17/15278.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15278.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/17/15278.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15278.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15278.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: <P>代码里面写了详尽的注释！<A href="/Files/mybios/RenderToTexture.rar">点击这里下载工程</A>（使用VS2003 ＋ OCT 2006&nbsp;DirectSDK 编译）<BR>请看考这里<A id=_2241aa34328c_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl href="/mybios/archive/2006/11/16/15271.html">【转贴】Render to Texture（渲染到纹理）</A><BR><IMG height=480 alt=RenderToTexture.JPG src="/images/cppblog_com/mybios/ArticlePics/RenderToTexture.JPG" width=640 border=0><BR></P><br>&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/17/15278.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-17 09:18 <a href="http://www.cppblog.com/mybios/archive/2006/11/17/15278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】Render to Texture（渲染到纹理）</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15271.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 15:58:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15271.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15271.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15271.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15271.html</trackback:ping><description><![CDATA[·内容<br />　　 渲染到纹理是D3D中的一项高级技术。一方面，它很简单，另一方面它很强大并能产生很多特殊效果。 比如说发光效果，环境映射，阴影映射，都可以通过它来实现。渲染到纹理只是渲染到表面的一个延伸。我们只需再加些东西就可以了。首先，我们要创造一个纹理，并且做好一些防范措施。第二步我们就可以把适当的场景渲染到我们创建的纹理上了。然后，我们把这个纹理用在最后的渲染上。<br /><br />·main.cpp<br />　　 首先我们得声明所需要的对象。当然我们需要一张用来渲染的纹理。此外，我们还需要两个Surface对象。一个是用来存储后台缓冲区，一个用来当纹理的渲染对象。后面我再详细介绍它们。另外我们还需要两个矩阵，一个是用来当纹理的投影矩阵，另一个是存储原来的矩阵。<br /><br />LPDIRECT3DTEXTURE9 pRenderTexture = NULL;<br />LPDIRECT3DSURFACE9 pRenderSurface = NULL,pBackBuffer = NULL;<br />D3DXMATRIX matProjection,matOldProjection;<br /><br />　　 现在我们来创建纹理。前两个参数是纹理的宽度和高度，第三个参数是纹理的多级渐进纹理序列参数，在这里是设为1，第四个参数非常重要而且必须设为D3DUSAGE_RENDERTARGET，表明我们所创建的纹理是用来渲染的。剩下的参数就是指纹理格式，顶点缓冲区的内存位置，和一个指向纹理的指针。当纹理是用来当渲染对象时，顶点缓冲区的内存位置必须设为D3D_DEFAILT。 <br /><br />g_App.GetDevice()-&gt;CreateTexture(256,256,1,D3DUSAGE_RENDERTARGET,D3DFMT_R5G6B5,D3DPOOL_DEFAULT,&amp;pRenderTexture,NULL);<br /><br />　　 为了访问纹理内存对象，我们需要一个Surface对象，因为D3D中的纹理是用这样的一个Surface来存储纹理数据的。为了得到纹理表面的Surface,我们需要调用方法GetSurfaceLevel() 。第一个参数我们设为0，第二个参数为一个指向surface对象的指针。<br /><br />pRenderTexture-&gt;GetSurfaceLevel(0,&amp;pRenderSurface);<br /><br />下一步就是创建一个适合纹理维数的投影矩阵，因为纹理的横纵比和后台缓冲区的不一样。<br /><br />D3DXMatrixPerspectiveFovLH(&amp;matProjection,D3DX_PI / 4.0f,1,1,100);<br /><br />在我们的循环渲染之前，我们必须保存后台缓冲区和它的投影矩阵。<br /><br />g_App.GetDevice()-&gt;GetTransform(D3DTS_PROJECTION,&amp;matOldProjection);<br />g_App.GetDevice()-&gt;GetRenderTarget(0,&amp;pBackBuffer); <br /><br />　　 渲染循环函数可以分为两个部分。第一部分是渲染到纹理的过程。因此，渲染对象必须设为纹理表面。然后我们就可以把东西渲染到这个对象上了。渲染到另一个表面上和正常地渲染到后台缓冲区差不多。只有一点不同，那就是先不调用Prensent（）函数，因为纹理上的内容并不需要显示在屏幕上。象平时一样，我们先要重置表面颜色缓冲区，并且调用BeginSence()和EndSence()方法。为了能够适当的渲染，我们必须设置和纹理表面相符的投影矩阵。否则最后的图象可能被扭曲<br /><br />//render-to-texture<br />g_App.GetDevice()-&gt;SetRenderTarget(0,pRenderSurface); //set new render target<br />g_App.GetDevice()-&gt;Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(100,100,100),1.0f,0); //clear texture<br />g_App.GetDevice()-&gt;BeginScene();<br /><br />g_App.GetDevice()-&gt;SetTexture(0,pPyramideTexture);<br /><br />D3DXMatrixRotationY(&amp;matRotationY,fRotation);<br />D3DXMatrixTranslation(&amp;matTranslation,0.0f,0.0f,5.0f);<br />g_App.GetDevice()-&gt;SetTransform(D3DTS_WORLD,&amp;(matRotationY * matTranslation));<br />g_App.GetDevice()-&gt;SetTransform(D3DTS_PROJECTION,&amp;matProjection); //set projection matrix<br /><br />g_App.GetDevice()-&gt;SetStreamSource(0,pTriangleVB,0,sizeof(D3DVERTEX));<br />g_App.GetDevice()-&gt;DrawPrimitive(D3DPT_TRIANGLELIST,0,4);<br /><br />g_App.GetDevice()-&gt;EndScene();<br /><br />　　 渲染循环的第二部分就是渲染最后场景的过程（也就是显示到屏幕上的过程）。渲染对象重新设为后台缓冲区，投影矩阵重新设为原来的投影矩阵。由于纹理已经准备好了，所以它和纹理层0相关联。<br /><br />//render scene with texture<br />g_App.GetDevice()-&gt;SetRenderTarget(0,pBackBuffer); //set back buffer<br />g_App.GetDevice()-&gt;Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);<br />g_App.GetDevice()-&gt;BeginScene();<br /><br />g_App.GetDevice()-&gt;SetTexture(0,pRenderTexture); //set rendered texture<br /><br />g_App.GetDevice()-&gt;SetTransform(D3DTS_WORLD,&amp;matTranslation);<br />g_App.GetDevice()-&gt;SetTransform(D3DTS_PROJECTION,&amp;matOldProjection); //restore projection matrix<br /><br />g_App.GetDevice()-&gt;SetStreamSource(0,pQuadVB,0,sizeof(D3DVERTEX));<br />g_App.GetDevice()-&gt;DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);<br /><br />g_App.GetDevice()-&gt;EndScene();<br />g_App.GetDevice()-&gt;Present(NULL,NULL,NULL,NULL);<br /><br />最后我们通过调用Release()方法释放Surface对象。<br /><br />pRenderSurface-&gt;Release();<br />pRenderSurface = NULL;<br /><br />pBackBuffer-&gt;Release();<br />pBackBuffer = NULL;<br /><br />　　 渲染到纹理能让你做很多事情，但是你必须注意一些限制。首先深度缓冲区必须总是大于或等于渲染对象的大小。此外，渲染对象和深度缓冲区的格式必须一致。<img src ="http://www.cppblog.com/mybios/aggbug/15271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 23:58 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】Shader Model 3 Using Vertex Texture 顶点纹理白皮书中文版</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15270.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 15:57:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15270.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15270.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15270.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15270.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Shader Model 3														Using Vertex Texture 																										顶点纹理白皮书中文版																																																											...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/16/15270.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 23:57 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】那是什么鬼东西? Pick!!就是物件拾取！</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15256.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 11:57:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15256.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15256.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15256.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15256.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15256.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第九集 那是什么鬼东西														 												想起第一次面对StarCraft的主界面, 看到旋转的星球, 晃着脑袋的卫星, 				…				, 那是什么? 														 												想知道, 简单, 把鼠标移上去, 它会告诉你的Who am I.				...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/16/15256.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 19:57 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】泛型粒子系统的设计</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15255.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 11:53:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15255.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15255.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15255.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15255.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要：								本文阐述了如何利用				C++				的				Template				开发出方便组装，适合各种应用的　　泛型粒子系统，开发过程中使用到了				Boost.Mpl				和				Boost.Random				。																																								 ...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/16/15255.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 19:53 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】多重纹理的应用</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15227.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 08:33:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15227.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15227.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15227.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15227.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 多重纹理的混合会产生很多漂亮的效果, 这里我们来实现其中最基础的几种效果, dark &amp; light mapping, detail mapping, glow mapping.														 																		    								无奈于硬件(TNT2 32M 显卡)和模型的不足, 这集的例子只能为game7中...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/16/15227.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 16:33 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】《DirectX 9 3D 图形程序设计》 Tutorial 06 纹理贴图以及纹理坐标变换（纹理动画）</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15212.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 03:15:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15212.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15212.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15212.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15212.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15212.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1								#include 				&lt;				D3DX9.h				&gt;																		  2										#include 				&lt;				string				&gt;																		  3										typedef std::			...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/16/15212.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 11:15 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】《DirectX 9 3D 图形程序设计》 Tutorial 05 光照系统</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15211.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 03:09:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15211.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15211.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15211.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1								#include 				&lt;				D3DX9.h				&gt;																		  2										#include 				&lt;				string				&gt;																		  3										typedef std::			...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/16/15211.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 11:09 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】《DirectX 9 3D 图形程序设计》 Tutorial 04 矩阵变换</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15210.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15210.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15210.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15210.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15210.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1								#include 				&lt;				D3DX9.h				&gt;																		  2										#include 				&lt;				string				&gt;																		  3										typedef std::			...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/16/15210.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 11:03 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】《DirectX 9 3D 图形程序设计》 Tutorial 03 使用索引缓冲区</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15208.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 02:59:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15208.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15208.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15208.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15208.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 渲染之前记得g_pd3dDevice-&gt;SetIndices(g_pIB);而且要用g_pd3dDevice-&gt;DrawIndexedPrimitive来渲染索引缓冲区						  1								#include 				&lt;				D3DX9.h				&gt;																		  2										...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/16/15208.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 10:59 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】《DirectX 9 3D 图形程序设计》 Tutorial 02 创建顶点缓冲区容易犯错的地方</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15206.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 02:47:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15206.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15206.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15206.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15206.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 13行，#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)是使用变换过的顶点格式，意思是在执行渲染流水线的过程中，不作顶点变换。换言之，可以直接用屏幕象素的单位大小来定义顶点的坐标。再换言之，就是说用这种顶点格式，可以简单的实现Overlay（不知道怎么翻译这个单词）						  1								#inclu...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/11/16/15206.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/15206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 10:47 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】《DirectX 9 3D 图形程序设计》 Tutorial 01 容易犯错的地方</title><link>http://www.cppblog.com/mybios/archive/2006/11/16/15205.html</link><dc:creator>李锦俊(mybios)</dc:creator><author>李锦俊(mybios)</author><pubDate>Thu, 16 Nov 2006 02:38:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/11/16/15205.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/15205.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/11/16/15205.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/15205.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/15205.html</trackback:ping><description><![CDATA[手写Tutorial 01例子是创建Windows窗口，并创建D3D设备。<br /><br /><br />97行，PeekMessage(&amp;msg , 0 , 0 , 0 , PM_REMOVE)第二个参数如果改成PeekMessage(&amp;msg , hWnd , 0 , 0 , PM_REMOVE)就会出现无法退出程序的问题！请注意！<br /><br />44行，g_pd3dDevice-&gt;Present(0 , 0 , 0 , 0);这句话千万不要漏掉哦！否则就会显示花瓶！<br /><br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">  1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">d3dx9.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">  2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">  3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> SAFE_RELEASE(o) {if(o){o-&gt;Release();o=0;}}</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">  4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">  5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />LPDIRECT3D9 g_pD3D </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">  6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />LPDIRECT3DDEVICE9 g_pd3dDevice </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">  7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">  8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建D3D设备</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">  9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">HRESULT InitD3D(HWND hWnd)<br /></span><span style="COLOR: #008080"> 10</span><span style="COLOR: #000000"><img id="Codehighlighter1_171_767_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_767_Open_Text.style.display='none'; Codehighlighter1_171_767_Closed_Image.style.display='inline'; Codehighlighter1_171_767_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_171_767_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_767_Closed_Text.style.display='none'; Codehighlighter1_171_767_Open_Image.style.display='inline'; Codehighlighter1_171_767_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_171_767_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_171_767_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建D3D SDK</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 12</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(NULL </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> (g_pD3D </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Direct3DCreate9(D3D_SDK_VERSION)))<br /></span><span style="COLOR: #008080"> 13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> E_FAIL;<br /></span><span style="COLOR: #008080"> 14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    D3DPRESENT_PARAMETERS d3dpp;<br /></span><span style="COLOR: #008080"> 17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    memset(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">d3dpp , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(d3dpp));<br /></span><span style="COLOR: #008080"> 18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    d3dpp.Windowed </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    d3dpp.BackBufferFormat </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> D3DFMT_UNKNOWN;<br /></span><span style="COLOR: #008080"> 20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    d3dpp.SwapEffect </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> D3DSWAPEFFECT_DISCARD;<br /></span><span style="COLOR: #008080"> 21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    RECT rect;<br /></span><span style="COLOR: #008080"> 23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    GetClientRect(hWnd , </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rect);<br /></span><span style="COLOR: #008080"> 24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    d3dpp.BackBufferWidth </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> rect.right </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> rect.left;<br /></span><span style="COLOR: #008080"> 25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    d3dpp.BackBufferHeight </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> rect.bottom </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> rect.top;<br /></span><span style="COLOR: #008080"> 26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(g_pD3D</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateDevice(D3DADAPTER_DEFAULT<br /></span><span style="COLOR: #008080"> 28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        , D3DDEVTYPE_HAL<br /></span><span style="COLOR: #008080"> 29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        , hWnd<br /></span><span style="COLOR: #008080"> 30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        , D3DCREATE_HARDWARE_VERTEXPROCESSING<br /></span><span style="COLOR: #008080"> 31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        , </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">d3dpp , </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">g_pd3dDevice<br /></span><span style="COLOR: #008080"> 32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        )))<br /></span><span style="COLOR: #008080"> 33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> E_FAIL;<br /></span><span style="COLOR: #008080"> 34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /></span><span style="COLOR: #008080"> 35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> S_OK;<br /></span><span style="COLOR: #008080"> 36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 38</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 渲染</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 39</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Render()<br /></span><span style="COLOR: #008080"> 40</span><span style="COLOR: #000000"><img id="Codehighlighter1_790_935_Open_Image" onclick="this.style.display='none'; Codehighlighter1_790_935_Open_Text.style.display='none'; Codehighlighter1_790_935_Closed_Image.style.display='inline'; Codehighlighter1_790_935_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_790_935_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_790_935_Closed_Text.style.display='none'; Codehighlighter1_790_935_Open_Image.style.display='inline'; Codehighlighter1_790_935_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_790_935_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_790_935_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 清空成蓝色</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 42</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    g_pd3dDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Clear(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , D3DCLEAR_TARGET , D3DCOLOR_XRGB(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">255</span><span style="COLOR: #000000">) , </span><span style="COLOR: #000000">1.0f</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 显示</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 44</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    g_pd3dDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Present(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 46</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 47</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 清除占有的内存</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 48</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> CleanUp()<br /></span><span style="COLOR: #008080"> 49</span><span style="COLOR: #000000"><img id="Codehighlighter1_964_989_Open_Image" onclick="this.style.display='none'; Codehighlighter1_964_989_Open_Text.style.display='none'; Codehighlighter1_964_989_Closed_Image.style.display='inline'; Codehighlighter1_964_989_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_964_989_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_964_989_Closed_Text.style.display='none'; Codehighlighter1_964_989_Open_Image.style.display='inline'; Codehighlighter1_964_989_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_964_989_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_964_989_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 50</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    SAFE_RELEASE(g_pD3D);<br /></span><span style="COLOR: #008080"> 51</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 52</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 53</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 消息处理</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 54</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">LRESULT WINAPI MsgProc(HWND hWnd , UINT message , WPARAM wParam , LPARAM lParam)<br /></span><span style="COLOR: #008080"> 55</span><span style="COLOR: #000000"><img id="Codehighlighter1_1081_1255_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1081_1255_Open_Text.style.display='none'; Codehighlighter1_1081_1255_Closed_Image.style.display='inline'; Codehighlighter1_1081_1255_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1081_1255_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1081_1255_Closed_Text.style.display='none'; Codehighlighter1_1081_1255_Open_Image.style.display='inline'; Codehighlighter1_1081_1255_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_1081_1255_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_1081_1255_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 56</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(message)<br /></span><span style="COLOR: #008080"> 57</span><span style="COLOR: #000000"><img id="Codehighlighter1_1101_1197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1101_1197_Open_Text.style.display='none'; Codehighlighter1_1101_1197_Closed_Image.style.display='inline'; Codehighlighter1_1101_1197_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1101_1197_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1101_1197_Closed_Text.style.display='none'; Codehighlighter1_1101_1197_Open_Image.style.display='inline'; Codehighlighter1_1101_1197_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_1101_1197_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_1101_1197_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 58</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> WM_DESTROY:<br /></span><span style="COLOR: #008080"> 59</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        CleanUp();<br /></span><span style="COLOR: #008080"> 60</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        PostQuitMessage(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 61</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 62</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 63</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">:<br /></span><span style="COLOR: #008080"> 64</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 65</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 66</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> DefWindowProc(hWnd, message , wParam , lParam);<br /></span><span style="COLOR: #008080"> 67</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 68</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 69</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Windows入口</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 70</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> WINAPI WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nShowCmd)<br /></span><span style="COLOR: #008080"> 71</span><span style="COLOR: #000000"><img id="Codehighlighter1_1379_2208_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1379_2208_Open_Text.style.display='none'; Codehighlighter1_1379_2208_Closed_Image.style.display='inline'; Codehighlighter1_1379_2208_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1379_2208_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1379_2208_Closed_Text.style.display='none'; Codehighlighter1_1379_2208_Open_Image.style.display='inline'; Codehighlighter1_1379_2208_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_1379_2208_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_1379_2208_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 72</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    WNDCLASS wndClass;<br /></span><span style="COLOR: #008080"> 73</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    memset(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">wndClass , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(wndClass));<br /></span><span style="COLOR: #008080"> 74</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    wndClass.hInstance </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hInstance;<br /></span><span style="COLOR: #008080"> 75</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    wndClass.lpszClassName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Tutorial01</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 76</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    wndClass.style </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 77</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    wndClass.lpfnWndProc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> MsgProc;<br /></span><span style="COLOR: #008080"> 78</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 注册窗口类</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 79</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    RegisterClass(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">wndClass);<br /></span><span style="COLOR: #008080"> 80</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 81</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创建窗口</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 82</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    HWND hWnd </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> CreateWindow(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Tutorial01</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Tutorial01 : CreateDevice</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> , WS_OVERLAPPEDWINDOW <br /></span><span style="COLOR: #008080"> 83</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">512</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">512</span><span style="COLOR: #000000"> , GetDesktopWindow()<br /></span><span style="COLOR: #008080"> 84</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , wndClass.hInstance , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 85</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 86</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 显示窗口</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 87</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    ShowWindow(hWnd , SW_SHOWDEFAULT);<br /></span><span style="COLOR: #008080"> 88</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    UpdateWindow(hWnd);<br /></span><span style="COLOR: #008080"> 89</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 90</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(SUCCEEDED(InitD3D(hWnd)))<br /></span><span style="COLOR: #008080"> 91</span><span style="COLOR: #000000"><img id="Codehighlighter1_1885_2129_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1885_2129_Open_Text.style.display='none'; Codehighlighter1_1885_2129_Closed_Image.style.display='inline'; Codehighlighter1_1885_2129_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1885_2129_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1885_2129_Closed_Text.style.display='none'; Codehighlighter1_1885_2129_Open_Image.style.display='inline'; Codehighlighter1_1885_2129_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_1885_2129_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_1885_2129_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 92</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 消息循环</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 93</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        MSG msg;<br /></span><span style="COLOR: #008080"> 94</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        memset(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(msg));<br /></span><span style="COLOR: #008080"> 95</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(msg.message </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> WM_QUIT)<br /></span><span style="COLOR: #008080"> 96</span><span style="COLOR: #000000"><img id="Codehighlighter1_1976_2126_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1976_2126_Open_Text.style.display='none'; Codehighlighter1_1976_2126_Closed_Image.style.display='inline'; Codehighlighter1_1976_2126_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1976_2126_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1976_2126_Closed_Text.style.display='none'; Codehighlighter1_1976_2126_Open_Image.style.display='inline'; Codehighlighter1_1976_2126_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_1976_2126_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_1976_2126_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 97</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(PeekMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> , PM_REMOVE))<br /></span><span style="COLOR: #008080"> 98</span><span style="COLOR: #000000"><img id="Codehighlighter1_2030_2090_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2030_2090_Open_Text.style.display='none'; Codehighlighter1_2030_2090_Closed_Image.style.display='inline'; Codehighlighter1_2030_2090_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2030_2090_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2030_2090_Closed_Text.style.display='none'; Codehighlighter1_2030_2090_Open_Image.style.display='inline'; Codehighlighter1_2030_2090_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span id="Codehighlighter1_2030_2090_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_2030_2090_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 99</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                DispatchMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg);<br /></span><span style="COLOR: #008080">100</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                TranslateMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg);<br /></span><span style="COLOR: #008080">101</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">102</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">103</span><span style="COLOR: #000000"><img id="Codehighlighter1_2103_2122_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2103_2122_Open_Text.style.display='none'; Codehighlighter1_2103_2122_Closed_Image.style.display='inline'; Codehighlighter1_2103_2122_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2103_2122_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2103_2122_Closed_Text.style.display='none'; Codehighlighter1_2103_2122_Open_Image.style.display='inline'; Codehighlighter1_2103_2122_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span id="Codehighlighter1_2103_2122_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_2103_2122_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">104</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                Render();<br /></span><span style="COLOR: #008080">105</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">106</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">107</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">108</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">109</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    CleanUp();<br /></span><span style="COLOR: #008080">110</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    UnregisterClass(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Tutorial01</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> , wndClass.hInstance);<br /></span><span style="COLOR: #008080">111</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">112</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">113</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">114</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">115</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><img src ="http://www.cppblog.com/mybios/aggbug/15205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊(mybios)</a> 2006-11-16 10:38 <a href="http://www.cppblog.com/mybios/archive/2006/11/16/15205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>