??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产精品18久久久久久,久久e热在这里只有国产中文精品99,一本久道久久综合狠狠爱http://www.shnenglu.com/mybios/category/3031.html游戏开?C++ Cocos2d-x OpenGL DirectX 数学 计算机图形学 SQL Server <BR> <BR>zh-cnFri, 15 Jul 2016 05:23:01 GMTFri, 15 Jul 2016 05:23:01 GMT60Ogre 的渲染到U理的关键的3个步?/title><link>http://www.shnenglu.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.shnenglu.com/mybios/archive/2007/12/27/39764.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/39764.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2007/12/27/39764.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/39764.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/39764.html</trackback:ping><description><![CDATA[<p>好久没写技术的东西了。现在辗转间又回C深圳工作Q还是做我喜Ƣ的游戏开发。奉献点东西l大家?/p> <p><br />1、创建渲染目标纹理,关键要指定TU_RENDERTARGET参数Q在创徏q个渲染目标U理的过E中QOgre会自动调?nbsp; Root::getSingleton().getRenderSystem()->attachRenderTarget把这个纹理添加到Root的渲染目标中Q也是说每帧都会渲染到q个U理?br />TexturePtr texture = TextureManager::getSingleton().createManual( "RttTex", <br /> ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, <br /> 512, 512, 0, PF_R8G8B8, TU_RENDERTARGET );</p> <p>2、获得渲染目标,有了渲染目标Q才能给目标指定视口和摄像机<br />RenderTarget *rttTex = texture->getBuffer()->getRenderTarget();</p> <p>3、给q个渲染目标指定摄像机,做了q步骤之后,每更新时就会把q个摄像机看到的东西渲染到texture?br />Viewport *v = rttTex->addViewport( mReflectCam );</p> <p>4、OKQ?/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;">如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/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;">不如打赏我一杯咖啡,鼓励我l分享优U的文章?br /><img src="http://www.shnenglu.com/images/cppblog_com/mybios/222.jpg" border="0" alt="" /><br /><br /><br /><br /></p><img src ="http://www.shnenglu.com/mybios/aggbug/39764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2007-12-27 21:06 <a href="http://www.shnenglu.com/mybios/archive/2007/12/27/39764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>g兼容性的陷阱QDrawIndexedPrimitiveUP的用?/title><link>http://www.shnenglu.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.shnenglu.com/mybios/archive/2006/12/25/16840.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/16840.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/12/25/16840.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/16840.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/16840.html</trackback:ping><description><![CDATA[好好的一个程序,在我的电脑(ELSA X800 256M昑֍Q上q行一切正常,拿到别的电脑Q?45G内置昑֍Q上。啊。花屏~~赶快调试,q好公司的电脑也有这U内|显卡的电脑。赶快用q程调试。谁知这一调试Q就׃我整整一个上午。。。赶快写下来。。?br /><br />最l排差的原因是DrawIndexedPrimitiveUP最后一个参?em>VertexStreamZeroStride</em> Q这个参数是用来指定点所占的字节数。我自作聪明的把点l构后增加了一个自q的数据,如:正常的顶点结?br />struct CUSTOMVERTEX<br />{<br /> FLOAT x, y, z,rhw;<br /> DWORD color;<br /> float u,v;<br />};<br /><br />我改了之后的点l构Q?br />struct CUSTOMVERTEX<br />{<br /> FLOAT x, y, z,rhw;<br /> DWORD color;<br /> float u,v;<br />DWORD dwMyData; // 用来保存我自q的数?br />};<br /><br />l果Q在我的昑֍上一切正常,q个数据也有用,然后DrawIndexedPrimitiveUP的时候,也会Ҏ最后的参数sizeof(CUSTOMVERTEX)利的读取相应的点。但是,拿到845G的内|显卡上死z花屏。后来终于知道是q个原因Q于是解军_法就是把dwMyDataLQ放到顶点结构外面去?br /><br />Z说说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个顶点组成,然后通过点索引来达到渲?个三角Ş的效果,那么q里应该填?Q而不?Q?/b><br />  <b>UINT</b><i>PrimitiveCount</i><b>, // 要渲染的囑֎的数量(如一个矩形,׃个三角Şl成Q就应该填写2Q?/b><br />  <b>CONST void *</b><i>pIndexData</i><b>, // 索引数据指针</b><br />  <b>D3DFORMAT</b><i>IndexDataFormat</i><strong>, // 索引数据格式Q一般ؓD3DFMT_INDEX16或D3DFMT_INDEX32</strong> <br />  <b>CONST void*</b><i>pVertexStreamZeroData</i><b>, // 点数据指针</b><br />  <b>UINT</b><i>VertexStreamZeroStride // 点大小一般ؓsizeof(点l构)</i><br /><b>);</b><br /><br />记得默认情况下渲染三角Ş的顺序是逆时针的Q初学者经常范q个错误Q本来想渲染一个矩形,l果一个三角Ş时间、另一个三角Ş逆时针,l果渲染出来只看C个三角Ş了,被背面剔除掉了)?br /><img src ="http://www.shnenglu.com/mybios/aggbug/16840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-12-25 15:11 <a href="http://www.shnenglu.com/mybios/archive/2006/12/25/16840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>点声明http://www.shnenglu.com/mybios/archive/2006/12/02/15891.html李锦?mybios)李锦?mybios)Sat, 02 Dec 2006 08:42:00 GMThttp://www.shnenglu.com/mybios/archive/2006/12/02/15891.htmlhttp://www.shnenglu.com/mybios/comments/15891.htmlhttp://www.shnenglu.com/mybios/archive/2006/12/02/15891.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15891.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15891.html阅读全文

李锦?mybios) 2006-12-02 16:42 发表评论
]]>
【{贴】DXUT~程指南(?:通过DXUT使用讑֤http://www.shnenglu.com/mybios/archive/2006/11/22/15531.html李锦?mybios)李锦?mybios)Wed, 22 Nov 2006 03:35:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/22/15531.htmlhttp://www.shnenglu.com/mybios/comments/15531.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/22/15531.html#Feedback1http://www.shnenglu.com/mybios/comments/commentRss/15531.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15531.html 通过DXUT使用讑֤
DirectX讑֤的创建在DXUT中得C改进。你可以让你的应用程序直接创备而其它有框架提供的特征仍然可用?br />创徏讑֤
选择最佳的讑֤讄
修改可用的设备设|?br />降ؓ软g点处理
使用你自q讑֤

创徏讑֤
典型圎ͼ你将通过标准的Direct3DҎ创徏讑֤
HRESULT CreateDevice(
    UINT                  Adapter,
    D3DDEVTYPE            DeviceType,
    HWND                  hFocusWindow,
    DWORD                 BehaviorFlags,
    D3DPRESENT_PARAMETERS *pPresentationParameters,
    IDirect3DDevice9      **ppReturnedDeviceInterface
);
q个Ҏ需要有效的适配器,讑֤cd(HAL or REF),H口句柄Q行为标?software/hardware vertex processing 和其它驱动标?Q以及呈现参?presentation parameters).此外QD3DPRESENT_PARAMETERl构体还拥有大量的成员指定后备缓冲区Q多重采栯定,交换效果Q窗口模式,深度模版~冲Q刷新率Q呈现间隔,以及呈现标志?br />为所有这些参数选择有效的设定是h挑战性的。框枉过DXUTCreateDevice函数化了q一选择q程?br />HRESULT DXUTCreateDevice(
    UINT AdapterOrdinal  = D3DADAPTER_DEFAULT,
    BOOL bWindowed       = TRUE,
    INT nSuggestedWidth  = 640,
    INT nSuggestedHeight = 480,
    LPDXUTCALLBACKISDEVICEACCEPTABLE pCallbackIsDeviceAcceptable     = NULL,
    LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallbackModifyDeviceSettings = NULL
);
最基本的用法是全部使用~省参数调用Q?br />DXUTCreateDevice();
通过q样的调用框架用缺省设|创Z个在大多数情况下可用的设备。缺省的讄如下Q?br />

Direct3D Creation Flag Description Default Value from DXUTCreateDevice
AdapterFormat parameter of CheckDeviceFormat Adapter surface format. Desktop display mode, or D3DFMT_X8R8G8B8 if the desktop display mode is less than 32 bits.
Adapter parameter of IDirect3D9::CreateDevice Display adapter ordinal. D3DADAPTER_DEFAULT
D3DPRESENT_PARAMETERS. BackBufferCount Number of back buffers. 2, indicating triple buffering.
D3DPRESENT_PARAMETERS. BackBufferFormat Back buffer format. Desktop display mode, or D3DFMT_X8R8G8B8 if the desktop display mode is less than 32 bits.
D3DPRESENT_PARAMETERS. AutoDepthStencilFormat Depth format of the automatic depth-stencil surface that the device will create. D3DFMT_D16 if the backbuffer format is 16 bits or less, or D3DFMT_D32 otherwise.
The DeviceType parameter of IDirect3D9::CreateDevice Enumerated type of the device. D3DDEVTYPE_HAL if available, otherwise D3DDEVTYPE_REF or failure code if neither is available.
D3DPRESENT_PARAMETERS. MultiSampleQuality Quality level. MultiSampleQuality = 0, indicating multisampling is disabled.
D3DPRESENT_PARAMETERS. Flags Presentation parameters flags. D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
D3DPRESENT_PARAMETERS. PresentationInterval Presentation interval. D3DPRESENT_INTERVAL_IMMEDIATE for windowed mode, or D3DPRESENT_INTERVAL_DEFAULT for full-screen mode.
D3DPRESENT_PARAMETERS. FullScreen_RefreshRateInHz Rate at which the display adapter refreshes the screen. 0, indicating windowed mode.
D3DPRESENT_PARAMETERS. BackBufferWidth and .BackBufferHeight Display mode resolution. 640 x 480 pixels for windowed mode, or the desktop resolution for full-screen mode.
D3DPRESENT_PARAMETERS. AutoDepthStencilFormat Stencil format of the automatic depth-stencil surface that the device will create. D3DFMT_D16 if the backbuffer format is 16 bits or less, or D3DFMT_D32 otherwise.
D3DPRESENT_PARAMETERS. SwapEffect Swap effect. D3DSWAPEFFECT_DISCARD
BehaviorFlags parameter of IDirect3D9::CreateDevice Vertex processing flags. D3DCREATE_HARDWARE_VERTEXPROCESSING if supported, otherwise D3DCREATE_SOFTWARE_VERTEXPROCESSING.
D3DPRESENT_PARAMETERS. Windowed Windowed or full-screen mode. true, indicating windowed mode.
hFocusWindow parameter of CreateDevice Handle to the created window (see Using Application Windows with DXUT). hWndFocus parameter of DXUTSetWindow
D3DPRESENT_PARAMETERS. hDeviceWindow Handle to the device window. hWndDeviceFullScreen or hWndDeviceWindowed parameters of DXUTSetWindow
D3DPRESENT_PARAMETERS. EnableAutoDepthStencil Depth-stencil buffer creation flag. true.

应用E序可以通过参数传递给CreateDevice来更多的控制讑֤的创建,q将比用缺省的方式更好。例如,你可以通过nSuggestedWidth and nSuggestedHeight参数改变H口的尺寸?br />DXUTCreateDevice(
    D3DADAPTER_DEFAULT,
    false,
    1024,
    786,
    NULL,
    NULL,
    NULL
);
要得到更多的控制权,应用E序可以使用q两个可选的回调函数QLPDXUTCALLBACKISDEVICEACCEPTABLE and LPDXUTCALLBACKMODIFYDEVICESETTINGS.

选择最佳的讑֤讄
你可以用IsDeviceAcceptable回调函数帮助框架Z的应用程序选择最佳的讑֤讄Q就像下面的代码Q?br />bool CALLBACK IsDeviceAcceptable(
D3DCAPS9*     pCaps,
D3DFORMAT     AdapterFormat,
D3DFORMAT     BackBufferFormat,
bool          bWindowed,
void*         pUserContext )
{
    // TODO: return true for acceptable settings and false otherwise.
    return true;
}
q个回调函数的模型基于LPDXUTCALLBACKISDEVICEACCEPTABLE原型(This callback function is modeled on the prototype LPDXUTCALLBACKISDEVICEACCEPTABLE)Q框架ؓ每个唯一的以?个设|的有效l合调用q个函数一ơ:
D3DDEVTYPE DeviceType;
UINT       AdapterOrdinal;
D3DFORMAT  AdapterFormat;
D3DFORMAT  BackBufferFormat;
bool       Windowed;
注意适配器序号和讑֤cd没有直接的传入回调函敎ͼ而是分别作ؓD3DCAPS9l构体的成员?br />通过q个回调函数Q应用程序可以拒lQ何它不支持的或不惌的组合。例如,应用E序可以使用下面的代码拒l?6bits的后备缓冲区格式和所有至不能支持像素着色器PS_2_0的设备:
bool CALLBACK IsDeviceAcceptable(
    D3DCAPS9*     pCaps,
    D3DFORMAT     AdapterFormat,
    D3DFORMAT     BackBufferFormat,
    bool          bWindowed )
{
    if( pCaps->PixelShaderVersion < D3DPS_VERSION(2,0) )
     return false;
    if( BackBufferFormat == D3DFMT_X1R5G5B5 || BackBufferFormat == D3DFMT_R5G6B5 )
        return false;
    return true;
}

为每个唯一的组合调用回调函数后Q框架排列剩下的可用l合Qƈ选择它们当中最好的。排名较高的如下Q?br />D3DDEVTYPE_HALQ获取硬件加?br />如果应用E序以全屏模式显C,框架更趋向于使用匚w桌面格式的适配器格式,q样可以在全屏与H口之间快速切换。例外的是,如果桌面昄模式于32位,框架更趋向于D3DFMT_X8R8G8B8.
匚w适配器格式的后备~冲区格?br />在选择了这些排名高的组合后Q要创徏讑֤Q行为标志和呈现参数仍然是需要的。对于这些设|?Direct3D使用上面表中的缺省倹{?/p>

使用你自q讑֤
你没有必要依赖于框架来创建Direct3D讑֤。应用程序自己可以创备ƈ他传递给框架使用。就像应用程序可以覆盖框架的window creation 讄。简单的使用你想要的讄创徏一个设备,然后调用 DXUTSetDevice函数让框架在你的讑֤上渲染?br />注意Q如果应用程序创Z不依赖于框架的设备,那么应用E序也必dd@环执行完以后亲自的通过cleanup 释放讑֤接口?br />另请参阅
通过DXUT作更高的设备选择



李锦?mybios) 2006-11-22 11:35 发表评论
]]>
【{贴】EffectFrameworkhttp://www.shnenglu.com/mybios/archive/2006/11/20/15464.html李锦?mybios)李锦?mybios)Mon, 20 Nov 2006 08:54:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/20/15464.htmlhttp://www.shnenglu.com/mybios/comments/15464.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/20/15464.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15464.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15464.html Effect Framework

摘要

本文要介l了在DirectX 9 SDK中提供的Effect Framework支持Q以及DirectX FX文gl构和Microsoft Hight Level Shading Language的基本知识。本文假定读者对DirectX Graphics有一定了解,q正在学习DirectX Effect Framework。希望能够与各位读者共同探讨、切?

?

Effect的v?

在计机3l场景中Q物体表面的材质代表了其光学Ҏ。最单的材质可以表现为Diffuse颜色QSpecular颜色QEmissive颜色{信息的集合Q而ؓ了表现物体表面的l节Q可?在材质中加入一张纹理——这些就构成了最基本的材质信息。在以前的Direct3DE序中,q些信息可以直接传送给讑֤Q由讑֤自动Ҏ它们来计物体表面的光学效果。但是, 仅仅有这些基本的材质信息Q已l不以满游戏制作者的要求和游戏玩家的要求了——他们希望场景中的材质更加复杂,h更多的细节,更加逼真?

在Direct3D中,除了材质的概念,q存在一个渲染状态(Render StateQ的概念。在Direct3D Device中存在很多的渲染状态,它们可以在Direct3Dq行渲染时控制渲染的程和效 果,从而实现某些带有特效的材质。程序员可以通过IDirect3DDevice*::SetRenderState()Ҏ来设|这些状态。所有的渲染状态都是一些特定的数倹{对状态的讄可以通过?~码完成Q即在程序中调用SetRenderState()ҎQ将讄什么样的状态“写歠Z在E序里,但是q样做的~点是太不灉|了——如果想要实CU新的渲染状态,需要修?E序代码。所以更好的一U方法是ؓ了实现某一U特效材质的一些渲染状态D录到一个“效果文件”中Q通过在程序运行时d该文Ӟ从中分析些|q将它们作ؓ?数调用SetRenderState()。这P要想实现一U新的特效,只需修改“效果文件”而不用更改代码?

Direct3D SDK是通过Effect Framework来支持这U机制的。而前面所q的“效果文件”在Direct3D中是?.fx文g存在的。在fx文g中保存了为实现某一Ҏ的渲染状态,包括状态名 U和它们的对应倹{所以在9.0以前版本的DirectX中就已经有Effect Framework和FX文g了,早期的Effect Framework仅仅是ؓ了实现对渲染状态进行控制?但是随着计算机显C硬件技术的发展Q图形处理单元(GPUQ正在重复CPU所走过的\——新一代的GPU已经h了可~程Ҏ,E序员可以通过对GPU~写一D늨序来控制其渲染的 输出效果。这U程序一般称为ShaderE序。目前的ShaderE序分成两种QVertex Shader和Pixel Shader。Vertex Shader主要用于?l网格模型的每一个顶点进行处理,而Pixel Shader主要用于对要l制到屏q上的每一个象素进行处理。通过ShaderQ程序员可以制作出相当丰富的实时渲染效果?/font>

同CPU一P对GPU~程也是借助一定的~程语言来进行的? 在DirectX 8中,对GPU的编E是通过一U类g汇编的语aq行的。而在DirectX 9中,使用了一U类gC语言的高U语a——Microsoft High Level Shading Language (HLSL) ?/font>

无论使用什么语a对GPU~程Q都需要把~译好的ShaderE序输送到昑֍厅RDirect3D Device可以通过SetVertexShader()和SetPixelShader()来向昑֍输送ShaderE序。然而,?于Shader和材质具有十分紧密的关系——一般来_一个Shader是Z实现一U特D的材质——最好是能够ShaderE序与材质进行整合?所以,在DirectX 8和DirectX 9中,原来的Effect Framework发生了扩充——在原来的基上加入了对ShaderE序的支持。程序员可以把Vertex Shader和Pixel ShaderE序以函?的方式直接书写在FX文g中?/font>

 .FX文g

FX文g中的内容大致可以分成几部分:

  • 预编译标?
  • 变量?
  • l构定义
  • 函数
  • Technique

预编译标志:预编译标志包?

  • #define
  • #elif
  • #else
  • #endif
  • #error
  • #if
  • #ifdef
  • #ifndef
  • #include
  • #line
  • #pragma
  • #undef

其中最常用到的?include?defineQ同C语言中的意义很相|?include可以在一个FX文g中引入另外一个或多个文g?define可以定义FX文g中的宏替换。例如:

#include "helper_Funcs.fx"      //引入一个名为helper_funcs.fx的fx文g
#include "public_variables.fh" //引入一个名为public_variables.fh的文?/span>
#define MATRICES_COUNT 25      //定义宏MATRICES_COUNT?5
#define VSHADER VShader_2_0    //定义宏VSHADER为VShader_2_0

#include带来的好处和C中也是一LQ您可以在一个头文g中定义一些公有变量、函数等Q在其他文g中引用它们-׃用写很多遍了。例如:

文gpublic.fh:

mat4x4 matWorldViewProj; // 4x4世界Q视Q投影变换矩?/span>
float3 lightPosisiton;   // 三维光源位置向量
float4 lightColor;       // 光源的颜?/span>
float time;              // 当前旉

//定义一个名为VS_OUTPUT的结构。关于结构体定义Q下文中会有介绍

struct VS_INPUT
{
    float4 LocalPos : POSITION;
    float3 Normal : NORMAL;
    float4 Color : COLOR; 
    float2 Texcoord : TEXCOORD0;
};

struct VS_OUTPUT
{
    float4 WorldPos : POSITION;
    float4 Color : COLOR;
    float2 Texcoord : TEXCOORD0;
};

//定义一个名为CaculateWorldPosition的函数。关于函数定义,下文中会有介l?

float3 CaculateWorldPosition( float4 LocalPos )
{
    return mul( LocalPos, matWorldViewProj);
}

q样Q当我们在另外一个文件中includeq个头文件时Q上面所有的定义都可以直接用了?

文gclient.fx:

#include "public.fh"


VS_OUTPUT VS_main( VS_INPUT In ) // 可以直接使用l构体定义VS_OUTPUT和VS_INPUT
{
    VS_OUTPUT Out = 0;
    Out.WorldPos = CaculateWorldPosition( In.LocalPos ); // 可以直接使用函数
    Out.Color = In.Color;
    Out.Texcoord = In.Texcoord;
}

 

q样不仅可以复用代码Q还可以使变量名、结构体、函数名的定义统一?

?define不仅仅可以某些帔Rh比较有意义的名称Q通过?ifdefQ?ifndef, #else, #endif{结合用,q可以用来根据一些配|控制编译过E?

变量?/p>

每个FX文g都可以有若干参数变量Q通过Effect Framework可以在程序中识别些参数的cd、名U和用途,q样可以将E序中的一些参数输送到Effect中去Q从而更加灵z?的控制效果。参数的cd很多Q可以是int, float, matrix, texture{等。例如:

matrix matWorld;    //定义一个名为matWorld的矩늱型参数变?/span>
float time;         //定义一个名为time的Q点类型参数变?
texture texDiffuse; //定义一个名为texDiffuse的纹理类型参数变?/span>

 

另外Q每个变量还有前~修饰W、Semantic、Annotation{,限于幅Q在q里不再赘述Q具体的介绍请参考DirectX C++帮助文档的DirectX Graphics > Reference > HLSL Shader Reference > Variable Declaration Syntax条目?

l构定义

在FX文g中可以定义结构体Q这些结构体一般用于Shader函数的参数和q回倹{结构体的定义与C语言方式及其cMQ例如:

struct VS_OUTPUT //l构名称
{
    float4 Pos : POSITION; //成员变量?/span>
    float4 Color : COLOR;
    float2 Texcoord : TEXCOORD0;
};

 

上面每个成员变量后面的标识符是该变量的semanticQHLSL~译器根据这个标识符来确定该变量的用处。不一定非得是l构体成员变量才有semanticQ一般来说Shader的输入输出参数变量都可以有semantic?/p>

函数

函数部分是在Effect Framework加入了对Vertex Shader和Pixel Shader的扩充后才加入到FX文g中的。FX文g中的函数的内容可以用汇编形式书写Q也可以用HLSL~写。目前一?都是使用HLSL。用q种语言书写的函CC语言函数十分cMQ可以说Q只要学qC语言Q书写Shader函数qԒl有余了。在同一个fx文g中可以定义很多函敎ͼ在函C也可以互 相调用,但是最lShaderE序的入口将在fx文g的Technique部分中指定。对于哪个函数是Vertex shader函数Q哪个是Pixel shader函数Q也是在Technique中指定的。关于TechniqueQ将在下文中介绍?例子Q?

float4 CalcDiffuseColor( float3 Normal )
{
    float4 Color; ...//用于实现该函数功能的多条语句
    return Color;
}

VS_OUTPUT Vertex_Shader( float4 InPos : POSITION,
                         float3 InNor : NORMAL, 
                         float3 InTexcoord : TEXCOORD )
{
    VS_OUTPUT Out; ...//用于实现该函数功能的多条语句
    Out.Color = CalcDiffuseColor(InNor); //函数调用
    return Out;
}

 

正如上文中所_ShaderE序分ؓ两种QVertex shader和Pixel shader。在fx函数中就有两U相应的函数QVertex shader函数和Pixel Shader函数。Vertex shader函数的输入参数是|格模型中的每一个顶Ҏ据,其输出是l过该函数特D处理的点数据Q而Pixel Shader函数的输入,则是l过g光栅化过E后l过插值的Vertex shader输出l果。至于Pixel shader的输出,一般就是经q该函数计算得到的一个颜色|卌d后备~冲中一个象素上的颜色倹{但是这个“颜色值”有时ƈ不一定代表颜艌Ӏ而且对于支持多RenderTarget的硬ӞPixel shaderq可以有多个输出Q分别对应不同的RenderTarget?/p>

technique

technique是FX文g的主体,是真正设|各U渲染状态的地方Q也是指定所使用的ShaderE序入口的地斏V在理解Technique前首先要理解Pass的概cPass是Technique的组成部?Q一个Pass׃表了l制时的一遍。通常Z辑ֈ一U效果,仅仅l制一遍网格模型是不够的,需要向framebuffer中多ơ绘Ӟq利用设|渲染状态中的BlendStateq行Alpha混合。这是l常提到的“Muli-pass Rendering”。但是随着g来强大,ShaderE序的功能越来越强,目前的趋势是所有的Ҏ材质都将可以用越来越个Pass来完成?一个technique中,可以存在一个或多个PassQ但是至要有一个Pass时该technique才会起实际作用。当存在多个passӞ默认情况下在渲染时将会按照pass在文件中的前后顺?作ؓ渲染时的前后序。technique和Pass中的内容都是以大括号括v来?

technique的例子:

technique Tec_Shader_1_X //定义一个名为Tec_Shader_1_X的technique
{
    pass P0 //一个名为P0的pass
    {
        VertexShader = compile vs_1_1 Vertex_Shader(); //讄Vertex ShaderE序入口函数
        PixelShader = compile ps_1_1 Pixel_Shader();   //讄Pixel ShaderE序入口函数
        AlphaBlendEnable= true;                        //讄渲染状态      ?
        SrcBlend = SrcAlpha;  
        DestBlend = InvSrcAlpha; 
        ... //其他讄
    }
    pass P1 //一个名为P1的pass
    {
        ...
    }
}

 

ID3DXEffect接口

上面介绍了很多fx文g相关内容Q但是在E序中如何读取和分析q些fx文g呢?在程序中对于dfx文gQ控制渲染状态、设|ShaderE序{工作都是通过D3DX库中的ID3DXEffect接口来实现的。ID3DXEffect接口提供了大量的ҎQ基本上分ؓ几个斚wQ?

  • 获得Effect参数变量信息
  • 讄Effect参数变量
  • 获得technique信息
  • 讄当前使用的technique
  • 开始和l束使用当前的technique
  • 执行一个passQ渲染绘刉Q?

ID3DXEffect接口的创建: 通过D3DX库中的D3DXCreateEffectFromFile()函数Q可以根据一个指定的文g的内Ҏ创徏一个ID3DXEffect接口。在该函数执行成功后Q所创徏的接口中包含了文g里所对应?所有内容,包括参数变量表、ShaderE序、technique和pass{?

ID3DXEffect接口的用: 通过该接口的Ҏ可以获得FX文g中的所有信息,q设|参数变量和当前的technique。所有的参数变量、technique、pass、shader{等都有自己的名UͼҎq些名称Q通过调用ID3DXEffect::GetParameterByName()、ID3DXEffect::GetTechniqueByName()和ID3DXEffect::GetPassByName(){方法就可以获得q些对象的句柄,从而在调用 ID3DXEFFECT::Set***()q行讄时用句柄而不是字W串q行索引来提高效率?/p>

通过ID3DXEffect::GetParameterDesc()、ID3DXEffect::GetTechniqueDesc()和GetPassDecs{方 法可以获得关于指定对象的所有细节描qC息?D3DX库中定义了一个D3DXPARAMETER_DESCl构来专门表C参数的cd。通过ID3DXEffect::GetParameterDesc()ҎQ可以ؓ一个参数获得这样一个结构的数据?

typedef struct _D3DXPARAMETER_DESC
{
    LPCSTR Name;               //参数变量?
    LPCSTR Semantic;           //参数变量的Semantic
    D3DXPARAMETER_CLASS Class; //参数变量的类别,可以是标量、矢量、矩c对象和l构
    D3DXPARAMETER_TYPE Type;   //参数变量的类?
    UINT Rows;                 //数组型参数的行数
    UINT Columns;              //数组型参数的列数
    UINT Elements;             //数组中的元素个数
    UINT Annotations;          //参数变量的Annotation个数
    UINT StructMembers;        //l构型参数变量成员的个数
    DWORD Flags;               //参数属?
    UINT Bytes;                //参数大小Q以字节?
} D3DXPARAMETER_DESC;

 

其中的参数类型可以有下列几种Q?

typedef enum _D3DXPARAMETER_TYPE
{
    D3DXPT_VOID, //Void型指?
    D3DXPT_BOOL, //Bool?
    D3DXPT_INT, //整型
    D3DXPT_FLOAT, //点?
    D3DXPT_STRING, //字符?
    D3DXPT_TEXTURE, //U理
    D3DXPT_TEXTURE1D, //一l纹?
    D3DXPT_TEXTURE2D, //二维U理
    D3DXPT_TEXTURE3D, //三维U理
    D3DXPT_TEXTURECUBE, //立方体环境纹?
    D3DXPT_SAMPLER, //U理取样?
    D3DXPT_SAMPLER1D, //一l纹理取样器
    D3DXPT_SAMPLER2D, //二维U理取样?
    D3DXPT_SAMPLER3D, //三维U理取样?
    D3DXPT_SAMPLERCUBE, //立方体环境纹理取样器
    D3DXPT_PIXELSHADER, //Pixel ShaderE序
    D3DXPT_VERTEXSHADER, //Vertex ShaderE序
    D3DXPT_PIXELFRAGMENT, //Pixel Shader片断
    D3DXPT_VERTEXFRAGMENT, //Vertex Shader片断
    D3DXPT_FORCE_DWORD = 0x7fffffff
} D3DXPARAMETER_TYPE;

 

而真正要让Effect起作用,需要在l制|格模型前后调用ID3DXEffect::BeginPass()和EndPassҎ。在调用q两个函C前和之后Q还需调用ID3DXEffect::Begin()?ID3DXEffect::End()Ҏ来界定此ơEffect讄的v止。大致的形式如下Q?

LPD3DXEffect pd3dEffectQ?span class="unnamed1"> //ID3DXEffect接口指针
... //初始化该指针
... //E序中的其他部分
...

UINT numPasses; //用于接受当前所使用的technique中的pass个数
pd3dEffect->Begin( & numPasses, 0 ) //开始用当前的technique
for( UINT iPass = 0; iPass < numPasses; iPass ++ )
{
    //遍历所有的pass
    pd3dEffect->BeginPass( iPass ); //调用BeginPass
    DrawMesh();                     //然后q行模型的绘制?
    pd3dEffect->EndPass();          //调用EndPass
}
pd3dEffect->End();                  //不要忘记l束当前technique

 

3DS MAX对DirectX 9 Shader Material的支持;Effect数据获取和导?/strong>

在FX文g中的参数Q大部分都是用来调整FX文g所指定的Effect的一些细节,例如Q一U带有凹凸纹理的效果Q可能在FX中就有一个参数控制着凹凸不^的程度。而这些参数是需要由工来调整的。另外,工也需要有一个途径能够FX文g定义的Effect赋予C个模型或它的一部分上去。同时美工也应该能够实时的预览该Effect在模型上的实际效果?在以前,实现q些要求只能通过自制效果预览器、模型编辑器或者ؓDCC软g~写插g来完成。这对于的工作l和工期较短的项目来说是非常困难的。幸q的是,目前的DCC软g 已经开始ؓ游戏制作提供丰富的支持功能。通过DCC软g自n可以预览到实时Effect的效果,q调整其参数。在《龙的传说》这个项目中Q我们?DS MAX 6.0来作为模型徏?工具和Shader预览工具?

?DS MAX 6.0中,新加入了一U材质类型——DirectX 9 Shader材质。这U材质是ZFX文g的。一个FX文g可以代表一U材质。它可以同MAX中的其他材质一栯予到模型?。在MAX的Viewport中可以实时地观察到FX文g中设计的效果。通过为FX中的参数讄特定的SemanticQ可以将q些参数与MAX中的场景信息联系hQ如摄像Z|、世界变换矩 늭。对于控制Effect效果的一些本地参敎ͼ可以通过为它们添加特定的AnnotationQMAX能够直接识别q些参数q在用户界面中显C它们的名称和调节控件。对应不同类型的?敎ͼMAX可以为它们生成不同的调节控g。这Pq种材质和MAX的其他材质一P可以更改U理{等的参C?对于工来说Q通过q种用户界面可以调整该FX材质的参数达到最好的效果?/p>

但是工所调整的结果必要能够保存下来才有意义。这个工作就得由E序员来完成了。要保存3DS MAX中编辑的所有内容,需要ؓ3DS MAX~写文g导出插gQ将其内部数据保存在特定格式的文件中。在《龙的传说》这个项目中Q我们用Microsoft DirectX .X 文g。如果从头开始写导出插gQ工作量是相当大的;q运的是Q在Microsoft DirectX SDK Extra中提供了一个能够导出模型和3DS MAX标准材质到X文g的插件源代码。通过修改该源代码Q可以它能够导出DirectX 9 Shader材质。在3DS MAX 6 SDK中新增加了一个IDxMaterial接口Q通过查询一个IMaterial接口是否为IDxMaterial接口Q就可以定该材质是否ؓDirectX 9 Shader材质。通过IDxMaterial接口可以获得该材质对应的FX文g的文件名Q以及其参数信息。这样就可以它们导Z?

.X文g中对Effect的支持;EffectInstance和EffectDefault

Microsoft DirectX .X文g的格式是Z模板的、可扩展的文件格式。通过为其制定新的模板Q就可以在其中加入新的内宏V一般的.X文g中的内容有三l场景的物体层关系、网格模型几何数据、材质信息、动M息等。在DirectX的众多X文g模板中有一个模板是专门用来代表Effect的实例的。当一个FX文g的参数被工加以调整从而具备一些特定的g后,?FX文g和这些参数值的集合Ş成了一个Effect实例。该模板的定义如下:

template EffectInstance
{
    < E331F7E4-0559-4cc2-8E99-1CEC1657928F >
    STRING EffectFilename;
    [ ... ]
}

 

其中Q?EffectFilename代表了该Effect实例中的FX文g名, [ ... ]代表在其中可以插入Q何X文g模板对应的数据。这样就可以代表Mcd的参数倹{?

然而要惌Direct3DE序能够识别[ ... ]中的内容Q需要用X文g模板中的EffectParampd模板Q包括EffectParamDWord, EffectParamFlaots, EffectParamString。通过q三U模板对应的数据Q所有类型的Effect参数值都可以被记录在X文g中?

最后,EffectInstance数据需要被攄在Material数据中才可以被识别?/p>

Material模板Q?

template Material
{
    < 3D82AB4D-62DA-11CF-AB39-0020AF71E433 >
    ColorRGBA faceColor;
    FLOAT power;
    ColorRGB specularColor;
    ColorRGB emissiveColor;
    [...]
}

 

前面的一些颜色模板表明在Material数据中这些颜色信息是必须有的Q而最后的[ ... ]则代表可以插入Q何X文g模板对应的数据。我们的EffectInstance数据可以放|在q里 ?

举一个简单的例子Q?

Material { //材质
    0.500000;0.500000;0.500000;1.000000;; //faceColor
    0.000000; //power
    0.900000;0.900000;0.900000;; //specularColor
    0.000000;0.000000;0.000000;; //emissiveColor
    EffectInstance
    {                            //[...]Q这里是EffectInstance
        "SkyboxNew01.fx";        //fx文g的文件名。通过D3DXCreateEffectFromFile()可以
                                 //建立该文件对应的D3DXEffect对象
        //下面是EffectInstance中的[...]

        EffectParamString 
        {                        //EffectParamStringQ即字符串型参数?/span> 
            "TexCloudTop";       //参数的名Uͼ通过该名U调用ID3DXEffect::GetXXXByName()Ҏ
                                 //可以得到与fx文g中对应的参数?
            "DarkClouds01.jpg";  //参数的值?/span>
        } 
        EffectParamString
        {                        //同上
            "TexCloudBottom";
            "DarkClouds02.jpg";
        }
        EffectParamFloats
        {                       //EffectParamFloatsQ即点数组型参数?/span>
            "Brightness";       //参数名称
            1;                  //点数组大小
            0.500000;           //?
        }
    }
}

 

当我们在E序中调用D3DXLoadMeshFromX()或D3DXLoadMeshHierarchyFromX()Ӟ可以通过其LPD3DXBUFFER *ppEffectInstances参数来接收到|格所用的所有EffectInstance的信息?/p>

在程序中Q对应于X文g中的EffectInstance模板和EffectParampd模板Q有两个l构体用来代表Effect数据Q?

typedef struct _D3DXEFFECTINSTANCE
{ //EffectInstance
    LPSTR pEffectFilename; //fx文g?/span>
    DWORD NumDefaults; //参数个数
    LPD3DXEFFECTDEFAULT pDefaults; //参数数组
} D3DXEFFECTINSTANCE, *LPD3DXEFFECTINSTANCE;

typedef struct _D3DXEFFECTDEFAULT
{ //EffectDefaultQ即EffectParam
    LPSTR pParamName;           //参数?
    D3DXEFFECTDEFAULTTYPE Type; //参数cd
    DWORD NumBytes;             //参数大小Q以字节?
    LPVOID pValue;              //指向参数的值的指针
} D3DXEFFECTDEFAULT, *LPD3DXEFFECTDEFAULT;

需要注意的是,从文件中得到的参数类型只有以下几U:
typedef enum _D3DXEFFECTDEFAULTTYPE
{
    D3DXEDT_STRING = 1, //字符?
    D3DXEDT_FLOATS = 2, //点数组
    D3DXEDT_DWORD = 3,  //长整?
    D3DXEDT_FORCE_DWORD = 0x7fffffff //此g使用
} D3DXEFFECTDEFAULTTYPE;

 

在调用了D3DXLoadMeshFromX()和D3DXLoadMeshHierarchyFromX()之后QX文g中的所有Effect数据信息׃上述l构体的形式攄在ppEffectInstances中了?另外Q在?DS MAX导出参数到X文gӞ对于整型和QҎl型的变量,它们的值将直接导出到X文g中去Q而对于所有的U理贴图文g参数Q导出的仅仅是该文g的文件名。所?在程序中需要再Ҏq些文g名来建立U理对象?在《龙的传说》中Q我们用一个自定义的CEffectInstancecL处理文件名转换为纹理对象的q程?一般来_建立一个完整的CEffectInstance的过E如下:

ҎD3DXEFFECTINSTANCEl构中的pEffectFilename字符串寻扑֯应的FX文g;
Ҏ该FX文g建立ID3DXEffectQƈ指针保存在CEffectInstance?
ҎD3DXEFFECTINSTANCEl构中的pDefaults讄CEffectInstance中的参数信息Q?/p>


对于长整型和点数组Q直接拷贝; 
对于字符Ԍ首先调用ID3DXEffect接口中的GetParameterByName()和GetParameterDesc()ҎQ得到该参数的类型; 然后q一步判断:


如果实是字W串参数Q则直接拯
如果是纹理参敎ͼ则将该字W串作ؓU理文g名徏立纹理对象,q将指针保存在CEffectInstance中?

而在最新推出的DirectX 9 SDK Summer 2004中,通过ID3DXEffect::BeginParameterBlock()和ID3DXEffect::EndParameterBlock()ҎQ我们可以将Effect参数讄q程l一l定C个ParamBlock句柄上。这P在调用ID3DXEffect::Begin()之前可以直接用ID3DXEffect::ApplyParameterBlock()Ҏ来设|所有被l定的参数倹{例如:

[以前的做?/strong>]Q?

在读取参数时Q获得每一个参数的句柄

hParam1 = pEffect->GetParameterByName( NULL, "LightPos" );
hParam2 = pEffect->GetParameterByName( NULL, "LightColor" );
...

在实时绘制时Q分别设|每一个参?

pEffect->SetValue( hParam1, value1 );
pEffect->SetValue( hParam2, value2 );
...
pEffect->Begin();
// l制
...

 

[在DirectX 9 SDK Summer 2004中的做法]Q?

在读取参数时Q绑定所有参数设|到同一句柄

hParam1 = pEffect->GetParameterByName( NULL, "LightPos" );
hParam2 = pEffect->GetParameterByName( NULL, "LightColor" );
...
pEffect->BeginParameterBlock(); // 开始绑?/span>
pEffect->SetValue( hParam, value1 );
pEffect->SetValue( hParam, value2 );
...
hParamBlock = pEffect->EndParameterBlock(); // l束l定Q返回句?

在实时绘制时Q统一讄l定?

pEffect->ApplyParameterBlock( hParamBlock );
pEffect->Begin;
// l制
...

 

q样不仅化了在读取时对参数的分析q程Q而且提高了实际绘制时参数讄q程的效率?

ȝ

以上是一些对于在DirectX 9.0中对Effect Framework的用的要介l。MQ用Effect来替代以前的标准材质是目前实时图形领域的发展势。通过Effect FrameworkQ程序员和美工可以ؓ实时三维E序实现多种多样的材质效果和视觉效果?׃内容实在太多Q限于篇q,本文只是对Effect Framework中相x늚一个M概括和简要介l,所以显得有些晦涩。在以后的文章中Q将分批对这个Framework以及在其之上q行工作的流E进行比较详l的介绍?/p>

李锦?mybios) 2006-11-20 16:54 发表评论
]]>
【{贴】渲染状态管?/title><link>http://www.shnenglu.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.shnenglu.com/mybios/archive/2006/11/18/15400.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15400.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/18/15400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15400.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15400.html</trackback:ping><description><![CDATA[  提高3D囑ŞE序的性能是个很大的课题。图形程序的优化大致可以分成两大dQ一是要有好的场景管理程序,能快速剔除不可见多边形,q根据对象距相机q近选择合适的l节QLODQ;二是要有好的渲染E序Q能快速渲染送入渲染线的可见多边Ş。? <br />  我们知道Q用OpenGL或Direct3D渲染囑ŞӞ首先要设|渲染状态,渲染状态用于控制渲染器的渲染行为。应用程序可以通过改变渲染状态来控制OpenGL或Direct3D的渲染行为。比如设|Vertex/Fragment Program、绑定纹理、打开深度试、设|雾效等。 ?br />  改变渲染状态对于显卡而言是比较耗时的操作,而如果能合理理渲染状态,避免多余的状态切换,明显提升图形程序性能。这文章将讨论渲染状态的理。 ?br /><br />文档目录Q ?br />  基本思想  <br />  实际问题  <br />  渲染脚本  <br /><br />文档内容Q ?br /><br />基本思想  <br />  我们考虑一个典型的游戏场景Q包含h、动物、植物、徏{、交通工兗武器等。稍微分析一下就会发玎ͼ实际上场景里很多对象的渲染状态是一LQ比如所有的人和动物的渲染状态一般都一P所有的植物渲染状态也一P同样建筑、交通工兗武器也是如此。我们可以把h相同的渲染状态的对象归ؓ一l,然后分组渲染Q对每组对象只需要在渲染前设|一ơ渲染状态,q且q可以保存当前的渲染状态,讄渲染状态时只需改变和当前状态不一L状态。这样可以大大减多余的状态切换。下面的代码D|CZq种ҎQ ?br />   <br /><br />// 渲染状态组链表Q由场景理E序填充  <br />RenderStateGroupList groupList;  <br />// 当前渲染状态 ?br />RenderState curState;  <br /><br />…… ?br /><br />// 遍历链表中的每个l ?br />RenderStateGroup *group = groupList.GetFirst();  <br />while ( group != NULL )  <br />{   <br />     // 讄该组的渲染状态 ?br />     RenderState *state = group->GetRenderState();  <br />     state->ApplyRenderState( curState );  <br /><br />     // 该渲染状态组的对象链表 ?br />     RenderableObjectList *objList = group->GetRenderableObjectList();  <br />     // 遍历对象链表的每个对象 ?br />     RenderableObject *obj = objList->GetFirst();  <br />     while ( obj != NULL )  <br />     {  <br />         // 渲染对象  <br />         obj->Render();  <br /><br />         obj = objList->GetNext();  <br />     }  <br /><br />     group = groupList.GetNext();   <br />}  <br />   <br />//其中RenderStatecȝApplyRenderStateҎ形如Q? <br />void RenderState::ApplyRenderState( RenderState &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 />  q些分组的渲染状态一般被UCؓMaterial或Shader。这里Material不同于OpenGL和Direct3D里面用于光照的材质,Shader也不同于OpenGL里面的Vertex/Fragment Program和Direct3D里面的Vertex/Pixel Shader。而是指封装了的显卡渲染图形需要的状态(也包括了OpenGL和Direct3D原来的Material和ShaderQ。 ?br /><br />  从字面上看,MaterialQ材质)更侧重于对象表面外观属性的描述Q而ShaderQ这个词实在不好用中文表C)则有用程序控制对象表面外观的含义。由于显卡可~程线的引入,渲染状态中包含了Vertex/Fragment ProgramQ这些小E序可以控制物体的渲染,所以我觉得封装的渲染状态称为Shader更合适。这文章也称之ؓShader。 ?br /><br />  上面的代码段只是单的演示了渲染状态管理的基本思\Q实际上渲染状态的理需要考虑很多问题。 ?br />渲染状态管理的问题  <br />   <br /><br /> 消耗时间问题 ?br />  改变渲染状态时Q不同的状态消耗的旉q不一P甚至在不同条件下改变渲染状态消耗的旉也不一栗比如绑定纹理是一个很耗时的操作,而当U理已经在显卡的U理~存中时Q速度׃非常快。而且随着g和Y件的发展Q一些很耗时的渲染状态的消耗时间可能会有减。因此ƈ没有一个准的消耗时间的数据。 ?br /><br />  虽然消耗时间无法量化,情况不同消耗的旉也不一P但一般来说下面这些状态切换是比较消耗时间的Q ?br /><br />Vertex/Fragment Program模式和固定管U模式的切换QFFQFixed Function PipelineQ? <br /><br />Vertex/Fragment Program本nE序的切换? <br /><br />改变Vertex/Fragment Program帔R   <br /><br />U理切换   <br /><br />点和烦引缓存(Vertex & Index BuffersQ切换? <br /><br />  有时需要根据消耗时间的多少来做折衷Q下面将会遇到这U情c? <br /><br />    <br /><br /> 渲染状态分c ?br />  实际场景中,往往会出现这L情况Q一cd象其它渲染状态都一P只是U理和顶炏V烦引数据不同。比如场景中的hQ只是n材、长相、服装等不同Q也是说只有纹理、顶炏V烦引数据不同,而其它如Vertex/Fragment Program、深度测试等渲染状态都一栗相反,一般不会存在纹理和点、烦引数据相同,而其他渲染状态不同的情况。我们可以把U理、顶炏V烦引数据不归入到Shader中,q样场景中所有的人都可以用一个Shader来渲染,然后在这个Shader下对U理q行分组排序Q相同纹理的人放在一h染。 ?br /> 多道渲染QMultipass RenderingQ ?br />  有些比较复杂的图形效果,在低档显卡上需要渲染多ơ,每次渲染一U效果,然后用GL_BLEND合成为最l效果。这U方法叫多道渲染Multipass RenderingQ渲染一ơ就是一个pass。比如做逐像素凹凸光照,需要计环境光、O光凹凸效果、高光凹凸效果,在NV20昑֍上只需?个passQ而在NV10昑֍上则需?个pass。Shader应该支持多道渲染Q即一个Shader应该分别包含每个pass的渲染状态。 ?br /><br />    不同的pass往往渲染状态和U理都不同,而顶炏V烦引数据是一L。这带来一个问题:是以对象为单位渲染,一ơ渲染一个对象的所有passQ然后渲染下一个对象;q是以pass为单位渲染,W一ơ渲染所有对象的W一个passQ第二次渲染所有对象的W二个pass。下面的E序D|CZq两U方式:  <br /><br />  以对象ؓ单位渲染   <br /><br />// 渲染状态组链表Q由场景理E序填充  <br />ShaderGroupList groupList;  <br /><br />…… ?br /><br />// 遍历链表中的每个l ?br />ShaderGroup *group = groupList.GetFirst();  <br />while ( group != NULL )  <br />{   <br />     Shader *shader = group->GetShader();  <br />   <br />     RenderableObjectList *objList = group->GetRenderableObjectList();  <br /><br />     // 遍历相同Shader的每个对象 ?br />     RenderableObject *obj = objList->GetFirst();  <br />     while ( obj != NULL )  <br />     {  <br />         // 获取shader的pass敊W?br />         int iNumPasses = shader->GetPassNum();  <br />         for ( int i = 0; i < iNumPasses; i++ ) <br />{ <br />// 讄shaderWi个pass的渲染状?<br />shader->ApplyPass( i );  <br />             // 渲染对象  <br />             obj->Render();  <br />         }  <br /><br />         obj = objList->GetNext();  <br />     }  <br />   <br />     group = groupList->GetNext();  <br />}  <br />     <br /><br />以pass为单位渲染? <br />    <br />// 渲染状态组链表Q由场景理E序填充  <br />ShaderGroupList groupList;  <br />   <br />…… ?br />    <br />for ( int i = 0; i < MAX_PASSES_NUM; i++ ) <br />{ <br />// 遍历链表中的每个l?<br />ShaderGroup *group = groupList.GetFirst(); <br />while ( group != NULL ) <br />{ <br />Shader *shader = group->GetShader();  <br />         int iNumPasses = shader->GetPassNum();  <br />         // 如果shader的pass数小于@环次敎ͼ跌此shader  <br />         if( i >= iNumPasses )  <br />         {  <br />             group = groupList->GetNext();  <br />             continue;  <br />         }  <br /><br />         // 讄shaderWi个pass的渲染状态 ?br />         shader->ApplyPass( i );  <br /><br />         RenderableObjectList *objList =   <br />             group->GetRenderableObjectList();  <br />   <br />         // 遍历相同Shader的每个对象 ?br />         RenderableObject *obj = objList->GetFirst();  <br />         while ( obj != NULL )  <br />         {  <br />             obj->Render();  <br /><br />             obj = objList->GetNext();  <br />         }  <br /><br />         group = groupList->GetNext();  <br />     }  <br />}  <br />    <br /><br />      <br />  q两U方式各有什么优~点呢?  <br /><br />  以对象ؓ单位渲染Q渲染一个对象的W一个pass后,马上紧接着渲染q个对象的第二个passQ而每个pass的顶点和索引数据是相同的Q因此第一个pass顶点和索引数据送入昑֍后,昑֍Cache中已l有了这个对象顶点和索引数据Q后lpass不必重新顶点和索引数据拷到昑֍Q因此速度会非常快。而问题是每个pass的渲染状态都不同Q这使得实际上每ơ渲染都要设|新的渲染状态,会生大量的多余渲染状态切换。 ?br /><br />  以pass为单位渲染则正好相反Q以Shader分组Q相同Shader的对象一h染,可以只在q组开始时讄一ơ渲染状态,相比以对象ؓ单位Q大大减了渲染状态切换。可是每ơ渲染的对象不同Q因此每ơ都要将对象的顶点和索引数据拯到显卡,会消耗不时间。 ?br />  可见惛_渲染状态切换就要频J拷贝顶点烦引数据,而想减少拯点索引数据又不得不增加渲染状态切换。鱼与熊掌不可兼?:-(  <br />  ׃g条g和场景数据的情况比较复杂Q具体哪U方法效率较高ƈ没有定式Q两U方法都有h使用Q具体选用那种Ҏ需要在实际环境试后才能知道。 ?br />   <br /><br /> 多光源问题 ?br />待箋…… ?br /><br />   <br /><br /> 阴媄问题  <br />待箋…… ?br /><br /><br />   <br /><br />渲染脚本  <br />  现在很多囑ŞE序都会自己定义一U脚本文件来描述Shader。 ?br /><br />  比如较早的OGREQObject-oriented Graphics Rendering EngineQ面向对象图形渲染引擎)的Material脚本QQuake3的Shader脚本Q以及刚问世不久的Direct3D的Effect FileQnVIDIA的CgFX脚本Q文件格式与Direct3D Effect File兼容Q,ATI RenderMonkey使用的xml格式的脚本。OGRE Material和Quake3 Shaderq两U脚本比较有历史了,不支持可~程渲染线。而后面三U比较新的脚本都支持可编E渲染管Uѝ ?br /><br />   <br /><br />脚本  Ҏ  范例? <br />OGRE Material 装各种渲染状态,不支持可~程渲染线  >>>>   <br />Quake3 Shader 装渲染状态,支持一些特效,不支持可~程渲染线  >>>>   <br />Direct3D Effect File 装渲染状态,支持multipassQ支持可~程渲染线  >>>>   <br />nVIDIA CgFX脚本 装渲染状态,支持multipassQ支持可~程渲染线  >>>>   <br />ATI RenderMonkey脚本 装渲染状态,支持multipassQ支持可~程渲染线  >>>>   <br /><br />   <br /><br />  使用脚本来控制渲染有很多好处Q ?br /><br />可以非常方便的修改一个物体的外观而不需重新~写或编译程序? <br /><br />可以用外围工具以所见即所得的方式来创建、修改脚本文ӞcMATI RenderMonkey的工作方式)Q便于美工、关卡设计h员设定对象外观,建立外围工具与图形引擎的联系   <br /><br />可以在渲染时相同外观属性及渲染状态的对象Q也是Shader相同的对象)归ؓ一l,然后分组渲染Q对每组对象只需要在渲染前设|一ơ渲染状态,大大减少了多余的状态切?img src ="http://www.shnenglu.com/mybios/aggbug/15400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-18 22:34 <a href="http://www.shnenglu.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.shnenglu.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.shnenglu.com/mybios/archive/2006/11/18/15332.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15332.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/18/15332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15332.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15332.html</trackback:ping><description><![CDATA[引用 <blockquote><a ><font color="#0066a7">Direct3D10Ҏ预?/font></a><br /><div><font color="#000000" size="4">我在GameResBlog的老文章重新脓回来Q发现写的还是很有味道,嘿嘿~~</font></div><div><font color="#000000" size="4"></font> </div><div><font color="#000000" size="4">刚拿到DirectX Dec2005 SDKQ发现竟然有D3D10的文档和例子Q速研I了一下,以下只是个h的读书笔讎ͼ仅作参?</font><p></p><p><font color="#000000" size="4">1.L了固定管U?br />文档里列Z用DX10Ҏ模拟的一些固定管U的操作QMS那么大度把DX都开源了(^O^)?/font></p><p><font color="#000000" size="4">2.L了以前版本DX的设备能力检?CAPS)<br />为DX10和Windows Vista提供的显C硬件必LDX10的所有硬件特性。这样对于开发者就比较可以攑ֿ的用各U硬件特性了Q很cMConsoleq_<br />的开发?/font></p><p><font color="#000000" size="4">3.状态对?State Object)<br />"?00多个渲染状态中解脱出来?"<br />D3D10Ҏ染状态这个概念进行E化,一斚w使用全Shader化的架构使得状态的前后讄和互相媄响对渲染成功率降低到最?br />另外对API架构也更为简z,另一斚w对一些关键渲染状态进行封装和分类。主要分cL:<br /><br />Input Layout Object 输入层对?br />q个东西很类似D3D9里的点声明Q也是对用戯入数据进行整合和pȝ?br /><br />Rasterizer Object 光栅化对?br />q部分主要控制光栅器的行为:填充模式(FILL_MODE),剔除模式(CULL_MODE),多采?DepthBias{等<br /><br />DepthStencil Object 深度~冲对象<br />主要控制深度~冲的行为,像Z-buffer Enable之类?br /><br />Blend Object 混合对象<br />讄象素混合的方法,cMAlphaBlend SrcAlpha ,DestAlpha{等<br /><br />Sampler Object 采样器对?br />讄U理采样状态,包括qo器和MipMap<br /><br />4.新的资源讉K模式和资源视?View)概念<br />如果ҎD3D9的Shader使用代码和D3D10的类g码会发现一个不同?br />D3D9 Shader需要对U理q行操作Ӟ需要将U理讄到Shader可以了Q而D3D10里没有那么简单,讄前必d<br />各种资源整合后ؓ资源创徏一个视图,再提交给Shader讉K。这U操作在环境贴图里是很有好处的。对于CubeMap?张纹?br />可以采用一个视图设|到讑֤Q而自p讉K每张贴图只要L讉K视图可以了Q也是说把资源规整和集成化?/font></p><p><font color="#000000" size="4">5.新的可编E图形层(Stage)-几何Shader(Geometry Shader)<br />原来的VS和PS只是寚w个点或象素进行处理,而新的GS可以Ҏ个顶Ҏ象素的͘q顶点设|Shader。也是可以Ҏ量几何进行处?br />GS的用途有:<br />点精?br />动态粒子系l?br />皮毛pȝ<br />L阴媄<br />单Pass渲染到球形脓?br />逐多边Ş材质交换<br />逐多边Ş材质讄<br /><br />6.讑֤的创求对ViewPortq行讄<br />D3D9里无需对ViewPortq行讄可以进行渲染,而且默认的RenderTarget是后备~冲<br />而在D3D10里,q个q程变得更ؓ自主化。取出后备缓冲的格式Q将RenderTarget讄为屏q?br />q让人感到D3D10设计更趋向于成熟的引擎设计?/font></p><p><font color="#000000" size="4">7.输出层(Stream Output State)<br />q个层的功能是将VS和GS处理完成的数据输出给用户Q由用户q行处理后再反馈l管Ul处?br /><br />8.多边形拓扑结构从l制代码分离<br />现在可以单独讄拓扑l构<br />g_pd3dDevice->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST );<br />和用Draw函数l制了,很类似OpenGL</font></p><p><br /><font color="#000000" size="4">9.严格的设备对象创建时间验?br />q里的设备对象就是从讑֤创徏出来的资源。ؓ了减CPU占用QD3D10重新设计了硬件资源调用调度,所有的讑֤对象都用面向对象的方法被讑֤<br />理。这U设计方法避免了在渲染期的资源创建操作?br /><br />10.LBeginScene和EndScene<br />q个对于囑ŞAPI实多余</font></p><p><br /><font color="#000000" size="4">Dec2005 sdk里提供的文档让h很快惛_q只是一个过渡版?br />在DXUT的Mesh.Create函数中可以看C个很有趣的现象:<br />创徏D3D9对象Q用D3DX9里的载入X模型文g的函数蝲入X文g<br />D3D9的模型数据{成D3D10的类型。这样做无非是在告诉我们一?br />q样的信息,D3D10很有可能提供一U新的模型格式来作ؓ研究使用<br />。Vista的图形系lAvalon从一些视频上分析Q用了大量的XMLQ所?br />新的模型格式很有可能使用XMLQƈ且X格式的解析接口确实不方便。?br />XML的分析器可以q三方提供。得更多的研究人员能更方便的?br />q种新格式?/font></p><p><font color="#000000" size="4">Z提供一些羃写对应的含义,q些在一些函数前~会出?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.shnenglu.com/mybios/aggbug/15332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-18 09:14 <a href="http://www.shnenglu.com/mybios/archive/2006/11/18/15332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{贴】DXUT 框架函数介绍http://www.shnenglu.com/mybios/archive/2006/11/18/15331.html李锦?mybios)李锦?mybios)Sat, 18 Nov 2006 01:08:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/18/15331.htmlhttp://www.shnenglu.com/mybios/comments/15331.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/18/15331.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15331.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15331.html
引用
DirectX SDK 2006学习W记1——框?/font>
友情提醒Q所谓的框架是指SDK目录下\Samples\C++\Common路径下的DXUTpd函数包装。学习框架的前提是必L_的Windows APIQGUI~程l验Q必ȝ悉Windows的消息机Ӟ回调机制Q最好有万行左右的C/C++~程l验。MFC在这里没有Q何用处。另外我觉得最好在看程序之前对于D3D的所有概忉|点了解,什么是vertexQtextureQmatrixQlightingQmesh{等Q以及相关的数学概念。这些都可以在网上找C文翻译,帮助你快速入门?
 
  DXSDK2006?003版的比v来更C不少东西Q比如DirectX10Q还有Managed
DirectX{等。不q我兛_的还是D3D9。除了个别接口的更改之外QDXSDK2006q提供了一套图形控件的cdQ它的界面还是很漂亮的:Q如图:
 
  学习一个框架还是从它的入口学习比较方便Q否则容易迷失在无穷无尽的API和层层包装之中。DXSDK2006的框架和2003版的DX9.0c框架有很大的不同。首先是2003版的框架中提供了一个CD3DApplicationc,q个cd于初始化Q清除,以及游戏H口的创建,游戏d@环进行了包装。这是一个不错的c,不知道ؓ什么在2006版中L了。不q不要紧Q?006版的框架中提供的一些C包装函数已经_了。在看这些函C前,我们q是先来看看SDK目录下\Samples\C++ \Direct3D\Tutorials中有些什么吧。Tut01_CreateDevice是创建框Ӟq个E序不用框架Q研I一下有助于了解D3D的大致工作流E。下面是winmain函数中的一部分?/div>
 
    // Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // Show the window
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );
 
        // Enter the message loop
        MSGmsg;
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
  
  在消息@环之前有个初始化讑֤的函数InitD3D( hWnd )Q其代码如下Q?/div>
HRESULTInitD3D( HWNDhWnd )
{
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        returnE_FAIL;
 
    D3DPRESENT_PARAMETERSd3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
 
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,
&g_pd3dDevice ) ) )
    {
        returnE_FAIL;
    }
    returnS_OK;
}
 
主要是调?span style="COLOR: black">Direct3DCreate9?/span>g_pD3D->CreateDeviceq两个函数。查?/span>DXSDK文档中关?/span>D3DPRESENT_PARAMETERS的定义,大致了解一下?/span>
接下来要兛_的就是消息@环了Q在回调函数MsgProc中处理了两个消息Q一个是WM_DESTROYQ里面调用了Cleanup函数Q另一个是WM_PAINT函数Q里面调用了Render函数。Cleanup函数很简单,是调用D3D对象及其讑֤对象的Release函数释放资源Q而Render函数是D3D中最重要的函C?/div>
VOIDRender()
{
    if( NULL==g_pd3dDevice)
        return;
 
    // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
   
    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Rendering of scene objects can happen here
   
        // End the scene
        g_pd3dDevice->EndScene();
    }
 
    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL);
}
  主要调用的函数有BeginScene, EndScene和Present函数?/div>
    对D3D应用E序有了大概了解之后可以看I框架程序了。这个程序可以在Samples\C++\Direct3D\EmptyProject中找到?/div>
  从WinMain中的调用可以看到Q框枉先设定一堆回调函敎ͼ很多事情的是在用戯己写的回调函C实现。从DXUTInit开始,E序开始调用框架内的API来完成初始化——创建窗口——创备——主消息循环——退出等一pd操作。调查Common目录下DXUT.cpp文g可以发现DXUTInit函数q了以下几g事情
?span style="FONT: 7pt 'Times New Roman'">     讑֮开始调用这个函数的标志W?/div>
?span style="FONT: 7pt 'Times New Roman'">     InitCommonControls
?span style="FONT: 7pt 'Times New Roman'">     保存当前的sticky/toggle/filter?/div>
?span style="FONT: 7pt 'Times New Roman'">     通过事先导入winmm.dll的方法timeBeginPeriod来确保调用Sleep的准?/div>
?span style="FONT: 7pt 'Times New Roman'">     讑֮一些标志附Q读取命令行参数
?span style="FONT: 7pt 'Times New Roman'">     查版?/div>
?span style="FONT: 7pt 'Times New Roman'">     获得D3D对象指针。值得一提的是框架中大部分全局变量是通过cDXUTState的静态变量state的get/setҎ得到的。这些get/setҎ是用宏定义的Q里面调用了加锁和解锁,因此保证了全局变量讑֮的线E安全。这些全局性的变量包括D3D对象指针QD3D讑֤对象指针QBackBufferSurfaceDescQDeviceCapsQ窗口HINSTANCEQ窗口句柄HWNDQ焦点句柄HWNDFocusQ全屏设备句柄,H口讑֤句柄Q窗口客L矩ŞQ模式切换时H口客户端矩形,模式切换时全屏客L矩ŞQTimeQElapsedTimeQFPS敎ͼH口标题Q设备数据DeviceStatsQ以及是否暂停渲染,旉是否暂停Q窗口是否激zȝ标志Q一些窗口事件等{。这些都可以通过DXUTGETXXX/DXUTSETXXX/DXUTISXXXpd包装函数获得?/div>
?span style="FONT: 7pt 'Times New Roman'">     通过DXUT_Dynamic_Direct3DCreate9创徏D3D对象。很多D3D底层API都是通过动态的方式加蝲的,q样有利于效率的提高?/div>
?span style="FONT: 7pt 'Times New Roman'">     重设全局旉
?span style="FONT: 7pt 'Times New Roman'">     讑֮DXUTInited为true。很多DXUTpd的函数都喜欢在入口设定一个开始调q个函数的标志,在出口设定一个这个函数已l被调过的标志,q样可以在以后再ơ调用这个函数的时候了解当前什么工作已l做了,什么工作没做需要补做。我惌个主要是用来防止函数重入问题的吧。其他函C的这一对函数就不再提了
 
  呼~W一个函数大致看完了Q接下来是DXUTCreateWindow函数。什么?要问DXUTSetCursorSettingsZ么被无视Q因个函C重要。DXUTCreateWindow的工作大致是q样?/div>
?span style="FONT: 7pt 'Times New Roman'">     判断关于讑֤的CallBack有没有设定好
?span style="FONT: 7pt 'Times New Roman'">     判断DXUTInit()有没有被调用成功Q注意不是有没有调用Q?/div>
?span style="FONT: 7pt 'Times New Roman'">     获得焦点句柄Q因为窗口还没有创徏Q所以这个句柄应该是NULL
?span style="FONT: 7pt 'Times New Roman'">     讑֮HInstance
?span style="FONT: 7pt 'Times New Roman'">     讑֮H口c?/div>
?span style="FONT: 7pt 'Times New Roman'">     注册H口c?/div>
?span style="FONT: 7pt 'Times New Roman'">     讑֮H口位置和大。好长一D代码,?/div>
?span style="FONT: 7pt 'Times New Roman'">     创徏H口。终于。。?/div>
?span style="FONT: 7pt 'Times New Roman'">     讑֮H口焦点句柄Q全屏设备句柄,H口讑֤句柄
  
  接下来的函数是DXUTCreateDevice。这个函数就是用来选择最优设备ƈ创徏的?/div>
?span style="FONT: 7pt 'Times New Roman'">     讑֮参数中的回调函数和上下文Q以备后?/div>
?span style="FONT: 7pt 'Times New Roman'">     查窗口是否被成功创徏Q否则再调用一ơDXUTCreateWindow
?span style="FONT: 7pt 'Times New Roman'">     枚D所有可能的昄模式。枚举过E非常复杂,用到了CD3DEnumeration中的一些包装函敎ͼq些讑֤信息包括分L率,颜色位深{等。这里会用到DXUTCreateDevice传进来的参数IsDeviceAcceptable
?span style="FONT: 7pt 'Times New Roman'">     如果命o行设定过昄模式Q那么将刚才得到的信息覆盖?/div>
?span style="FONT: 7pt 'Times New Roman'">     采用某种权重的算法找出最优显C模式(DXUTFindValidDeviceSettingsQ?/div>
?span style="FONT: 7pt 'Times New Roman'">     切换讑֤。这里用CDXUTCreateDevice传进来的参数ModifyDeviceSettings。切换设备时要考虑很多问题Q比如需要暂时忽略WM_SIZE消息Q只有在W一ơ创备的时候才用命令行参数Q按照需要调用DXUTCreate3DEnvironment和DXUTReset3DEnvironmentQ分全屏和窗口设备重设;重设完了Ҏ需要处理WM_SIZE消息Q显C窗口,允许WM_SIZE消息{等
 
  最后是DXUTMainLoop?/div>
?span style="FONT: 7pt 'Times New Roman'">     查是否有重入问题
?span style="FONT: 7pt 'Times New Roman'">     讑֮q入d@环标?/div>
?span style="FONT: 7pt 'Times New Roman'">     查设备是否已l被成功创徏Q没创徏的话用默认参数创Z?/div>
?span style="FONT: 7pt 'Times New Roman'">     查前面三个函数是否成功调用。汗Q又是检?/div>
?span style="FONT: 7pt 'Times New Roman'">     处理H口消息Q注意只有在没有消息处理的时候才调用DXUTRender3DEnvironment()
?span style="FONT: 7pt 'Times New Roman'">     在消息@环退Z后清除加速表。应该是cMSHIFT+Xq种键盘加速表的清除吧
?span style="FONT: 7pt 'Times New Roman'">     更改d@环标?/div>
 
  q是有必要看一下主消息循环中的DXUTRender3DEnvironment
?span style="FONT: 7pt 'Times New Roman'">     查设备是否丢?/div>
?span style="FONT: 7pt 'Times New Roman'">     在窗口模式下查桌面分辨率位深讑֮Q以侉K设设?/div>
?span style="FONT: 7pt 'Times New Roman'">     试重设讑֤DXUTReset3DEnvironment
?span style="FONT: 7pt 'Times New Roman'">     判断上次渲染到现在时?elapsed time)军_是否要进行渲?/div>
?span style="FONT: 7pt 'Times New Roman'">     调用用户的FrameMove函数
?span style="FONT: 7pt 'Times New Roman'">     调用用户的FrameRender函数
?span style="FONT: 7pt 'Times New Roman'">     调用Present函数
?span style="FONT: 7pt 'Times New Roman'">     更新当前Frame
?span style="FONT: 7pt 'Times New Roman'">     Ҏ命o行检查是否需要关闭应用程?/div>
 
 
  d数看完之后,剩下的就是一些回调函C。要正确使用q些回调函数Q除了知道它们的作用之外Q还需要知道这些函数是何时被调用的。下面是调用序
  • E序启动Q?/span>InitApp ?/span>MsgProc ?/span>IsDeviceAcceptable ?/span>ModifyDeviceSettings ?/span> OnCreateDevice ?/span>OnResetDevice ?/span> 渲染d@?
  • 渲染d@环:OnFrameMove ?/span> OnFrameRender
  • 改变讑֤Q?/span>ModifyDeviceSettings ?/span> OnLostDevice ?/span>Ҏ需要调?/span>OnDestroyDevice ?/span> OnResetDevice ?/span> 渲染d@?/span>
  • E序退出:OnLostDevice ?/span>OnDestroyDevice
  下面是各函数的作用:
InitApp
初始化一些图形控件和GUI的消息处理函?/span>
OnCreateDevice
创徏讑֤时的回调函数Q用于创?/span>D3DPOOL_MANAGED资源
OnResetDevice
重设讑֤时的回调函数Q用于创?/span>D3DPOOL_DEFAULT资源
OnFrameMove
动画实现处,常用于矩阵{换等操作
OnFrameRender
渲染实现处,常用于渲染场?/span>
OnLostDevice
讑֤丢失时的回调函数Q释攄OnResetDevice创徏的资?/span>
OnDestroyDevice
讑֤析构时的回调函数Q释攄OnCreateDevice创徏的资?/span>
IsDeviceAcceptable
创徏讑֤时用来对所有可用设备进行过滤的函数
ModifyDeviceSettings
更改讑֤时的回调函数Q用于实现更改设备时所需做的其他操作
MsgProc
安排各空件处理消息的序
OnGUIEvent
E序控gl定的消息处理回调函?/span>
 
  以上函数均可以更换名字,q里只是用框枉认的函数名字?/div>


李锦?mybios) 2006-11-18 09:08 发表评论
]]>【{贴】DXUT 框架入门 2http://www.shnenglu.com/mybios/archive/2006/11/18/15329.html李锦?mybios)李锦?mybios)Sat, 18 Nov 2006 01:02:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/18/15329.htmlhttp://www.shnenglu.com/mybios/comments/15329.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/18/15329.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15329.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15329.html阅读全文

李锦?mybios) 2006-11-18 09:02 发表评论
]]>
【{贴】DXUT 框架入门 1http://www.shnenglu.com/mybios/archive/2006/11/18/15328.html李锦?mybios)李锦?mybios)Sat, 18 Nov 2006 01:01:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/18/15328.htmlhttp://www.shnenglu.com/mybios/comments/15328.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/18/15328.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15328.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15328.html
CD3DApplication 框架cdl光荣的退役了Q取而代之的是DXUT*pd函数。在q篇文章中将要简单介lDXUT框架的应用?/div>
最q的directx 下蝲地址 Q?q里面包含了64位操作系l库以及directx10{等Qdirectx10 的程序例子只能运行在windows vista 上面。尽可以编译,但缺directx3d10 q行? 在安装sdk之后Q别忘记安装Redist目录中最新的directxq行库?/div>
在vc.net->tools->options中配|头文g以及库文件地址?/div>

使用dxut框架q行directx设计Ӟ拯directx sdk 安装目录\Samples\C++\中的Common文g内容C的程序目录下(如下??/p>

创徏一个名为dxut 的windows apllication I工E?然后在vc solution explorer 中项目下加入common目录(d存在文gQ注意dxsound两个文g没有加入)Q然后添加一个源文gmain.cpp

然后在vc solution explorer 中项目上点右键进入项目属性页(property pages)加入附加的common目录作ؓ附加头文件搜索目?同样在属性页?linker->input->addtional dependencies 中加?dxerr.lib dxguid.lib d3dx9.lib d3d9.lib winmm.lib comctl32.lib {链接库

main.cpp 源文件内容如下:

#include  < dxstdafx.h >
// --------------------------------------------------------------------------------------
//  当Directx3D讑֤被创建后Q这个回调函数马上被调用Q因为D3DPOOL_MANAGED资源在设备被销毁后
//  需要重新装?q里是最佛_建D3DPOOL_MANAGED资源的地方,创徏的资源应在 OnDestroyDevice 
//  函数中销毁 ?br /> // --------------------------------------------------------------------------------------
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9 *  pd3dDevice,  const  D3DSURFACE_DESC *  pBackBufferSurfaceDesc,  void *  pUserContext )
{
 
return  S_OK;
}

// --------------------------------------------------------------------------------------
//  当direct3d讑֤被复位后Q这个函数立卌调用Q这里最好放|D3DPOOL_DEFAULT 资源代码Q因
//  q些资源在设备丢失后需要重新装载。在q里创徏的资源应该在OnLostDevice 函数中释?br /> // --------------------------------------------------------------------------------------
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9 *  pd3dDevice,  const  D3DSURFACE_DESC *  pBackBufferSurfaceDesc,  void *  pUserContext )
{
 
return  S_OK;
}

// --------------------------------------------------------------------------------------
//  在Direct3D讑֤q入lost状态后在IDirect3DDevice9::Reset 调用之前调用此函敎ͼ在OnResetDevice 
//  中创建的资源必须在这里释放,通常包括所有的D3DPOOL_DEFAULT 资源Q?br /> // --------------------------------------------------------------------------------------
void  CALLBACK OnLostDevice(  void *  pUserContext )
{

}

// -------------------------------------------------------------------------------------- 
// q个回调函数在每帧的开始被调用Q这个在你的E序中用来处理场景更新最好的位置Q但不能包含实际?br /> // 场景渲染调用Q渲染工作应该放在OnFrameRender 回调函数中。常用于矩阵转换、摄像机{操作?br /> // --------------------------------------------------------------------------------------
void  CALLBACK OnFrameMove( IDirect3DDevice9 *  pd3dDevice,  double  fTime,  float  fElapsedTime,  void *  pUserContext )
{
}

// --------------------------------------------------------------------------------------
// 此回调函数在每Frame最后被调用Q在场景上执行所有的渲染调用Q当H口需要重l(处理WM_PAINT?br /> // 息)时此函数也会被调用(此时不调用OnFrameMoveQ,在此函数q回后,DXUT调?br /> // IDirect3DDevice9::Present 来显C翻转链中下一个缓冲区内容?br /> // --------------------------------------------------------------------------------------
void  CALLBACK OnFrameRender( IDirect3DDevice9 *  pd3dDevice,  double  fTime,  float  fElapsedTime,  void *  pUserContext )
{
 HRESULT hr;
 V( pd3dDevice
-> Clear( 0 , NULL, D3DCLEAR_TARGET  |  D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0 0 0 0 ),  1.0f 0 ) );
 
if (SUCCEEDED(pd3dDevice -> BeginScene()))
 
{
  
// 更新囑փ
  pd3dDevice -> EndScene();
 }

}

// -------------------------------------------------------------------------------------- 
// 此回调函数在direct3d讑֤被销毁时调用Q通常发生在程序终止,在OnCreateDevice 中创建的资源Q要
// 在这里释放,通常包含所有的D3DPOOL_MANAGED资源
// IDirect3DDevice9::Present 来显C翻转链中下一个缓冲区内容?br /> // --------------------------------------------------------------------------------------
void  CALLBACK OnDestroyDevice(  void *  pUserContext )
{
 
}

INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, 
int  )
{
 
//  讄回调函数Q这些函数允许DXUT通知应用E序更换讑֤Q用戯入和H口消息?br />  //  回调函数是可选的Q因此你要做的仅是设|你感兴的事g的回调函数?/span>
 DXUTSetCallbackDeviceCreated( OnCreateDevice );
 DXUTSetCallbackDeviceReset( OnResetDevice );
 DXUTSetCallbackDeviceLost( OnLostDevice );
 DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
 DXUTSetCallbackFrameRender( OnFrameRender );
 DXUTSetCallbackFrameMove( OnFrameMove );

 
//  初始化DXUTq创建想要的Win32H口和应用程序的Direct3D讑֤。调用这?br />  //  可选函C的每一个,此外它们允许你设|几个选项来控制框架的行ؓ?/span>
 DXUTInit( TRUE, TRUE, TRUE );
 
// directx ~码是unicode环境Q所以字W串之前要加 L ?/span>
 DXUTCreateWindow( L " Welcome to topameng.spaces.live.com "  );
 DXUTCreateDevice( D3DADAPTER_DEFAULT, TRUE, 
640 480  );
 
//  通过DXUT来处理消息@环ƈ分派渲染调用。当在空闲时间和处理H口消息?br />  //  旉间隔Ӟ框架调用OnFrameMove和OnFrameRender回调函数?/span>
 DXUTMainLoop();
 
return  DXUTGetExitCode();
}

 

direct3d Memory PoolsQ内存池Q?br />表面和其它一些D3D资源被放在多U内存池中。内存池的种cȝD3DPOOL枚Dcd的一个成员来指定。它可以Z列几U:
1QD3DPOOL_DEFAULT——表CD3D根据资源的cd和用途把它们攑֜最合适的地方。这有可能是昑֭、AGP内存或者系l内存中。值得注意的是Q这U内存池中的资源必须要在IDirect3DDevice9::Reset被调用之前消毁掉Q然后必重新初始化?br />2QD3DPOOL_MANAGED——资源将由D3D理q且按设备的需要来指定攑֜昑֭q是攑֜AGP内存中,同时备䆾q些资源到系l内存中。当应用E序讉K和改变资源,也会对系l内存造成影响?br />3QD3DPOOL_SYSTEMMEM——指定资源放在系l内存中?br />4QD3DPOOL_SCRATCH——规定资源放在系l内存中Q它与D3DPOOL_SYSTEMMEM不同之处在于使用q个参数使图形设备不能访问本内存池的资源Q但资源可以被复制出厅R?/div>
也可以打开direct sdk 安装目录Samples\C++\Direct3D\EmptyProject  例子Q基本和上面是相同的


李锦?mybios) 2006-11-18 09:01 发表评论
]]>【原创翻译】开启Direct3D调试模式Q?/title><link>http://www.shnenglu.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.shnenglu.com/mybios/archive/2006/11/17/15297.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15297.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/17/15297.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15297.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15297.html</trackback:ping><description><![CDATA[ <h1> <font style="BACKGROUND-COLOR: #ffffff" color="#0000ff" size="3">声明Q此文章译自DirectX 9.0C OCT 2006 SDK的Direct3D For C++帮助文档的Enabling Direct3D Debug Information主题Q前面部分有些没有翻译的?/font> </h1> <h1>?include <D3D9.h>语句前面加上以下q条语句卛_Q?/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.shnenglu.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.shnenglu.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 调试模式开启之后,你可以在M时候查看对象的调用堆栈。这会导致你的程序非常慢Q但是可以用此功能查资源泄漏(内存泄漏的一U)。开启调用堆栈,讄q个注册表键gؓ1卛_Q?/p> <pre class="clsCode">\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Direct3D\\ D3D9Debugging\\EnableCreationStack </pre> <p>开启D3D调试模式Q然后重Z的工E,pȝ会l你讉Kq个附加的变量:<br />  LPCWSTR CreationCallStack;<br /></p> <p>q个变量存储着每次创徏对象时的调用堆栈。这会导致你的程序非常慢Q但是可以用此功能查资源泄漏?/p> <p> </p> <img src ="http://www.shnenglu.com/mybios/aggbug/15297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-17 15:14 <a href="http://www.shnenglu.com/mybios/archive/2006/11/17/15297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】把D3D画面渲染到桌面!不用创徏MH口http://www.shnenglu.com/mybios/archive/2006/11/17/15295.html李锦?mybios)李锦?mybios)Fri, 17 Nov 2006 06:54:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/17/15295.htmlhttp://www.shnenglu.com/mybios/comments/15295.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/17/15295.html#Feedback12http://www.shnenglu.com/mybios/comments/commentRss/15295.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15295.html   其实q个很简单,只是创徏讑֤的时候那个hwnd有点不一P
   可能有h׃_用GetDesktopWindows()获得桌面的句柄不p了?那就错了Q这样会没有效果的!正确的代码如下:

    HWND hWnd  =  FindWindowEx(GetDesktopWindow() ,  0  ,  " Progman "  ,  " Program Manager " );
    hWnd 
=  FindWindowEx(hWnd ,  0  ,  " SHELLDLL_DefView "  ,  0 );
    hWnd 
=  FindWindowEx(hWnd ,  0  ,  " SysListView32 "  ,  " FolderView " );
    
//  初始化 D3D 讑֤
    InitD3D(hWnd);


是不是很单!哈哈?br />
昄的时候,如果x染在桌面的一角,则可以这样写Q?br />
// 昄在左上角Q?28×128?/span>
        RECT rect;
        rect.left 
= 0;
        rect.right 
= 128;
        rect.top 
= 0;
        rect.bottom 
= 128;
        
// 昄
        g_pd3dDevice->Present(0 , &rect , 0 , 0);


李锦?mybios) 2006-11-17 14:54 发表评论
]]>
【原创】今天参照{贴的渲染到纹理做了一个例子,效果q不错,哈哈http://www.shnenglu.com/mybios/archive/2006/11/17/15278.html李锦?mybios)李锦?mybios)Fri, 17 Nov 2006 01:18:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/17/15278.htmlhttp://www.shnenglu.com/mybios/comments/15278.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/17/15278.html#Feedback8http://www.shnenglu.com/mybios/comments/commentRss/15278.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15278.html代码里面写了详尽的注释!点击q里下蝲工程Q用VS2003 Q?OCT 2006 DirectSDK ~译Q?BR>L考这?A id=_2241aa34328c_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl href="/mybios/archive/2006/11/16/15271.html">【{贴】Render to TextureQ渲染到U理Q?/A>
RenderToTexture.JPG


  阅读全文

李锦?mybios) 2006-11-17 09:18 发表评论
]]>
【{贴】Render to TextureQ渲染到U理Q?/title><link>http://www.shnenglu.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.shnenglu.com/mybios/archive/2006/11/16/15271.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15271.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/16/15271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15271.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15271.html</trackback:ping><description><![CDATA[·内容<br />   渲染到纹理是D3D中的一wU技术。一斚wQ它很简单,另一斚w它很强大q能产生很多Ҏ效果?比如说发光效果,环境映射Q阴影映,都可以通过它来实现。渲染到U理只是渲染到表面的一个g伸。我们只需再加些东西就可以了。首先,我们要创造一个纹理,q且做好一些防范措施。第二步我们可以把适当的场景渲染到我们创徏的纹理上了。然后,我们把这个纹理用在最后的渲染上?br /><br />·main.cpp<br />   首先我们得声明所需要的对象。当然我们需要一张用来渲染的U理。此外,我们q需要两个Surface对象。一个是用来存储后台~冲区,一个用来当U理的渲染对象。后面我再详l介l它们。另外我们还需要两个矩阵,一个是用来当纹理的投媄矩阵Q另一个是存储原来的矩c?br /><br />LPDIRECT3DTEXTURE9 pRenderTexture = NULL;<br />LPDIRECT3DSURFACE9 pRenderSurface = NULL,pBackBuffer = NULL;<br />D3DXMATRIX matProjection,matOldProjection;<br /><br />   现在我们来创建纹理。前两个参数是纹理的宽度和高度,W三个参数是U理的多U渐q纹理序列参敎ͼ在这里是设ؓ1Q第四个参数非常重要而且必须设ؓD3DUSAGE_RENDERTARGETQ表明我们所创徏的纹理是用来渲染的。剩下的参数是指纹理格式,点~冲区的内存位置Q和一个指向纹理的指针。当U理是用来当渲染对象Ӟ点~冲区的内存位置必须设ؓD3D_DEFAILT?<br /><br />g_App.GetDevice()->CreateTexture(256,256,1,D3DUSAGE_RENDERTARGET,D3DFMT_R5G6B5,D3DPOOL_DEFAULT,&pRenderTexture,NULL);<br /><br />   Z讉KU理内存对象Q我们需要一个Surface对象Q因为D3D中的U理是用q样的一个Surface来存储纹理数据的。ؓ了得到纹理表面的Surface,我们需要调用方法GetSurfaceLevel() 。第一个参数我们设?Q第二个参数Z个指向surface对象的指针?br /><br />pRenderTexture->GetSurfaceLevel(0,&pRenderSurface);<br /><br />下一步就是创Z个适合U理l数的投q阵,因ؓU理的横U|和后台缓冲区的不一栗?br /><br />D3DXMatrixPerspectiveFovLH(&matProjection,D3DX_PI / 4.0f,1,1,100);<br /><br />在我们的循环渲染之前Q我们必M存后台缓冲区和它的投qc?br /><br />g_App.GetDevice()->GetTransform(D3DTS_PROJECTION,&matOldProjection);<br />g_App.GetDevice()->GetRenderTarget(0,&pBackBuffer); <br /><br />   渲染循环函数可以分ؓ两个部分。第一部分是渲染到U理的过E。因此,渲染对象必须设ؓU理表面。然后我们就可以把东西渲染到q个对象上了。渲染到另一个表面上和正常地渲染到后台缓冲区差不多。只有一点不同,那就是先不调用PrensentQ)函数Q因为纹理上的内容ƈ不需要显C在屏幕上。象qx一P我们先要重置表面颜色~冲区,q且调用BeginSence()和EndSence()Ҏ。ؓ了能够适当的渲染,我们必须讄和纹理表面相W的投媄矩阵。否则最后的图象可能被扭?br /><br />//render-to-texture<br />g_App.GetDevice()->SetRenderTarget(0,pRenderSurface); //set new render target<br />g_App.GetDevice()->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(100,100,100),1.0f,0); //clear texture<br />g_App.GetDevice()->BeginScene();<br /><br />g_App.GetDevice()->SetTexture(0,pPyramideTexture);<br /><br />D3DXMatrixRotationY(&matRotationY,fRotation);<br />D3DXMatrixTranslation(&matTranslation,0.0f,0.0f,5.0f);<br />g_App.GetDevice()->SetTransform(D3DTS_WORLD,&(matRotationY * matTranslation));<br />g_App.GetDevice()->SetTransform(D3DTS_PROJECTION,&matProjection); //set projection matrix<br /><br />g_App.GetDevice()->SetStreamSource(0,pTriangleVB,0,sizeof(D3DVERTEX));<br />g_App.GetDevice()->DrawPrimitive(D3DPT_TRIANGLELIST,0,4);<br /><br />g_App.GetDevice()->EndScene();<br /><br />   渲染循环的第二部分就是渲染最后场景的q程Q也是昄到屏q上的过E)。渲染对象重新设为后台缓冲区Q投q阵重新设为原来的投媄矩阵。由于纹理已l准备好了,所以它和纹理层0相关联?br /><br />//render scene with texture<br />g_App.GetDevice()->SetRenderTarget(0,pBackBuffer); //set back buffer<br />g_App.GetDevice()->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);<br />g_App.GetDevice()->BeginScene();<br /><br />g_App.GetDevice()->SetTexture(0,pRenderTexture); //set rendered texture<br /><br />g_App.GetDevice()->SetTransform(D3DTS_WORLD,&matTranslation);<br />g_App.GetDevice()->SetTransform(D3DTS_PROJECTION,&matOldProjection); //restore projection matrix<br /><br />g_App.GetDevice()->SetStreamSource(0,pQuadVB,0,sizeof(D3DVERTEX));<br />g_App.GetDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);<br /><br />g_App.GetDevice()->EndScene();<br />g_App.GetDevice()->Present(NULL,NULL,NULL,NULL);<br /><br />最后我们通过调用Release()Ҏ释放Surface对象?br /><br />pRenderSurface->Release();<br />pRenderSurface = NULL;<br /><br />pBackBuffer->Release();<br />pBackBuffer = NULL;<br /><br />   渲染到纹理能让你做很多事情,但是你必L意一些限制。首先深度缓冲区必须L大于或等于渲染对象的大小。此外,渲染对象和深度缓冲区的格式必M致?img src ="http://www.shnenglu.com/mybios/aggbug/15271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-16 23:58 <a href="http://www.shnenglu.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 点U理白皮书中文版http://www.shnenglu.com/mybios/archive/2006/11/16/15270.html李锦?mybios)李锦?mybios)Thu, 16 Nov 2006 15:57:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/16/15270.htmlhttp://www.shnenglu.com/mybios/comments/15270.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/16/15270.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15270.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15270.html阅读全文

李锦?mybios) 2006-11-16 23:57 发表评论
]]>
【{贴】那是什么鬼东西? Pick!!是物g拑֏Q?/title><link>http://www.shnenglu.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.shnenglu.com/mybios/archive/2006/11/16/15256.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15256.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/16/15256.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15256.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15256.html</trackback:ping><description><![CDATA[     摘要: W九?那是什么鬼东西   惌vW一ơ面对StarCraft的主界面, 看到旋{的星? 晃着脑袋的卫? ? , 那是什?   想知? ? 把鼠标移上去, 它会告诉你的Who am I. ...  <a href='http://www.shnenglu.com/mybios/archive/2006/11/16/15256.html'>阅读全文</a><img src ="http://www.shnenglu.com/mybios/aggbug/15256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-16 19:57 <a href="http://www.shnenglu.com/mybios/archive/2006/11/16/15256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{贴】泛型粒子系l的设计http://www.shnenglu.com/mybios/archive/2006/11/16/15255.html李锦?mybios)李锦?mybios)Thu, 16 Nov 2006 11:53:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/16/15255.htmlhttp://www.shnenglu.com/mybios/comments/15255.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/16/15255.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15255.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15255.html阅读全文

李锦?mybios) 2006-11-16 19:53 发表评论
]]>
【{贴】多重纹理的应用http://www.shnenglu.com/mybios/archive/2006/11/16/15227.html李锦?mybios)李锦?mybios)Thu, 16 Nov 2006 08:33:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/16/15227.htmlhttp://www.shnenglu.com/mybios/comments/15227.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/16/15227.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15227.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15227.html阅读全文

李锦?mybios) 2006-11-16 16:33 发表评论
]]>
【原创】《DirectX 9 3D 囑ŞE序设计?Tutorial 06 U理贴图以及U理坐标变换Q纹理动画)http://www.shnenglu.com/mybios/archive/2006/11/16/15212.html李锦?mybios)李锦?mybios)Thu, 16 Nov 2006 03:15:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/16/15212.htmlhttp://www.shnenglu.com/mybios/comments/15212.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/16/15212.html#Feedback1http://www.shnenglu.com/mybios/comments/commentRss/15212.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15212.html阅读全文

李锦?mybios) 2006-11-16 11:15 发表评论
]]>
【原创】《DirectX 9 3D 囑ŞE序设计?Tutorial 05 光照pȝhttp://www.shnenglu.com/mybios/archive/2006/11/16/15211.html李锦?mybios)李锦?mybios)Thu, 16 Nov 2006 03:09:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/16/15211.htmlhttp://www.shnenglu.com/mybios/comments/15211.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/16/15211.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15211.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15211.html阅读全文

李锦?mybios) 2006-11-16 11:09 发表评论
]]>
【原创】《DirectX 9 3D 囑ŞE序设计?Tutorial 04 矩阵变换http://www.shnenglu.com/mybios/archive/2006/11/16/15210.html李锦?mybios)李锦?mybios)Thu, 16 Nov 2006 03:03:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/16/15210.htmlhttp://www.shnenglu.com/mybios/comments/15210.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/16/15210.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15210.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15210.html阅读全文

李锦?mybios) 2006-11-16 11:03 发表评论
]]>
【原创】《DirectX 9 3D 囑ŞE序设计?Tutorial 03 使用索引~冲?/title><link>http://www.shnenglu.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.shnenglu.com/mybios/archive/2006/11/16/15208.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15208.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/16/15208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15208.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15208.html</trackback:ping><description><![CDATA[     摘要: 渲染之前记得g_pd3dDevice->SetIndices(g_pIB);而且要用g_pd3dDevice->DrawIndexedPrimitive来渲染烦引缓冲区   1 #include  < D3DX9.h >   2 ...  <a href='http://www.shnenglu.com/mybios/archive/2006/11/16/15208.html'>阅读全文</a><img src ="http://www.shnenglu.com/mybios/aggbug/15208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-16 10:59 <a href="http://www.shnenglu.com/mybios/archive/2006/11/16/15208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】《DirectX 9 3D 囑ŞE序设计?Tutorial 02 创徏点~冲区容易犯错的地方http://www.shnenglu.com/mybios/archive/2006/11/16/15206.html李锦?mybios)李锦?mybios)Thu, 16 Nov 2006 02:47:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/16/15206.htmlhttp://www.shnenglu.com/mybios/comments/15206.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/16/15206.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15206.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15206.html阅读全文

李锦?mybios) 2006-11-16 10:47 发表评论
]]>
【原创】《DirectX 9 3D 囑ŞE序设计?Tutorial 01 Ҏ犯错的地?/title><link>http://www.shnenglu.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.shnenglu.com/mybios/archive/2006/11/16/15205.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15205.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/16/15205.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15205.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15205.html</trackback:ping><description><![CDATA[手写Tutorial 01例子是创建WindowsH口Qƈ创徏D3D讑֤?br /><br /><br />97行,PeekMessage(&msg , 0 , 0 , 0 , PM_REMOVE)W二个参数如果改成PeekMessage(&msg , hWnd , 0 , 0 , PM_REMOVE)׃出现无法退出程序的问题Q请注意Q?br /><br />44行,g_pd3dDevice->Present(0 , 0 , 0 , 0);q句话千万不要漏掉哦Q否则就会显CӞ<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.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">d3dx9.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">  2</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">  3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> SAFE_RELEASE(o) {if(o){o->Release();o=0;}}</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">  4</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">  5</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">  8</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 15</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 16</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    memset(</span><span style="COLOR: #000000">&</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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 22</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    GetClientRect(hWnd , </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">rect);<br /></span><span style="COLOR: #008080"> 24</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 27</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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">-></span><span style="COLOR: #000000">CreateDevice(D3DADAPTER_DEFAULT<br /></span><span style="COLOR: #008080"> 28</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        , hWnd<br /></span><span style="COLOR: #008080"> 30</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        , </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">d3dpp , </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">g_pd3dDevice<br /></span><span style="COLOR: #008080"> 32</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        )))<br /></span><span style="COLOR: #008080"> 33</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /></span><span style="COLOR: #008080"> 35</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 38</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    g_pd3dDevice</span><span style="COLOR: #000000">-></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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    g_pd3dDevice</span><span style="COLOR: #000000">-></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.shnenglu.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.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 47</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 53</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        CleanUp();<br /></span><span style="COLOR: #008080"> 60</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 69</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    memset(</span><span style="COLOR: #000000">&</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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 注册H口c?/span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 79</span><span style="COLOR: #008000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    RegisterClass(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">wndClass);<br /></span><span style="COLOR: #008080"> 80</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 81</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 创徏H口</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 82</span><span style="COLOR: #008000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 86</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 昄H口</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 87</span><span style="COLOR: #008000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 90</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        memset(</span><span style="COLOR: #000000">&</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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(PeekMessage(</span><span style="COLOR: #000000">&</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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />                DispatchMessage(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">msg);<br /></span><span style="COLOR: #008080">100</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />                TranslateMessage(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">msg);<br /></span><span style="COLOR: #008080">101</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />                Render();<br /></span><span style="COLOR: #008080">105</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">109</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    CleanUp();<br /></span><span style="COLOR: #008080">110</span><span style="COLOR: #000000"><img src="http://www.shnenglu.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.shnenglu.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.shnenglu.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.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">114</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">115</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span></div><img src ="http://www.shnenglu.com/mybios/aggbug/15205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-16 10:38 <a href="http://www.shnenglu.com/mybios/archive/2006/11/16/15205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.jjzrhg.cn" target="_blank">þþwww˳ɾƷ</a>| <a href="http://www.tzcn86.cn" target="_blank">˾þþùۿëƬ</a>| <a href="http://www.indmc.cn" target="_blank">޹˾þۺҰ</a>| <a href="http://www.rszgrh2.cn" target="_blank">þۺϳDž</a>| <a href="http://www.hit5.cn" target="_blank">þۺɫHEZYO</a>| <a href="http://www.t6s.com.cn" target="_blank">þþƷˬӰ</a>| <a href="http://www.gynp.net.cn" target="_blank">޾Ʒþþþsm</a>| <a href="http://www.szltw.cn" target="_blank">þseƷһƷ</a>| <a href="http://www.dnsdna.cn" target="_blank">þ޹˾Ʒ</a>| <a href="http://www.sunmuying.cn" target="_blank">Ƭѹۿþ</a>| <a href="http://www.anatolia.com.cn" target="_blank">鶹˾þþƷ</a>| <a href="http://www.tpjh.com.cn" target="_blank">ƷþavĻ</a>| <a href="http://www.qcwxfw.cn" target="_blank">Ʒþþþþþþþ</a>| <a href="http://www.u4439.cn" target="_blank">þþþһƷɫ</a>| <a href="http://www.xishuixian.com.cn" target="_blank">Ʒҹþ</a>| <a href="http://www.lady8.cn" target="_blank">www.þ</a>| <a href="http://www.qancen.cn" target="_blank">þݺҹҹ </a>| <a href="http://www.grayhound.cn" target="_blank">һaɫƬþ</a>| <a href="http://www.dgzcwdlaw.cn" target="_blank">97Ʒ˾þþô߽</a>| <a href="http://www.3-gold.cn" target="_blank">칫ҾþþƷ</a>| <a href="http://www.fvnnv.cn" target="_blank">wwwþþcom</a>| <a href="http://www.uucity.com.cn" target="_blank">Ʒþþþþ </a>| <a href="http://www.wangzhuanzhe.cn" target="_blank">þþþþþ99Ʒѹۿ</a>| <a href="http://www.qdyshl.cn" target="_blank">ھƷþþþþĻ</a>| <a href="http://www.020rj.cn" target="_blank">AV12þ</a>| <a href="http://www.imlee.com.cn" target="_blank">޹˾þþƷ99</a>| <a href="http://www.baomintv.cn" target="_blank">þĻȫ</a>| <a href="http://www.ovyp.cn" target="_blank">þþƷAV뽿ɫ</a>| <a href="http://www.lampserver.cn" target="_blank">þþƷ99þþ㽶</a>| <a href="http://www.54wk.cn" target="_blank">ձһþ</a>| <a href="http://www.alexa178.cn" target="_blank">˾þô߽ۺͼƬ</a>| <a href="http://www.sh-ar.cn" target="_blank">þ</a>| <a href="http://www.seatravel.com.cn" target="_blank">ŮƷþþ</a>| <a href="http://www.carswg.cn" target="_blank">ƷžžþƵ </a>| <a href="http://www.tgl999.cn" target="_blank">þþþþþž99Ʒ</a>| <a href="http://www.pc36.cn" target="_blank">ɫۺϾþ߹ۿ</a>| <a href="http://www.fragmentdesign.cn" target="_blank">þ99Ʒþ99ý</a>| <a href="http://www.blueheaven.com.cn" target="_blank">7777þþùƷ</a>| <a href="http://www.haiyunfu.cn" target="_blank">޳avƬþ</a>| <a href="http://www.lnkbl.com.cn" target="_blank">þþþ?V</a>| <a href="http://www.bassaphoto.cn" target="_blank">þþþƵ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>