Direct3D
caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
-
3D游戏从入门到精通-20
有了上面绕着坐标轴旋转的矩阵,就可以轻松地构造我们的太阳系了。在我们太阳系中,太阳是自转的,在这个例子里要就要让太阳绕着Y轴自转。在让太阳旋转之前,就要先创建太阳这个物体,在这里我采用一个大圆球代表太阳。创建太阳圆球的程序如下: LPD3DXMESH m_pMeshSun; //太阳。D3DXMATRIX m_mSunSpin; //自转矩阵原创 2006-09-05 23:49:00 · 3940 阅读 · 0 评论 -
3D游戏从入门到精通-21
2.10.1灯光与材质在现实的世界里,没有光线,是什么东西也看不见的。在D3D的世界里,也是一样的。但是在D3D里有一种光线,是非常奇怪的,这种光线是没有方向,没有位置,整个世界全可以照亮的光线,它就是环境光,它其实有点像我们现实生活里的无影灯。在D3D里光线分为三种类型,分别是点光源、聚光灯和方向光。 材质就是说明物体是吸收什么样颜色的光线和反射什么样颜色的光线。在现实世界里,看到各原创 2006-09-08 00:03:00 · 3008 阅读 · 0 评论 -
3D游戏从入门到精通-22
聚光灯像汽车的远光灯发出的灯光,就是聚光灯。它有位置、方向和颜色。下面的就是聚光的例子显示的效果图: 聚光灯比点光源多了方向,还多了内光圈和外光圈了的角度。因此,初始化灯光的结构时,就需要设置它们才能让聚光灯有效里显示出来。程序初始化如下:////初始化灯光。//蔡军生 2006/09/03//void CCAISpotLight::InitLight(vo原创 2006-09-08 23:46:00 · 2963 阅读 · 0 评论 -
3D游戏从入门到精通-18
2.10.1矩阵变换在3D游戏里,要表达不同的东西,每样东西都在不同的位置。比如构造一个间教室,那么就需要根据黑板、讲台、座位来不同位置来放置。由于所有模型坐标都是局部坐标,都需要变换到世界坐标,才显示出正确位置。还有游戏里的很多物体是动起来的,就是位置会变化,大小会变化。比如模拟一辆小车开过马路,那么这辆车就需要水平运动起来,车轮还需要旋转起来。仔细看一下车轮,它不但作平移运动,还需要作自转原创 2006-09-02 21:12:00 · 3172 阅读 · 0 评论 -
3D游戏从入门到精通-26
在D3D里,纹理的功能是非常强大的,还有很多功能,比如纹理环绕、纹理动画、纹理重复、多重纹理、纹理溶合、立方体包围盒纹理、光线纹理、纹理管理等等。在这里先学习简单的纹理,并且灵活地使用它,后面再慢慢地深入去学习。下面就详细地解释第一个纹理例子。实现的纹理如下图所示: 从上面图片看到,纹理贴到两个三角形上面,就太像木板了。因此纹理在实现真实性起到很大的作用,目前的游戏都是大量地原创 2006-09-11 23:00:00 · 3055 阅读 · 0 评论 -
3D游戏从入门到精通-24
纹理的使用纹理是什么呢?在游戏里,又有什么样的作用呢?肯定有很多疑问在你的脑海里。在我们生活的世界里,丰富多彩环境,要是全部使用实时绘制,肯定是很费时间,并且目前的计算机,还达不到这种水平。既然计算机的有限计算能力,又想显示丰富多彩世界,那么只好使用纹理。比如要显示一个房子里大理石地板,就可以直接使用大理石图片,往地面一贴,就像真的大理石一样了。纹理提高了生成图像的真实性,呈现出丰富亮丽风境。原创 2006-09-10 19:34:00 · 2816 阅读 · 0 评论 -
3D游戏从入门到精通-28
加载网格模型文件在游戏里,最常的东西是什么呢?肯定是各种怪物和场境。比如在《传奇世界》就有很多猪和青铜兽。在3D游戏里,要显示一个地图,就需要加载网格模型文件来显示。比如像《半条命》里的练习场,就是一个3D模型文件。因此,游戏要显示的东西,大多是从文件里加载模型来显示的。游戏显示的模型都是比较复杂的,比前面所用到的三角形、立方体等模型,要复杂很多。如果每个模型都是用程序来实时创建,速度也是很慢原创 2006-09-13 00:25:00 · 3557 阅读 · 2 评论 -
打造免费的游戏开发环境
打造免费的游戏开发环境 目前,Windows用户占了全大多数,因此开发的游戏运行环境,就肯定是Windows了。而在windows开发中,开发工具的选择,肯定是微软的比较好。而游戏开发平台,最好的又是C++了,因为Windows和DirectX组件的开发,就是基于C和C++的。好了,现在就教你打造一个使用免费的微软VS2005中的VC++。 第一步:下载Visual C++ 200原创 2006-09-21 09:59:00 · 6016 阅读 · 0 评论 -
3D游戏从入门到精通-30
加载复杂网格模型上面都是简单的网格例子,并且只能作为演示作用,没有多少实用价值,下面来加载一个更复杂的网格模型。在我们玩过的游戏里,绝大多数都有室内场境的地方,比如到武器店里买东西,就需要有一个室内场境。在我们最常见的房子,大多数都是长方形的,也就是有6个面的立方体,而在这六个面贴上纹理,就是室内环境了。由于我没有美工,只能拿现成的网格模型来加载显示,模型文件放在目录G:/MM3D/Engin原创 2006-09-17 12:56:00 · 3652 阅读 · 1 评论 -
查找vc内存泄漏技巧
在写VC的程序经常发现有内存出错的情况,运行结束之后,就会有报告是否内存出现泄漏情况,如下面所示:Detected memory leaks!Dumping objects ->{223} normal block at 0x003CF650, 4 bytes long. Data: E8 F6 3C 00 {221} normal block at 0x003CF928, 16 bytes原创 2006-10-31 12:55:00 · 7396 阅读 · 2 评论 -
3D游戏从入门到精通-31
当我们看到现实世界里,有很多山地。那么这种山地,在3D世界里又是怎么样显示出来的呢?要模拟现实中的山地,就需要研究它怎么样构成,然后采用各种方法创建出来。在游戏的世界里,对于地形的要求是不严谨的,只要看起来像山地,就行了,而不像其它地理系统,一定要精确到跟现实世界里山比例一样。因此,在这里创建的3D地形,都是近似地模拟出来,这样就节省了很多工作,加快地形的显示,提高游戏速度的流畅性。这里介绍的原创 2006-11-23 23:23:00 · 3014 阅读 · 0 评论 -
3D游戏从入门到精通-32
前面已经编译好OGRE库,现在编译Helloworld工程就很快了。当然,在这个程序里也是设置为Debug的方式编译的,这样才能使用前面的OGRE的调试方式的库文件。点一下编译运行按钮,很快就看到一个漂亮的OGRE LOGO呈现在你的眼前,如下图所示:从这张美丽的画面里,看到一个古铜色的OGRE头像,在光源的照射下,闪亮着光泽,活灵活现的。左下角是一些重要信息,第一行是FPS的数,原创 2006-11-24 15:55:00 · 3151 阅读 · 0 评论 -
3D游戏从入门到精通-33
大体运行流程如下:1) WinMain函数:Windows程序入口。2) app.go()函数:应用程序框架运行函数。3) ExampleApplication::setup()函数:在这里初始化和创建场境的工作。4) Root::startRendering():开始渲染并进入消息循环。5) ExampleApplication::destroyScene():退出时删除所有原创 2006-11-27 14:33:00 · 3043 阅读 · 0 评论 -
3D游戏从入门到精通-3
2.10.1坐标系在D3D里使用的坐标系是左手坐标系,就是当你看屏幕时,左手边是X轴的负方向,右手边是X轴的正方向。屏幕下边是Y轴的负方向,屏幕上边是Y轴的正方向。远离屏幕是Z轴的负方向,指向屏幕里面是Z轴的正方向。坐标系还有右手坐标系,还有其它各种各样的坐标系。如果需要从其它坐标里的图形显示在D3D里,就需要进行转换。2.10.2点在三维空间里表示物体位置,就需要用坐标来表原创 2006-08-04 13:13:00 · 4055 阅读 · 0 评论 -
3D游戏从入门到精通-6
1、 顶点缓冲区顶点的数据是怎么样保存在内存里的呢?由于渲染需要,就要把顶点保存在内存缓冲区里。最简单的方法就是使用D3D提供的顶点缓冲区,即是使用IDirect3DVertexBuffer9接口的顶点缓冲区管理,它是通过D3D的设备来创建。这个接口实现顶点的资源管理,使用起来非常方便,由于它管理内存分配,这样就省了内存管理。下面就是通过IDirect3DDevice9原创 2006-08-09 13:14:00 · 3472 阅读 · 0 评论 -
3D游戏从入门到精通-4
2.10.1平面的表示3D空间里的物体都是实体的,主要由平面组成。比如正方体,就有6个平面。在D3D里组成三维物体的基本平面是三角形,无论是多么复杂的物体,都是有三角形组成的。并且D3D里支持显示最小的图形也是三角形,它是没有点和直线显示的。因此,要显示正方体,就需要把每个平面分成两个三角形,才能显示。如下图所示: 为什么选择三角形作为D3D里最小的平面呢?由于三个点组成的平面,原创 2006-08-06 00:42:00 · 3534 阅读 · 0 评论 -
3D游戏从入门到精通-2
21 介绍游戏2.11.1什么是游戏在《高级汉语大词典》中,“游戏”意为游乐、玩耍等,“游”意为游玩、结交、闲逛、学习等,“戏”有游戏、戏剧、角力等解释,而“玩”则有玩耍、欣赏、投入、反复体会等含义。从这些林林总总的含义中,我们是否可以得出这样一些理解: 游戏具有学习的特征――学习、投入、反复体会。游戏具有社会的特征――结交。游戏具有娱乐的特征――游原创 2006-08-04 13:05:00 · 3915 阅读 · 0 评论 -
3D游戏从入门到精通-5
21 使用Direct3D2.11.1最简单三角形显示前面已经学习了顶点、平面以及平面的法向量。接着下面就带你进入奇幻的3D世界,由你去创造这个美好的3D世界。任何美好的事物都是简单的东西组成的,所以也需要从最简单的物体构造开始。这里主要显示一个三角形,其它关于窗口和初始化D3D的设备都已经由MM3D引擎做好了,目前只要设置顶点、世界坐标变换矩阵、观察变换矩阵、投影变换矩阵,然原创 2006-08-08 13:16:00 · 3339 阅读 · 0 评论 -
3D游戏从入门到精通-7
1、 世界坐标变换矩阵在设置顶点缓冲区之后,就需要设置物体的世界坐标变换矩阵。从解析几何里可以知道,无论二维还是三维的图像都可以通过齐次坐标来变换的。目前在三维里的变换,采用的矩阵是4×4的矩阵来实现变换处理。在D3D里定义D3DXMATRIX类型,使用它来表达一个矩阵,并且定义一系列的函数可以实现矩阵的运算。它的定义如下: typedef struc原创 2006-08-11 00:15:00 · 3446 阅读 · 0 评论 -
3D游戏从入门到精通-10
1、 渲染物体经过前面这么多步骤,做足了准备工作,就可以渲染物体,显示三维空间的图像了。这时心情要兴奋起来,就看到自己辛苦的果实了。仔细地看一下前面的代码,创建的缓冲区还没有设置给D3D设备。下面就来做这方面的工作: // 渲染顶点缓冲区的内容。m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof(原创 2006-08-14 23:53:00 · 2976 阅读 · 0 评论 -
3D游戏从入门到精通-12
1、 使用索引缓冲区什么是索引缓冲区呢?其实索引缓冲区,就像指针一样的工具。顶点缓冲区里保存的是真实的顶点,而索引缓冲区只记录顶点缓冲区的顶点编号。比如顶点缓冲区里有4个顶点,而这4个顶点就可以构成两个三角形来显示。如果直接使用顶点缓冲区的话,就需要写6个顶点。这样就可以使用索引缓冲区,指明第一个三角形是由顶点编号1、2、3构成一个三角形,而第二个三角形就是1、3原创 2006-08-17 23:16:00 · 3727 阅读 · 0 评论 -
3D游戏从入门到精通-13
2.10.1基本图形显示在D3D里只有几种基本图形可以显示的,它们分别是:点列表、线列表、线带列表、三角形列表、三角形带列表、三角形扇形列表。其它任何的图形,都可以由这向这几种基本图形组合出来。上面已经介绍了三角形显示了,所以这里就不再具体地说明它了。1、 点列表点列表主要显示为一个个像素点的集合,每个点都是单独显示,分离的。点列表作用是用来显示点元素,原创 2006-08-21 00:28:00 · 2847 阅读 · 0 评论 -
3D游戏从入门到精通-8
1、 视图变换矩阵视图变换矩阵是做什么用的呢?为什么需要视图变换矩阵呢?其实这个问题很好回答和理解的。在3D世界里,所有东西都是跟现实中的实物一样的,当用人的眼睛去观看现实中的实物时,总是从某一方向去观察的,这样就看到实物组成的图像。就像你拿着照相去照相是一样的,首先要调好焦距,对准物体。在D3D里也需要调好焦距,对准物体,否则什么也看不到。因此在D3D里,原创 2006-08-11 23:58:00 · 3245 阅读 · 0 评论 -
3D游戏从入门到精通-11
2.10.1索引缓冲区上面已经学习了最简单的三角形显示,了解了整个3D物体的显示流程,下面来学习一个复杂一点的物体显示,使用12个三角形构造成的正方体显示。并且通过个例子学会使用索引缓冲区,提高图形绘制的速度和效率。1、 使用三角形构造立方体由前面可知,任何复杂的物体,都是由三角形组成的。现在就用12三角形构造一个正方体。先创建12点个顶点的缓冲区,原创 2006-08-16 22:18:00 · 2875 阅读 · 1 评论 -
3D游戏从入门到精通-9
1、 投影变换矩阵投影变换矩阵是做什么的呢?这个更容易理解了。大家都应看过照片吧,那大家又想过照片是怎么样表现原来的物体呢?看到远处的山是小的,近处的人是大的。并且只有在一定的范围内的物体才照得清楚,其它的就不见了。在D3D里就需要把三维的物体空间投影到二维的屏幕空间显示,这就需要投影了。本来人眼看现实的物体时,总是经过投影变换的,把三维的物体通通变换成二维东西,原创 2006-08-13 00:03:00 · 3104 阅读 · 0 评论 -
3D游戏从入门到精通-14
2、 线列表D3D还提供直线的显示,由于很多自然现现象需要它来显示。比如大雨,就需要使用直线来模拟出来。如下图所示:这里显示三条红、绿、蓝的直线。它的代码如下:pVertices[0].vPosition = D3DXVECTOR3( -2.0f, 0.0f, 0.0f ); pVertices[0].crDiffuse = D3DCOLOR原创 2006-08-22 00:12:00 · 2990 阅读 · 0 评论 -
3D游戏从入门到精通-17
5、 三角形扇形列表最后一种三角形列表显示是扇形排列的三角形列表。这种排列方式,有一个特别的地方,就是所有三角形共享一个顶点,这样特别适合构成曲面的地方,比如球体和圆形的东西。下面看看这个例子显示的图:通过上面这个图,可以看到4个三角形共享一个顶点,这个顶点是红颜色的,其它不同的顶点不同的颜色。下面来看看程序是怎么样实现它的显示的: HRESULT h原创 2006-08-27 21:39:00 · 3188 阅读 · 0 评论 -
3D游戏从入门到精通-15
3、 线带列表在D3D里还提供线带列表显示,这种显示方式是把所有直线顺着顶点连接显示出来。如下图所示:采用线带列表显示的方式,可以减少顶点占用内存空间,提高显示效率。下面这段代码就是显示6个顶点的直线。 m_nLineStripCount = 3; HRESULT hr; // 创建顶点缓冲区。 if( FAILED( hr =原创 2006-08-23 22:52:00 · 3066 阅读 · 0 评论 -
3D游戏从入门到精通-16
4、 三角形带列表三角形显示的方式总共分为三种,前面已经学习最多的是三角形列表,现在再来看看三角形带列表是什么样的,这样有什么优点呢?这里显示图形如下:上面的图形可以看出,只有6个顶点就可以显示4个三角形,而采用三角形列表的方式,只能显示两个三角形。因此采用这种方式就会大大提高渲染效率,减少占用内存空间,减少占用系统带宽。具体的程序如下: HRES原创 2006-08-24 22:58:00 · 21421 阅读 · 4 评论 -
在VC2005里使用STLPORT
听说STLPORT的性能不错,心动不如行动,立即就上网下载STLPORT下来使用,先到下面的网址下载源程序:http://nchc.dl.sourceforge.net/sourceforge/stlport/STLport-5.1.3.zip这个压缩包不是很大,才1.6M,很轻松地就下载完成了。接着下来就是解压,比如我解压到目录:E:/software/LIB/STLport-5原创 2007-06-18 13:56:00 · 4032 阅读 · 1 评论 -
Windows API一日一练(3)使用命令行参数
下面再接着练习使用命令行参数,先在VC2005调试设置里设置输入参数,如下图: 可以看到在Command Arguments里输入给程序传送的命令行参数(cmd1 cmd2 命令行参数)。接着修改原来的程序如下:#001 int APIENTRY _tWinMain(HINSTANCE hInstance,#002 HINSTANCE原创 2007-07-06 12:41:00 · 9999 阅读 · 1 评论 -
Windows API一日一练(1)第一个应用程序
要跟计算机进行交互,就需要计算机显示信息给人看到,或者发出声音给人听到,然后人看到或听到相应的信息后,再输入其它信息给计算机,这样就可以让计算机进行数据处理,把结果显示给我们。现在就来编写一个最简单的Windows应用程序,让它提示一行文字给我们看到,这就是简单的目标。它实现的源程序和界面如下:上面这个图,是从VC++ 2005里截出来的。这样可以看到源程序和显示的界面,很清楚地知原创 2007-07-02 14:47:00 · 29283 阅读 · 35 评论 -
Windows API一日一练(2)使用应用程序句柄
从上面这段程序就可以看到,_tWinMain是应用程序的入口函数,这里是使用它的宏,定义在tchar.h头文件里,为什么要这样作宏定义的呢?由于Windows的应用程序要适应UNICODE和以前单字符的应用程序,由于Windows这两个API的定义是不一样的,如下:UNICODE的定义: #define _tWinMain wWinMain单字符的定义: #define _tW原创 2007-07-03 16:06:00 · 12655 阅读 · 4 评论 -
Windows API一日一练(6)CreateWindow函数
一个窗口要显示,先要把它创建出来。那就需要调用API函数CreateWindow了,所以在注册窗口后的第二步,就需要调用创建窗口函数。 函数声明如下:WINUSERAPIHWNDWINAPICreateWindowExA( __in DWORD dwExStyle, __in_opt LPCSTR lpClassName, __in_opt L原创 2007-07-13 09:20:00 · 9387 阅读 · 0 评论 -
Windows API一日一练(9)WindowProc和DefWindowProc函数
在Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消息。在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。当你按下菜单,或原创 2007-07-17 08:52:00 · 16457 阅读 · 0 评论 -
Windows API一日一练(8)UpdateWindow函数
UpdateWindow函数是更新窗口的客户区,主要通过发送WM_PAINT消息来实现的。 函数声明如下:WINUSERAPIBOOLWINAPIUpdateWindow( __in HWND hWnd);hWnd是要更新窗口客户区的窗口句柄。 调用这个函数的实例如下:#001 BOOL InitInstance(HINSTANCE hInstan原创 2007-07-16 08:49:00 · 7956 阅读 · 1 评论 -
Windows API一日一练(4)MessageBox函数
为了显示提示信息给用户,Windows是提供了一个非常方便的API函数MessageBox给用户使用,使用这个API函数可以显示简单的文字信息出来,提醒或提示用户进行下一步操作。函数声明如下:WINUSERAPIintWINAPIMessageBoxA( __in_opt HWND hWnd, __in_opt LPCSTR lpText, __i原创 2007-07-09 13:10:00 · 16337 阅读 · 2 评论 -
Windows API一日一练(5)RegisterClass和RegisterClassEx函数
为了可以创建自己的窗口,就需要向Windows操作系统注册窗口类型,以便后面创建窗口时调用。当然,如果使用Windows预先注册的窗口是不需要注册的。 函数声明如下:#if(WINVER >= 0x0400)WINUSERAPIATOMWINAPIRegisterClassExA( __in CONST WNDCLASSEXA *);WINUSERAPI原创 2007-07-12 09:23:00 · 18749 阅读 · 6 评论 -
Windows API一日一练(7)ShowWindow函数
ShowWindow的API函数是显示窗口,但它在第一次调用和以后的调用是有区别的。第一次调用时,它的输入参数nCmdShow是需要输入WinMain函数里传入来的nCmdShow参数,而不能是其它参数。 函数声明如下:WINUSERAPIBOOLWINAPIShowWindow( __in HWND hWnd, __in int nCmdShow);原创 2007-07-14 08:53:00 · 13502 阅读 · 0 评论 -
Windows API一日一练(11)GetMessage函数
应用程序为了获取源源不断的消息,就需要调用函数GetMessage来实现,因为所有在窗口上的输入消息,都会放到应用程序的消息队列里,然后再发送给窗口回调函数处理。函数GetMessage声明如下:WINUSERAPIBOOLWINAPIGetMessageA( __out LPMSG lpMsg, __in_opt HWND hWnd, __in原创 2007-07-20 08:51:00 · 6311 阅读 · 0 评论