


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘要实现三维模型的动态效果的方法和软件很多,本次设计选用是Direct3D,根据以前所学的广告技术和十字交叉纹理技术将静态的三维模型简化我为一副二维图片的方法,再次使用二维的图片来代替动态的三维模型,并通过连续贴图动画技术实现三维模型的动态效果。本实验设计采用基于纹理动画技术的爆炸效果模拟为研究课题展开研究。实验发现采用连续贴图动画技术实现动画效果,可以节省了对系统的开销,系统运行速度比较快,效果比较好,特别是对于爆炸这样的瞬间,采用这种方法比较合适,但是对于持续时间比较长的动画效果,如燃烧、喷泉、瀑布等,则比较容易露出破绽,那是我们可以采用粒子系统来实现动画效果。关键词 广告板技术 十字交叉
2、纹理技术 连续贴图动画技术 粒子系统 Direct3D 17目录第1章 绪 论 11.1问题的提出 11.2现有系统存在问题的分析11.3系统开发目标 11.4实验工具的选择 11.5实验的意义 2第2章 实验的基本理论 22.1广告板技术 22.2动画纹理技术 3第3章 实验设计的主体内容 43.1实验内容介绍 43.1 实验设计的思路 53.2实验实现的主要过程与效果 5第4章 结果分析与讨论9致谢 10参考文献 10附录一: 广告板技术图片实例主要的源代码: 11附录二: 实验TextureAnimation.cpp的主要源代码:13第一章 绪论本次实验设计以广告板技术和十字交叉纹理技术
3、将静态的三维模型简化为一副二维的图片方法为背景,论述了如何通过连续贴图动画技术实现三维模型的动态效果。全文共分为绪论、实验的基本原理、实验设计的主题内容、结果分析与讨论、总结、致谢、参考文献、附录等。1.1 问题的提出我们通过广告板技术或十字交叉纹理技术将静态的三维模型简化为一副二维的图片,这样大大节省了系统的资源,那么我们是否可以再次使用二维的图片来代替动态的三维模型,从而实现三维模型的动态效果?1.2现有系统存在的问题 在三维场景中,渲染一个三维物体是很耗资源的,然而用户的需求是无止境的,谁都希望场景内的图像越生动越好。但是场景中的三维物体越多,越复杂,程序的运行速度将越慢,运行效率将越低
4、,最后实现的效果越差。1.3系统开发的目标增加场景内图像的生动程度的同时降低系统资源的损耗,提高程序的运行速率和效果。1.4 实验工具的选择Direct3D提供了一套强有力的工具来帮助我们提高三维场景的逼真度,它是微软公司于1996年为PC开发的API,与Windows 95 、Windows NT和Power Mac操作系统兼容性好,可绕过图形显示接口(GDI)直接进行支持该API的各种硬件的底层操作,大大提高了游戏的运行速度,而且目前基本上是免费使用的。由于要考虑与各方面的兼容性,DirectX用起来比较麻烦、在执行效率上也未见得最优,在实际3DS MAX的运用中效果一般,还会发生显示错误
5、,但是比用软件加速快。1.5本实验的意义三维物体最重要的是渲染,当渲染多个复杂的三维图像是能够增加对系统资源的损耗,随着系统资源的损耗,三维物体的实现效果将降低。通过本实验可以降低对系统资源的损耗,实现对三维世界进行再一次简化。第二章 实验的基本理论2.1 广告板技术当我们创建一个三维场景时,我们可以通过对一些看起来具有三维效果的二维对象进行渲染的方法来提高性能。公告板技术正是出于这种思想来考虑的。通常,广告板就是指路边的一些告示牌。Direct3D程序中,可以通过定义一个固定的矩形并对它使用纹理的方法来创建和渲染这样一种公告板。三维图形学中的广告板就是这种广告板的一种扩展。它的目的就是使二维
6、对象能够看起来具有三维效果。这项技术将一幅包含了对象图象的纹理应用到一个矩形图元上。这个图元随着观察者不断旋转,使它总能朝向观察者。我们不用考虑对象的图象是否是矩形。广告板上的某些地方可以是透明的,这样就能使我们不想见到的公告板图象的某些部分变得不可见。许多游戏都对它们的动画精灵使用公告板技术。例如,当我们在一个三维迷宫中行走时,我们可能会看到一些武器或者其他一些奖品,并且能够拾起它们。这些物品通常都是将一些二维纹理图象应用到一个矩形图元上生成的。我们还经常使用公告板技术来渲染场景中的树木和灌木丛等的图象。当我们要将一个图象应用到一个广告板时,我们首先得将矩形图元进行旋转,使图象能够朝向观察者
7、的方向。然后,程序将它平移到所需的位置。接着,就可以将纹理应用到图元上了。广告板技术的核心思想是:对于场景内一些不是特别重要的三维物体,我们可以退而求其次,首先创建一个矩形,然后将该三维物体的二维相片作为纹理赋给该矩形;同时根据观察者点的位置,实时的旋转该二维图片,使它总是面向观察点,从而用一个二维的图片代替了这个三维网格模型。这样一来,既节省了相当多的资源,也不使用户感觉到失真。此外,要注意的一点是,在渲染该二维图片时,需要进行透明处理,这样才能使图像后面的场景内容不被图片中的空白部分所遮挡。广告板技术最好能用于对称的物体,特别是沿垂直方向对称的物体。它还要求观察者的水平高度不能太高,否则就
8、有可能很明显的感觉到对象是二维的,而不是三维的。如图为编写的广告板实例:(源代码见附录一)2.2纹理动画技术 动画技术也称纹理动画技术,我们通过使用纹理技术来产生一些特殊效果或增加真实感等。通过多纹理或多通道融合,Direct3D使程序可以细节纹理应用到图元上。使用细节纹理,可以在表面上产生磨损的痕迹、凹凸的表面以及其他一些表面属性。凹凸映射纹理技术可以为一个图元创建具有复杂纹理的表面。特别是对于光滑的表面,效果明显。细节纹理还可以被用作深度提示(depth cue)。例如,我们现在要模拟一架正在着陆的直升机。当直升机接近地面时,由于放大,地面纹理会变得模糊不清。这时,我们要区分到地面的距离就
9、会有一定困难。如果我们对地面使用了类似于沙砾等物体的细节纹理,我们就可以获得足够的深度提示来正确的操纵降落的直升机。如果观察者远离图元,我们大概不会想得到很多的细节展示。但要注意,当程序不使用细节纹理时,图元可能会看起来更加明亮一些。这时,我们可以通过使用一个光线映射纹理使图元变暗来进行补偿。它的内容其核心思想与广告板技术或十字交叉纹理技术有类似的地方:首先创建一个矩形,并为这个矩形创建一个纹理数组,将该三维物体运动时的一系列二维图片作为该纹理数组的每个元素,按先后次序存放到数组中。然后按照一定的时间间隔,连续的切换矩形的纹理。当时间间隔很小,且图片之间的差异较小时,这些连续的图片就可以实现三
10、维模型的运动效果。事实上,连续贴图动画就是将多幅连续的图像按照一定的顺序以一定的时间间隔显示出来。例如,图1所示的是模拟爆炸效果的16幅图像,我们将这16副图像逐次显示出来,并采用透明纹理映射技术就可以模拟出爆炸过程这一特殊效果。 图17.1 连续贴图动画示例第三章 实验设计的主题内容3.1实验内容的介绍是利用化工技术表现出的效果,在特殊效果领域中占很重要的地位。一般用爆破Miniature或用CG合成渲染影像,跟其它部分连起来使用。因火药的制作方法不同,火焰的形态和颜色也不同。炸药的安装位置和用量决定爆炸时场面的形态。因此这是相当依赖经验和理论的专业领域。在互联网中查找跟Pyrotechni
11、c有关的站点就很容易找到详细说明爆破效果理论的主页。拍摄真正的爆破场面不是件容易的事情。因此利用装有Real Motion, Pyromania, Fire Effect等爆破场面的CD-ROM或 Max的After Burn, Light Wave的Hyper Boxell等也是一种办法。Hyper Boxell或 After Burn是应用Volume Metric和Shaer的插件。因此使用得当,就能得到非常逼真的效果。特别是After Burn, 在电影“Armageddon(绝世天劫,华纳,1998)”中用过,很有名气。但是After Burn 的渲染时间比Hyper Boxell慢
12、得多,质量方面因很久没有做过比较,不能断定,可能不相上下。爆破效果的引入会使我们设计的三维动画效果更加出色。所以我们就以爆炸效果为实验目标,对纹理动画技术进行改进。3.2实验设计思路设置入口函数应用程序的相关初始化检查设备能力修改Direct3D渲染设备设置创建管理内存资源对象创建默认内存类型资源对象更新场景渲染文本各种信息的处理3.2实验实现的主要过程与效果我们通过程序TextureAnimation.cpp进行如何在Direct3D中用连续贴图动画技术实现三维模型的运动效果的实验。该程序使用25副连续贴图实现了爆炸动画效果。其中使用连续贴图动画技术的核心步骤有两步。第一步,创建用来播放连续
13、贴图动画纹理的矩形顶点缓冲区m_MeshVB,同时创建了25副实现连续贴图动画的纹理。核心代码如下:/创建矩形顶点缓冲区hr= pd3dDevice-CreateVertexBuffer(sizeof(SHINEVERTEX)*4, 0, SHINEVERTEX:FVF, D3DPOOL_MANAGED, &m_MeshVB, NULL);if(FAILED(hr) MessageBox(NULL, LCreate Rect Vertex Buffer Error!, L, MB_OK);return hr;/填充矩形顶点缓冲区SHINEVERTEX* pVertices;m_MeshVB-L
14、ock(0, 0, (void*)&pVertices, 0);pVertices-vPos = D3DXVECTOR3(-1.0f,-1.0f, 0.0f); /第一个顶点/改变坐标 pVertices-vTex = D3DXVECTOR2(0.0f, 1.0f); /改变纹理pVertices+;pVertices-vPos = D3DXVECTOR3(-1.0f, 1.0f, 0.0f); /第二个顶点pVertices-vTex = D3DXVECTOR2(0.0f, 0.0f);pVertices+;pVertices-vPos = D3DXVECTOR3(1.0f,-1.0f, 0
15、.0f); /第三个顶点pVertices-vTex = D3DXVECTOR2(1.0f, 1.0f);pVertices+;pVertices-vPos = D3DXVECTOR3(1.0f, 1.0f, 0.0f); /第四个顶点pVertices-vTex = D3DXVECTOR2(1.0f, 0.0f);m_MeshVB-Unlock();/创建纹理D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode00.dds, &m_pddsShineTextures0);D3DXCreateTextureFromFile(pd3dDevi
16、ce, Lsimple_explode01.dds, &m_pddsShineTextures1);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode02.dds, &m_pddsShineTextures2);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode03.dds, &m_pddsShineTextures3);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode04.dds, &m_pddsShineTextures4
17、);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode05.dds, &m_pddsShineTextures5);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode06.dds, &m_pddsShineTextures6);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode07.dds, &m_pddsShineTextures7);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_
18、explode08.dds, &m_pddsShineTextures8);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode09.dds, &m_pddsShineTextures9);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode10.dds, &m_pddsShineTextures10);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode11.dds, &m_pddsShineTextures11);D3DXCrea
19、teTextureFromFile(pd3dDevice, Lsimple_explode12.dds, &m_pddsShineTextures12);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode13.dds, &m_pddsShineTextures13);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode14.dds, &m_pddsShineTextures14);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode
20、15.dds, &m_pddsShineTextures15);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode16.dds, &m_pddsShineTextures16);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode17.dds, &m_pddsShineTextures17);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode18.dds, &m_pddsShineTextures18);D3DXCreateTex
21、tureFromFile(pd3dDevice, Lsimple_explode19.dds, &m_pddsShineTextures19);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode20.dds, &m_pddsShineTextures20);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode21.dds, &m_pddsShineTextures21);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode22.dd
22、s, &m_pddsShineTextures22);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode23.dds, &m_pddsShineTextures23);D3DXCreateTextureFromFile(pd3dDevice, Lsimple_explode24.dds, &m_pddsShineTextures24);其中,SHINEVERTEX是我们预先定义的存放连续贴图动画数据的结构体:struct TREEVERTEX D3DXVECTOR3 vPos;D3DXVECTOR2 vTex;static const D
23、WORD D3DFVF_TREEVERTEX = D3DFVF_XYZ | D3DFVF_TEX1;这段代码的运行结果是,顶点缓冲区m_MeshVB中存储了作为连续动画载体的矩形的顶点数据,纹理数组m_pTreeTex中存储了用来实现连续贴图动画的25副纹理。第二步,根据时间间隔,渲染不同的纹理实现爆炸动画效果。核心代码如下:static int dwShineTick = 0; /用静态变量记录当前应显示第几副纹理static FLOAT fLastTime = 0.0f; /记录上一副纹理显示的绝对时间if( fTime - fLastTime 0.1f )fLastTime = fTim
24、e;if( +dwShineTick 24 ) dwShineTick = 0;/设置纹理pd3dDevice-SetTexture( 0, m_pddsShineTexturesdwShineTick );pd3dDevice-SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );pd3dDevice-SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );pd3dDevice-SetSamplerState( 0, D3DSAMP_MINFILTER, D3DT
25、EXF_LINEAR );pd3dDevice-SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );pd3dDevice-SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);pd3dDevice-SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);pd3dDevice-SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);/渲染pd3dDevice-SetStreamSource(0, m_Mes
26、hVB, 0, sizeof(SHINEVERTEX);pd3dDevice-SetFVF(SHINEVERTEX:FVF);pd3dDevice-DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);这里我们用静态变量dwShineTick记录当前应该显示第几副纹理,同时用静态变量fLastTime记录上一副纹理显示的绝对时间。函数OnFrameRender()的接口参数fTime为我们提供了当前的绝对时间。如果当前绝对时间与上一副纹理显示时的绝对时间的差值超过了我们指定的时间间隔0.1,则更换纹理。这时,首先判断当前纹理是不是最后一幅纹理,即判断dwShineT
27、ick是否大于24,如果不是,则dwShineTick加一,表示将下一副纹理应用到矩形中进行渲染;如果当前纹理是最后一幅纹理时,则将dwShineTick重新设置为0,表示将矩形的纹理设置为第一副纹理从头开始重新进行渲染。也就是说,程序TextureAnimation.cpp中的纹理动画是循环播放的。随后的工作就是设置纹理渲染状态并进行矩形的渲染,这些内容我们都已经非常熟悉,这里就不再赘述了。程序TextureAnimation.cpp的运行结果如图所示:(完整代码见附录二)第四章 结果分析与讨论通过此次实验,我们认识到连续贴图动画技术实际上就是将一系列连续的图像逐次“贴”到一个矩形对象上,也
28、就是将这些连续的图像在矩形上播放出来。在具体应用时,还可以结合广告板技术一同使用,使矩形对象总是面对观察者。采用连续贴图动画技术实现动画效果,可以节省对系统资源的开销,运行速度比较快。对于像爆炸这样的瞬间动画,采用连续贴图动画技术就比较合适,关键是纹理贴图要制作的逼真。但是根据对实验的多次改进与进行,我们发现对于那些持续时间比较长的动画效果,如燃烧、喷泉、瀑布等,则容易漏出破绽。所以此时连续贴图动画技术不再使用,但可以采用粒子系统实现这些动画效果。对此我们暂时不做研究。致谢:参考文献: 1 黄兴芳 动画原理M. 上海人民美术出版社,2004.01第1版2005.07第3次印刷2 沈晴霓,聂青,
29、苏京霞.现代程序设计C+与数据结构面向对象的方法与实现M. 北京:北京理工大学出版社,2002.83 英.克里斯帕特莫尔 动画设计基础教程 M. 上海人民美术出版社 2005.06第1版2005.06第1次印刷4 耿肇英 Direct 3D和XNA游戏开发基础 清华大学出版社5 叶至军 Visual C+/DirectX9 3D游戏开发导引 = = Game programming tutorials 人民邮电出版社6 王德才,杨关胜,孙玉萍 精通DirectX 3D图形与动画程序设计 人民邮电出版社附录一:广告板技术图片实例主要的源代码:./-/ Desc: 渲染场景/-void CALLB
30、ACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext ) HRESULT hr; /如果正在利用Direct3D设备设置对话框进行设置, 则不渲染场景 if( g_SettingsDlg.IsActive() ) g_SettingsDlg.OnRender( fElapsedTime ); return; /清除后台颜色缓冲区和深度缓冲区 V( pd3dDevice-Clear(0, NULL, D3DCLEAR_TARGET | D3DCLE
31、AR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) ); /渲染场景 if( SUCCEEDED( pd3dDevice-BeginScene() ) ) /渲染地面 pd3dDevice-SetTransform( D3DTS_WORLD, &g_matGround ); pd3dDevice-SetTexture( 0, g_pGroundTex ); pd3dDevice-SetStreamSource( 0, g_pGroundVB, 0, sizeof(CUSTOMVERTEX) ); pd3dDevice-SetFVF( D3DF
32、VF_CUSTOMVERTEX ); pd3dDevice-DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 ); /渲染树木 pd3dDevice-SetTransform( D3DTS_WORLD, &g_matTree ); pd3dDevice-SetTexture( 0, g_pTreeTex ); pd3dDevice-SetStreamSource( 0, g_pTreeVB, 0, sizeof(CUSTOMVERTEX) ); pd3dDevice-SetFVF( D3DFVF_CUSTOMVERTEX ); pd3dDevice-DrawPr
33、imitive( D3DPT_TRIANGLESTRIP, 0, 2 ); /渲染文本和对话框 DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, LHUD / Stats ); RenderText(); V( g_HUD.OnRender( fElapsedTime ) ); V( g_SampleUI.OnRender( fElapsedTime ) ); DXUT_EndPerfEvent(); V( pd3dDevice-EndScene() ); /-/ Desc: 渲染文本/-void RenderText() CDXUTTextHelper tx
34、tHelper( g_pFont, g_pTextSprite, 15 ); /显示当前Direct3D设备状态和渲染帧速率 txtHelper.Begin(); txtHelper.SetInsertionPos( 5, 5 ); txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) ); txtHelper.DrawTextLine( DXUTGetFrameStats(true) ); txtHelper.DrawTextLine( DXUTGetDeviceStats() ); /显示其他简要信息 txtHe
35、lper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) ); txtHelper.DrawTextLine( LBillBoard技术演示 ); /显示简单帮助文本 const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetBackBufferSurfaceDesc(); if( g_bShowHelp ) txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer-Height-15*6 ); txtHelper.SetForegroundColor(
36、 D3DXCOLOR( 1.0f, 0.75f, 0.0f, 1.0f ) ); txtHelper.DrawTextLine( LControls (F1 to hide): ); txtHelper.SetInsertionPos( 40, pd3dsdBackBuffer-Height-15*5 ); txtHelper.DrawTextLine( LQuit: ESC ); else txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer-Height-15*2 ); txtHelper.SetForegroundColor( D3DXCOLOR
37、( 1.0f, 1.0f, 1.0f, 1.0f ) ); txtHelper.DrawTextLine( LPress F1 for help ); txtHelper.End();附录二:实验TextureAnimation.cpp的主要源代码:/-/ Desc: 入口函数/-INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) /为Debug配置启用运行时内存检查功能#if defined(DEBUG) | defined(_DEBUG) _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_
38、LEAK_CHECK_DF );#endif /设置回调函数 DXUTSetCallbackDeviceCreated( OnCreateDevice ); DXUTSetCallbackDeviceReset( OnResetDevice ); DXUTSetCallbackDeviceLost( OnLostDevice ); DXUTSetCallbackDeviceDestroyed( OnDestroyDevice ); DXUTSetCallbackMsgProc( MsgProc ); DXUTSetCallbackKeyboard( KeyboardProc ); DXUTSe
39、tCallbackFrameRender( OnFrameRender ); DXUTSetCallbackFrameMove( OnFrameMove );/应用程序相关的初始化InitApp();/初始化DXUT, 创建窗口, 创建Direct3D设备对象DXUTInit( true, true, true );DXUTSetCursorSettings( true, true );DXUTCreateWindow( LTextureAnimation );DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAccep
40、table, ModifyDeviceSettings );/进入消息循环和场景渲染DXUTMainLoop();/在此进行应用程序相关的清除工作return DXUTGetExitCode();/-/ Desc: 应用程序相关初始化/-void InitApp() /初始化对话框 g_SettingsDlg.Init( &g_DialogResourceManager ); g_HUD.Init( &g_DialogResourceManager ); g_SampleUI.Init( &g_DialogResourceManager );/为g_HUD对话框设置消息处理函数,添加控件 g_
41、HUD.SetCallback( OnGUIEvent ); int iY = 10; g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, LToggle full screen, 35, iY, 125, 22 ); g_HUD.AddButton( IDC_TOGGLEREF, LToggle REF (F3), 35, iY += 24, 125, 22 ); g_HUD.AddButton( IDC_CHANGEDEVICE, LChange device (F2), 35, iY += 24, 125, 22, VK_F2 );/-/ Desc: 设备能力检
42、查/-bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )/检查后台缓冲区格式是否支持Alpha混合等操作(post pixel blending operations) IDirect3D9* pD3D = DXUTGetD3DObject(); if( FAILED( pD3D-CheckDeviceFormat( pCaps-AdapterOrdinal, pCa
43、ps-DeviceType, AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_TEXTURE, BackBufferFormat ) ) ) return false; return true;/-/ Desc: 修改Direct3D渲染设备设置/-bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext ) /如果不支持硬件顶点处理则使用软件
44、顶点处理 if( (pCaps-DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) = 0) pDeviceSettings-BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING; /如果使用参考设备,则弹出警告对话框 static bool s_bFirstTime = true; if( s_bFirstTime ) s_bFirstTime = false; if( pDeviceSettings-DeviceType = D3DDEVTYPE_REF ) DXUTDisplaySwitchingToREF
45、Warning(); return true;/-/ Desc: 在此创建管理内存资源对象/-HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ) HRESULT hr; V_RETURN( g_DialogResourceManager.OnCreateDevice( pd3dDevice ) ); V_RETURN( g_SettingsDlg.OnCreateDevice( pd3d
46、Device ) ); /创建字体 V_RETURN( D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, LArial, &g_pFont ) );/创建顶点缓冲区 V_RETURN( pd3dDevice-CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED,
47、 &g_pVB, NULL ); CUSTOMVERTEX vertices = -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, , -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, , 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, , 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, ; VOID* pVertices; if( FAILED( g_pVB-Lock( 0, sizeof(vertices), (void*)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, vertices, sizeof(vertices) );g_pVB-Unlock();/创建纹理V_RETURN( D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西藏自治区水利厅直属事业单位招聘考试真题2025
- 中国脯氨酸项目创业投资方案
- 城西小学考试题目及答案
- 化工管道考试试题及答案
- 河南市政考试试题及答案
- 重庆中烟工业公司笔试试题2025
- 2025年生活垃圾分类处置建设项目可行性研究报告写作模板
- 国企入职考试试题及答案
- 国际营销考试试题及答案
- 2025年政务大数据项目可行性分析报告
- 电工电子技术全套课件(完整版)
- 二十碳五烯酸乙酯软胶囊-临床用药解读
- 《水电工程水生生态调查与评价技术规范》(NB-T 10079-2018)
- 【川教版】《生命+生态+安全》三年级上册++第8课《呵护我们的眼睛》课件
- 投资款收款收条
- 企业环境法律知识讲座
- 拒绝假努力让学习扎根(主题班会)
- 267条表情猜成语【动画版】
- 科研课题立项评审评分参照标准
- 学而思七年级数学培优讲义全年级章节培优经典
- 汽轮机安全运行与维修综述课件
评论
0/150
提交评论