游戏开发总结

游戏开发总结

1、 目前流行的3D开发环境有两种:OpenGL和Direct3D。

Direct3D和DirectX的关系::DirectX自19xx年诞生至今

(1)、 DirectX 1.0:第一代的DirectX很不成功,推出时众多的硬件均不支持,当时基本都采用专业图形API-OpenGL,缺乏硬件的支持成了其流行的最大障碍。DirectX 1.0版本是第一个可以直接对硬件信息进行读取的程序。它提供了更为直接的读取图形硬件的性能(比如:显示卡上的块移动功能)以及基本的声音和输入设备功能(函数),使开发的游戏能实现对二维(2D)图像进行加速。这时候的DirectX不包括现在所有的3D功能,还处于一个初级阶段。

(2)、 DirectX 2.0:在二维图形方面做了些改进,增加了一些动态效果,采用了Direct 3D的技术。这样DirectX 2.0与DirectX 1.0有了相当大的不同。在DirectX 2.0中,采用了“平滑模拟和RGB模拟”两种模拟方式对三维(3D)图像进行加速计算的。DirectX 2.0同时也采用了更加友好的用户设置程序并更正了应用程序接口的许多问题。从DirectX 2.0开始,整个DirectX的设计架构雏形就已基本完成。

(3)、 DirectX 3.0:的推出是在19xx年, DirectX 3.0是DirectX 2.0的简单升级版,它对DirectX 2.0的改动并不多。包括对DirectSound(针对3D声音功能)和DirectPlay(针对游戏/网络)的一些修改和升级。DirectX 3.0集成了较简单的3D效果,还不是很成熟。

(4)、 DirectX 5.0:微软公司并没有推出DirectX 4.0,而是直接推出了DirectX 5.0。此版本对Direct3D做出了很大的改动,加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加入了S3的纹理压缩技术。同时,DirectX 5.0在其它各组件方面也有加强,在声卡、游戏控制器方面均做了改进,支持了更多的设备。因此,DirectX发展到DirectX 5.0才真正走向了成熟。此时的DirectX性能完全不逊色于其它3D API,而且大有后来居上之势。

(5)、 DirectX 6.0:中加入了双线性过滤、三线性过滤等优化3D图像质量的技术,游戏中的3D技术逐渐走入成熟阶段。

(6)、 DirectX 7.0:最大的特色就是支持T&L,中文名称是“坐标转换和光源”。3D游戏中的任何一个物体都有一个坐标,当此物体运动时,它的坐标发生变化,这指的就是坐标转换;3D游戏中除了场景+物体还需要灯光,没有灯光就没有3D物体的表现,无论是实时3D游戏还是3D影像渲染,加上灯光的3D渲染是最消耗资源的。虽然OpenGL中已有相关技术,但此前从未在民用级硬件中出现。在T&L问世之前,位置转换和灯光都需要CPU来计算,CPU速度越快,游戏表现越流畅。使用了T&L功能后,这两种效果的计算用显示卡的GPU来计算,这样就可以把CPU从繁忙的劳动中解脱出来。换句话说,拥有T&L显示卡,使用DirectX 7.0,即使没有高速的CPU,同样能流畅的跑3D游戏。

(7)、 DirectX 8.0:的推出引发了一场显卡革命,它首次引入了“像素渲染”概念,同时具备像素渲染引擎(Pixel Shader)与顶点渲染引擎(Vertex Shader),反映在特效上就是动态光影效果。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难度大大降低。通过VS和PS的渲染,可以很容易的营造出真实的水面动态波纹光影效果。此时DirectX的权威地位终于建成。

(8)、 DirectX 9.0:20xx年底,微软发布。DirectX 9中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,每个程序的着色指令增加到了1024条。

第1页(共12页)

PS 2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无限多;另外PS1.4只能支持28个硬件指令,同时操作6个材质,而PS2.0却可以支持160个硬件指令,同时操作16个材质数量,新的高精度浮点数据规格可以使用多重纹理贴图,可操作的指令数可以任意长,电影级别的显示效果轻而易举的实现。

VS 2.0通过增加Vertex程序的灵活性,显著的提高了老版本(DirectX8)的VS性能,新的控制指令,可以用通用的程序代替以前专用的单独着色程序,效率提高许多倍;增加循环操作指令,减少工作时间,提高处理效率;扩展着色指令个数,从128个提升到256个。 增加对浮点数据的处理功能,以前只能对整数进行处理,这样提高渲染精度,使最终处理的色彩格式达到电影级别。突破了以前限制PC图形图象质量在数学上的精度障碍,它的每条渲染流水线都升级为128位浮点颜色,让游戏程序设计师们更容易更轻松的创造出更漂亮的效果,让程序员编程更容易。

(9)、 Directx 10.0:已经包含在Windows Vista操作系统中,目前无法单独下载使用。新的DirectX使你获得更好的图像显示质量,使多人游戏具可伸缩性,以及包括更棒的音频效果。它强化了针对DirectDraw和Direct3D的接口,简化了应用扩展,提升性能;改善了图形创作工具,更易于做出最佳的3-D角色和环境;点光源式光影和像素式光影使图象更逼真;强化了DirectSound和DirectMusic,简化了其应用扩展;DLS2音频合成功能提高了乐器音频的真实感; DirectInput的设备影射功能令对设备的支持更简单;DirectPlay使多人游戏的性能和可扩展性得到了提高; DirectPlay提供了IP声音通讯;DirectShow的应用编程接口提供了音频/视频的实时合成和即时编辑; DirectShow支持Windows媒体音频和视频(WMA和WMV)的读写;Microsoft TV技术可以支持数字电视节目。当然,最重要的是一些新游戏需要它。 DirectX Redist通常每两个月更新一次,包含了DirectX Runtimes的所有更新,可以替代此前发布的旧版本,适合Windows XP、Server 2003、Vista等操作系统,不支持Windows 9x/2000。一般最新的3D游戏等应用程序都需要新的DirectX接口,因此强烈推荐更新,

(10)、 Directx 11:20xx年1月9日星期五,微软将面向公众发布Windows 7客户端Beta 1测试版。而此前一天,即1月8日,微软将率先发布Windows 7服务器版本的Beta 1测试版。DirectX 11还支持tessellation镶嵌化技术,这有助于开发人员创建更为细腻流畅的模型,实现高质量实时渲染和预渲染场景。多线程是DirectX 11的另外一大亮点,DX11可以更好地利用多线程资源,从而使游戏更有效地利用多核处理器

绘制图形的三种方式:HAL/插件式软件驱动/参考光栅器

2、 HAL:硬件抽像层(Hardware Abstraction Layer, HAL),HAL除了使用硬件处理的方法,HAL也能在软件中模拟部分或全部顶点处理。

HAL有4种不同的顶点处理方法:

SW VP(软件顶点处理) Mixed VP(混合顶点处理) HW VP(硬件顶点处理) Pure VP(纯顶点处理)

插件式软件设备(Pluggable Software Device),参考光栅器(Reference Rasterizer),参考光栅器支持所有Direct3D特性,该设备为精确性而非速度做了优化,应该只将其用于测试那些显卡不支持的特性

3、 DirectX开发库包括如下组件:DirectX Graphics — 集成DirectDraw和Direct3D

作用: Microsoft DirectDraw和Microsoft Direct3D并入了DirectX Graphics组件。该组件用于进行图形渲染,并且支持最新的图形硬件。

DirectX Audio — 集成DirectMusic和DirectSound

作用: Microsoft DirectMusic和Microsoft DirectSound现在紧密集成到新的DirectX Audio组件中。WAV文件或其他资源可以由DirectMusic加载器加载,通过DirectMusic演

第2页(共12页)

奏器进行播放,并用MIDI音响进行同步。

DirectPlay(现已不再更新):

作用:Microsoft DirectPlay组件用于实现游戏的网络通讯,此外,DirectPlay现在还支持玩家之间的语音通讯。

DirectInput:作用:Microsoft DirectInput用于管理鼠标、键盘等输入输出设备。 DirectShow(现已不再更新)

作用:DirectShow组件用于在游戏中进行多媒体视频以及MP3的音频文件的播放工作。

4、 COM(Component Object Model)对象是对一组特定功能的抽像集合,应用程序不能直接访问COM对象,而是必须通过对COM对象的接口(Interface)的指针执行COM对象的功能。COM对象定义了可供程序调用的一组函数(标准的说法是一组方法Method),COM对象接口指针在使用上类似与C++类的指针。

COM有许多优点。对于DirectX程序开发而言,主要是:COM接口永远不会改变;COM是独立于语言的(language-independent);只能访问一个COM组件的方法,而不是它的数据。

(1)、 跨平台的3D开发环境为:(A)

A) OpenGL B) Direct3D

(2)、 Direct3D API必须调用windows GDI才能完成图形绘制功能。(×)

(3)、 能够利用硬件运行图形程序的方式是:( A)

A) HAL B)插件式软件驱动 C)参考光栅器

(4)、 HAL的顶点处理方法有(ABCD)

A)软件顶点处理 B)混合顶点处理 C)硬件顶点处理 D)纯顶点处理

(5)、 COM与语言无关,且应用程序无法直接访问COM对象。(√)

(6)、 DirectAudio能够播放的音乐有: (AB)

A)WAV B)Midi C)MP3 D)AVI

(7)、 C++语言的编程中依然需要使用v-table的指针。 (×)

(8)、 匈牙利命名法中,类名必须全部大写。(×)

(9)、 DirectX 9.0 SDK提供的宏SUCCEEDED()和FAILED()可以被用于检查返回码,检测方法是否调用成功。(√)

(10)、 DirectX方法通常会返回一个HRESULT类型的返回码。(√)

5、 DirectX的配置过程:

(1)、 打开VS->工具->选项->项目和解决方案->VC++目录:①、包含文件->” …Microsoft DirectX SDK (March 2009)\Include”②、库文件->”…Microsoft DirectX SDK (March 2009)\Lib\x86”

(2)、 C++项目右键属性->配置属性->链接器->输入->附加依赖项->” d3dx9.lib d3d9.lib winmm.lib”

6、 像素是指:图像在屏幕上显示的最小单元,即屏幕上的一个亮点。它也指在frame buffer(颜色缓冲区)中的最小图形单元。

7、 分辨率是指:显示设备所能显示的最大像素个数。例如:一个分辨率为1024×768的显示屏能够显示水平方向1024个像素,垂直方向768个像素,满屏显示1024×768 = 786432个像素。

顶点就是3D空间中的一个点,它定义了多边形的相交点。其大小为16字节 Direct3D中能够渲染的所有物体都是由图元构成,而图元都是由顶点构成。

8、 D3D中的颜色:像素和顶点的颜色使用RGB表示。也就是说,我们规定Red,Green,Blue这三种颜色的量,以此确定最终的颜色,我们使用两种不同类型的结构来保存RGB数据:

第3页(共12页)

? D3DCOLOR(适用于顶点的颜色,0-255)

? D3DCOLORVALUE(适用于光照,0-1,0表示没有该颜色组件,1表示该颜色组件

的最高强度。)

D3DCOLOR是一个32位的DWORD类型的数。32位被分为4个部分,每部分保存一种颜色组件的大小。

Red,Green,Blue各8位,另一个字节被分配给Alpha通道。

每种颜色组件占一个字节的空间,所以颜色值为0-255。0表示没有该种颜色,255表示该颜色组件的最高强度。

D3DCOLORVALUE结构通过浮点值表示每一种颜色组件的强度。取值范围为从0到1。0表示没有该颜色组件,1表示该颜色组件的最高强度。

颜色向量可以和普通向量一样进行相加减,进行缩放。点乘和叉乘对颜色向量没有意义,但是组件之间乘法是有意义的。

注意不能将D3DCOLORVALUE类型的数据作为顶点颜色成员,因为D3D要求用32位的值来描述顶点颜色

9、 页翻动与交换链:

交换链和页翻动(page flipping)技术被用于提供帧之间的平滑动画。

颜色缓冲区(FrameBuffer)是位于系统内存或显存里的一块内存块,对应于将要显示的一块二维显示区域(即表面)。

前台缓冲区(Front Buffer)和后台缓冲区(Back Buffer)都是颜色缓冲区的一种,前台缓冲区主要用于屏幕刷新,也是我们可见的部分。后台缓冲区主要用于图形的绘制,绘制完成后,两者进行页翻动的工作,把处理完的图形显示出来。

前台缓冲区保存着当前监视器所展示的图形。监视器不会立即显示在前台缓冲区中的图像。而是每隔一段时间,比如1/60秒刷新一次,该时间取决于屏幕刷新率。

后台缓冲区:应用程序的帧刷新率一般来说要快于屏幕刷新率。然而在监视器完成当前帧的描绘之前,我们不能用下一帧的动画来更新前台缓冲区的内容。但是与此同时,我们也不希望等待监视器描绘完成当前前台缓冲区的内容之后,再来更新其中的内容。因此我们需要引入一个离屏表面(即后台缓冲区)。

10、 内存池 (Memory Pools):

一些D3D资源能够放在不同种类的内存池中。内存池由D3DPOOL枚举变量进行定义。可用的内存池主要有:

(1)、 D3DPOOL_DEFAULT:这是D3D的默认内存池。依据资源类型和用途的不同,它可以事显存、AGP内存、或系统内存。注意在默认内存池中的资源必须在IDirect3DDevice9::Reset调用前销毁(或释放)掉,而在Reset调用之后重新初始化。

(2)、 D3DPOOL_MANAGED:在其中的资源由D3D进行管理。它们根据设备的需要,被移入到AGP内存或显存中。另外,在系统内存中将维护一份资源的拷贝。当应用程序访问或修改资源时,它们将使用系统拷贝。随后,D3D根据需要自动更新显存中的内容。

(3)、 D3DPOOL_SYSTEMMEM:资源被放入系统内存中。

(4)、 D3DPOOL_SCRATCH:资源被放入到系统内存中。与D3DPOOL_SYSTEMMEM之处在于这些资源不接受图像设备的限制。其结果就是,设备不能访问在该池中的资源。但是这些资源可以与其它内存池进行交换。

游戏开发总结

第4页(共12页)

1 、D3D中只需要一块颜色缓冲区。(×)

2、顶点颜色必须为32位的数,所以不能够使用D3DCOLORVALUE类型的数据。(√)

3、颜色向量的点乘、叉乘没有意义。(√)

4、应用程序进行渲染的缓冲区是:(B) A.前台缓冲区 B.后台缓冲区

5 、由D3D设备进行资源管理的D3D的内存池是:(B)

A、D3DPOOL_DEFAULT B. D3DPOOL_MANAGED

C. D3DPOOL_SYSTEMMEM D. D3DPOOL_SCRATCH

D3D设备:

举例:检查是否能够利用硬件设备进行顶点处理(即检查硬件是否支持变换和光照计算): 在D3DCAPS9::DevCaps中包含D3DDEVCAPS_HWTRANSFORMANDLIGHT数据位,则表示硬件支持变换和光照计算。DevCaps 指“设备能力(device capabilities)”。 bool supportsHardwareVertexProcessing;

// caps是D3DCAPS9实例,且已被初始化。如果数据位为“on”,

//则硬件支持顶点处理

if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )

{

//数据位为“on”,所以支持

supportsHardwareVertexProcessing = true;

}

else

{

//数据位为“off”,所以不支持

hardwareSupportsVertexProcessing = false;

}

11、 灵活顶点格式(Flexible Vertex Format (FVF))

如果使用灵活顶点格式,必须以以下顺序来格式化所有的顶点:

1、位置(未转化或者已转化的x、y、z)——(浮点数)x坐标、y坐标、z坐标。

2、RHW(仅用于已经转化的顶点)——(浮点数)rhw(齐次w值的倒数)

3、混合加权值——1?5的浮点数。

4、顶点法线(仅用于未经转化的顶点)——(浮点数)x法线、y法线、z法线。

5、散射光颜色——(DWORD)扩散色,用RGBA表示。

6、反射光颜色——(DWORD)反射色,用RGBA表示。

7、纹理坐标集1?8——(浮点数)纹理映射的u坐标,v坐标。

12、 图元类型

Direct3D中的图元类型一共有六种:点列,线列,线带,三角形列,三角形带和三角形扇。

? 点列 D3DPT_POINTLIST 一组点的集合

? 线列 D3DPT_LINELIST 一组线段的集合

? 线带 D3DPT_LINESTRIP 首尾相连的线段的集合

? 三角形列 D3DPT_TRIANGLELIST 一组三角形的集合

? 三角形带 D3DPT_TRIANGLESTRIP 首尾相连的三角形,有两个顶点重合 ? 三角形扇 D3DPT_TRIANGLEFAN 组成扇形的一组三角形

三角形带无法绘制立方体,只能绘制连续的平面;

点列由一系列的顶点组成,通过调用图形绘制函数:

g_pD3DDevice->DrawPrimitive(D3DPT_POINTLIST, 0, 6);// 第一个参数表示使用的图元类型,第

第5页(共12页)

二个参数表示开始的坐标,第三个参数表绘制图形的个数

用点列方式绘制的图形如下:

线列由一系列的线段组成,通过调用图形绘制函数:

g_pD3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, 3);

用线列方式绘制的图形如下:

线带由一系列的线段组成,前一个线段的终点是下一条线段的起点,通过调用图形绘制函:

g_pD3DDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, 5);

用线带方式绘制的图形如下:

三角形列由一系列的三角形组成,通过调用图形绘制函数:

g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

用三角形列方式绘制的图形如下:

三角形带由一系列的三角形组成,除了第一个三角形,其他的三角形只需要输入第三个顶点,其他两个顶点与前一个三角形重合。通过调用图形绘制函数:

g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 4);

用三角形带方式绘制的图形如下:

三角形扇也是由一系列的三角形组成,每两个三角形有两个顶点重合。通过调用图形绘制函数:

g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 3);

用三角形带方式绘制的图形如下:

游戏开发总结

游戏开发总结

游戏开发总结

游戏开发总结

游戏开发总结

第6页(共12页)

13、 背面裁剪

在视图空间里,多边形的背面是不可见的,即多边形的前表面遮挡了后表面,D3D会剪裁后表面,这种技术被称为背面裁剪技术。

如果没有指定,D3D将顶点按顺时针方向排列的三角形作为前向多边形,逆时针的作为后向多边形。

设置背面裁减的函数:

SetRenderState(D3DRS_CULLMODE, Value)// 第一个参数设置模型,第二个设置裁剪模式

1) D3DCULL_NONE:不裁剪

2) D3DCULL_CW:裁剪顶点顺时针排列的三角形

3) D3DCULL_CCW:裁剪顶点逆时针排列的三角形

14、 Direct3D中使用的是左手坐标系;3DMax等建模软件则使用的是右手坐标系

1.D3D中使用灵活顶点格式的作用在于节省大量的内存带宽和渲染时间 。(√)

2.灵活顶点格式中必须指定的成员是( A)

A.顶点坐标 B.顶点颜色 C.顶点法线 D.顶点UV坐标

3.D3D中使用的坐标系中,Z轴指向:( C)

A.垂直向上 B.垂直向下 C.指向屏幕里 D.指向屏幕外

4.三维世界中所有的复杂物体我们都可以通过一些基本图元来组合而成。(√)

5.在游戏中玩家看到的图元类型通常为:( C)

A.点列 B.线列,线带 C. 三角形列,三角形带和三角形扇

6.在视图空间中使用背面裁减技术的原因是避免多边形后表面遮蔽住前表面。 (×)

15、 D3D中的空间:

1.本地空间(不属于游戏中的空间):

本地空间(或者称为模型空间)指定义组成物体的三角形列表时所使用的坐标系统。本地空间在简化模型处理工作上相当有用。

例如:本地空间中创建物体时,不需要考虑物体的位置、大小以及与世界空间中其他物体的关系。

2.世界空间(场景中的空间):

在完成各种模型的创建后,所有的物体都只在相应的本地空间中,需要把这些模型组合到一起,形成一个场景。这个统一的坐标系统所决定的空间称为世界空间。

3. 视图空间(设置摄像机的属性)

Direct3D允许在场景中设置一个虚拟摄像机,决定我们看到的场景,由虚拟摄像机决定的空间称为视图空间。

4. 视口:

游戏中,视口经常是整个屏幕,但是视口也可以是屏幕上的矩形区域。

可能是屏幕的一部分或者是处于窗口模式下窗口的客户区。视口与其所在的窗口相关并且通过所在窗口的相对坐标来进行描述,通常,视口坐标是按照像素的方式取值的。

16、 Direct3D渲染图形可以分为两个阶段:1、变换和照明(T&L) 2、光栅化处理 渲染图形的过程:

游戏开发总结

第7页(共12页)

渲染流水线的大部分过程都是在进行坐标转换 ,将顶点从一个坐标系转换到别的坐标系。 在使用Direct3D来进行转换时,用户只需要提供描述系统转换的完整转换矩阵,通过IDirect3DDevice->SetTransform方法来实现相应的变换。

HRESULT SetTransform(

D3DTRANSFORMSTATETYPE State, //变换的类型

CONST D3DMATRIX *pMatrix //进行变换的变换矩阵);

17、 视图变换:把物体转换到世界空间后,接下来就需要确定视图空间,这个过程称为视图变换。首先我们需要确定虚拟摄像机的属性。在Direct3D中,关于虚拟摄像机的属性主要包括:摄像机位置、摄像机的朝向和摄像机的正方向,分别用向量表示。可以从以下函数生成视图变换的矩阵。

D3DXMATRIX *D3DXMatrixLookAtLH(

D3DXMATRIX *pOut, CONST D3DXVECTOR3 *pEye, CONST D3DXVECTOR3 *pAt, CONST D3DXVECTOR3 *pUp );// 第一个参数为:输出用于视图变换的矩阵第二个参数为:/摄像机的位置第三个参数为:/摄像机朝向的位置第四个参数为:摄像机的正方向

使用下面的函数来设置视图变换。

g_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);// g_pD3DDevice为有效的Direct3D设备指针 matWorld代表一个视图变换矩阵

18、 投影变换

把摄像机观察到的三维景像显示在二维的平面上,这种三维到二维的变换就是投影变换。实际应用中,主要的投影变换有两种类型:正交投影和透视投影

正交投影:

在正交投影中,投影向量与观察平面垂直,物体坐标沿观察坐标系的z轴平行投影到观察平面上,观察点和观察平面的距离不影响物体的大小。

可以使用下面的函数来得到正交投影的变换矩阵:

游戏开发总结

第8页(共12页)

D3DXMATRIX *D3DXMatrixOrthoLH(

D3DXMATRIX *pOut, //输出用于正交投影的变换矩阵

FLOAT w, //取景体宽度

FLOAT h, //取景体高度

FLOAT zn, //取景体离摄像机的最近距离

FLOAT zf //取景体离摄像机的最远距离

);

接下来,使用下面的函数来应用正交投影变换。

g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);

g_pD3DDevice为有效的Direct3D设备指针

matProj代表一个投影变换矩阵

透视投影的特点:是越远的物体在投影平面上的成像越小,这样生成的投影图更加具有纵深感。透视投影的观察范围是一个平截台体。平截台体是指一个去除了尖头的锥体 下面的函数用于定义透视变换的矩阵:

D3DXMATRIX *D3DXMatrixPerspectiveFovLH(

D3DXMATRIX *pOut, //输出用于透视投影的变换矩阵

FLOAT fovY, //摄像机镜头的夹角(在y轴上的成像角度) FLOAT Aspect, //平截台体的纵横比

FLOAT zn, //近平截面的距离

FLOAT zf //远平截面的距离

);

接下来,使用下面的函数来应用透视投影变换

g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);

g_pD3DDevice为有效的Direct3D设备指针

matProj代表一个投影变换矩阵。

1、D3D中的变换空间主要包括: ( ABCD)

A)本地空间 B)世界空间 C)视图空间 D)视口

2、将模型置入场景中的变换称之为:( A)

A)世界变换 B)视图变换 C)投影变换 D)视口变换

3、设置摄像机位置进行的变换是( B)

A)世界变换 B)视图变换 C)投影变换 D)视口变换

4、设置摄像机观察范围(或者叫夹角)的变换是( C)

A)世界变换 B)视图变换 C)投影变换 D)视口变换

5、游戏场景中通常采用的投影变换是( B)

A)正交投影 B)透视投影

6、我们可以通过视口变换在窗口的特定区域显示图形。 (√)

19、 绘制黑框步骤:

1)声明D3D接口 (也就是我们前面曾经说过的com接口,如果没有接口,无法访问com里面的方法LPDIRECT3D9 g_pD3D = NULL; 注意这里,我们只是定义变量,还没有初始化)

2)创建设备对象(也就是绘制图形的设备:显卡,这里我们把显卡当做对象来使用了。注意这里,我们只是定义变量,还没有初始化LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;HWND hWnd;)

3)开始初始化D3D环境,包括d3d的接口初始化,设备初始化。

g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);// D3D的版本号

d3dpp.Windowed = TRUE;// TRUE表示使用窗口模式,FALSE表示全屏模式,默认为FALSE

第9页(共12页)

判断设备是否创建成功

if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,

hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,&g_pD3DDevice)))

{

return E_FAIL;

}

参数说明:

D3DADAPTER_DEFAULT:在哪个显示器中创建设备

D3DDEVTYPE_HAL:图形绘制方式,前面讲过的,硬件抽象层

hWnd:窗口句柄,简单的说就是你准备在哪个窗口中绘制图形,注意,该变量是我们定义

的全局变量

D3DCREATE_SOFTWARE_VERTEXPROCESSING:顶点处理方式,前面也讲过的,种,这是第一种,

软件顶点处理

d3dpp:上面我们已经创建的后台缓冲区参数变量

g_pD3DDevice:这是我们这个方法要返回的对象,也就是我们前面定义的设备对象,告诉

该方法,把生成设备返回到该变量中

//设置剪裁方式,前面也讲过的背面裁剪模式

g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

//关闭灯光,这个目前不需要考虑,照着写就是了

g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

//用黑色进行对缓冲区清屏

g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

// 0,0,0表示黑色,255,255,255表示白色

三角形部分:

//定义顶点信息的结构体

struct CUSTOMVERTEX

{

FLOAT x, y, z;

DWORD colour;

}; //顶点坐标 // 顶点颜色

//定义自由顶点格式

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

初始化顶点缓冲区

HRESULT InitialiseVertexBuffer()

{

//通过设备创建顶点缓冲 //Create the vertex buffer from our device

if(FAILED(g_pD3DDevice->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &g_pVertexBuffer,NULL)))

//第一个参数表示顶点缓冲区的大小,第二个参数0表示的就是我们为该顶点缓冲区编号,

//下次再定义其//他的顶点缓冲区的时候,我们就依次类推定义,如第二个我们就设置为1。

//第三个参数表示顶点的格式第四个参数表示缓冲池,第五个参数表示:定义的缓冲区对象

//的变量,把创建的缓冲区存放在该变量中。第六个直接填NULL

{

第10页(共12页)

return E_FAIL;

}

return S_OK;

}

Lock为锁定定点缓冲区g_pVertexBuffer->Lock(0, sizeof(cvVertices),

(void**)&pVertices, 0);// 参数1:0;参数2:顶点数组的大小;参数3:锁定到哪个指针处;参数4:0 解锁顶点缓冲区g_pVertexBuffer->Unlock();

设置场景中的设想机:

VOID SetupViewandProjMatrices()

{

//建立并设置观察矩阵

D3DXVECTOR3 vEyePt( 0.0f, 0.0f,-10.0f );// 设置摄像机的位置

D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );// 设置摄像机的朝向

D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );// 设置摄像机的y轴正方向

D3DXMATRIX matView; //摄像机的矩阵

D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );// 产生最终摄像机的矩阵

g_pD3DDevice->SetTransform( D3DTS_VIEW, &matView );

//建立并设置投影矩阵

D3DXMATRIX matProj;

//参数1:要返回的矩阵参数2:y轴的夹角,好比我们人眼上下能看到的夹角;参数3:宽高比,这里的宽高比//要和我们窗口的宽高//比一致,否则图形会变形;参数4:最近点;参数5:最远点

D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );

g_pD3DDevice->SetTransform( D3DTS_PROJECTION, &matProj );}

旋转,平移,缩放部分代码:

VOID SetupWorldMatrice()

{

//建立一个绕X轴动态旋转的世界矩阵

D3DXMATRIX matWorld;

//D3DXMatrixIdentity(&matWorld);// 绘制图像

x+=0.01f; //平移

//D3DXMatrixTranslation(&matWorld,x,0.0f,0.0f);

//缩放

//D3DXMatrixScaling(&matWorld,x,x,x); //旋转x,y,z //D3DXMatrixRotationX(&matWorld,x); //D3DXMatrixRotationY(&matWorld,x); //D3DXMatrixRotationZ(&matWorld,x); //指定轴,指定旋转 const D3DXVECTOR3 axis( 1.0f, 1.0f,1.0f );

D3DXMatrixRotationAxis(&matWorld,&axis,x);

//设置世界矩阵

g_pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld );

第11页(共12页)

}

void Render()

{

if(g_pD3DDevice == NULL)

{

return;

}

//Clear the backbuffer to black

//清空后备缓冲区为黑色

g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

//开始绘制场景

g_pD3DDevice->BeginScene();

SetupViewandProjMatrices();

SetupWorldMatrice();

//Rendering our triangle

//渲染三角形 if(SUCCEEDED(InitialiseVertexBuffer())) { g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer, 0,

sizeof(CUSTOMVERTEX));

g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);

g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12);

}

//结束绘制场景

g_pD3DDevice->EndScene();

//翻页显示

g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

}

第12页(共12页)

相关推荐