首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

【Visual C++】游戏开发札记二十七 Direct3D 11入门级知识介绍

2012-07-20 
【Visual C++】游戏开发笔记二十七Direct3D 11入门级知识介绍本系列文章由zhmxy555(毛星云)编写,转载请注明

【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍



本系列文章由zhmxy555(毛星云)编写,转载请注明出处。

http://blog.csdn.net/zhmxy555/article/details/7707628


作者:毛星云    邮箱: happylifemxy@qq.com    期待着与志同道合的朋友们相互交流



上一节里我们介绍了在迈入DirectX 11的学习旅程之后第一个demo创建的全过程。但由于知识衔接的需要,我们的第一个demo里面涉及到的大部分知识都是关于Win32的。而为了使之前讲解的Blank Win32 Window Demo蜕变成我们期望的Direct3D的模样,我们将在这节的笔记里面对Direct3D的入门级的基础知识做一个详细的介绍,以便在下节笔记里轻车熟路地写出属于我们的第一个完整的Direct3D11 Demo。


       由于DirectX 11庞杂的知识体系,初学DirectX11在所难免地会面对浩如烟海而略显枯燥的基础知识的介绍,在依次介绍完必要的知识之后,浅墨会按照【Visual C++】游戏开发笔记系列专栏的传统风格,逐步放出几个有趣的基于DirectX 11的小游戏demo,敬请期待。

 

 

入门知识的第一步当然是进行DirectX开发环境的配置,这在笔记二十五里面有详细介绍,详情请移步:


【Visual C++】游戏开发笔记二十五 最简化的DirectX 11开发环境的配置



 

下面就开始正题,我们将分八个部分对入门级的Direct3D知识进行一个讲解。




一、 Direct3D的初始化

 



初始化Direct3D,我们需要完成以下四个步骤:

1.定义我们需要检查的设备类型(device types)和特征级别(feature levels)

2.创建Direct3D设备,渲染设备(context)和交换链(swap chain)。

3.创建渲染目标(render target)。

4.设置视口(viewport)

这里只是给大家一个框架的概念,各个部分下面会详细展开讲解。



 

二、驱动设备类型与特征等级



 

在Direct3D 11中我们能使用的设备有硬件设备(hardware device),参考设备(reference device),软件驱动设备(software driver device), 以及WARP设备 (WARP device)。



硬件设备(hardware device)是一个运行在显卡上的D3D设备,在所有设备中运行速度是最快的。这将是我们日后讨论最多的一种类型。


参考设备(reference device)是用于没有可用的硬件支持时在CPU上进行渲染的设备。

简言之,参考设备就是利用软件,在CPU对硬件渲染设备的一个模拟。但是不幸的是,这种方式非常的低效,所以在开发过程中,没有其他可用选择的时候,我们才采用这种方式。比如新一代的DirectX发布了,市面上还没有支持这种新版本DirectX的硬件,我们在开发过程中就只能采用这种方式来跑了。

 

软件驱动设备(software driverdevice)是开发人员自己编写的用于Direct3D的渲染驱动软件。这种方式通常不推荐用于高性能或者对性能要求苛刻的应用程序,下面介绍的WARP设备将是更好的选择。


WARP设备(WARPdevice)是一种高效的CPU渲染设备,可以模拟现阶段所有的Direct3D特性。WARP使用了Windows Vista /Windows 7/Winodws 8中的Windows Graphic 运行库中高度优化过的代码作为支撑,这让这种方式出类拔萃,相比与上文提到的参考设备(reference device)模式更加优秀。WARP设备在配置不高的机器上面可以达到化腐朽为神奇的功效。在我们的硬件不支持实时应用程序(real-time application)的情况下,用WARP设备作为替补是一个明智的选择,因为相比而言,参考设备(reference device)的执行效率实在是无法令人恭维。即便如此,WARP设备的执行效率还是不能和硬件设备同日而语,毕竟它依旧是对硬件的一种模拟,即使这种模拟是非常高效的。

 

注意:这不是对设备类型一个完整的列举,还有很多细枝末节的设备类型,在这里没必要一一列举

 

Direct3D的特征等级用于指定需要设定的设备目标。在这个专栏之中,我们将针对三种设备,第一种当然是我们的Direct3D 11设备,第二种为Direct3D 10.1设备,第三种为Direct3D 10.0设备。再这三种设备都无法支持的情况下,我们再选择WARP设备或者参考设备作为后援。

 

下面贴出来的代码段1为后面我们需要用到的驱动类型和特征级别的一个声明。通过创建各种类型的数组,我们可以使用循环来尝试首先创建我们最需要的设备,然后若执行失败则继续创建其他的设备类型。浅墨记得我们之前提到过,Win32宏ARRAYSIZE能够用来返回一个数组的大小,Win32函数GetClientRect可以用来计算应用程序客户区的大小。算出来的值会用于设置之后的D3D设备渲染的宽度和高度。

另外,需要记住Win32应用程序是分客户区和非客户区的,我们仅能在客户区上进行渲染。


代码段1 指明驱动设备类型和特征等级

 



心得:在释放对象前,我们经常通过检查来确保DirectX对象不为null。因为试图释放一个非法的指针是非常不科学的,这会使我们游戏程序的稳定性荡然无存,经常各种无故崩溃。


本篇文章到这里就结束了,谢谢欣赏。




感谢一直支持【Visual C++】游戏开发笔记系列专栏的朋友们。

【Visual C++】游戏开发 系列文章才刚刚展开一点而已,因为游戏世界实在是太博大精深了~

但我们不能着急,得慢慢打好基础。做学问最忌好高骛远,不是吗?

 

浅墨希望看到大家的留言,希望与大家共同交流,希望得到睿智的评论(即使是批评)。

你们的支持是我写下去的动力~

 

精通游戏开发的路还很长很长,非常希望能和大家一起交流,共同学习,共同进步。

大家看过后觉得值得一看的话,可以顶一下这篇文章,你们的支持是我继续写下去的动力~

如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨相关的问题。

最后,谢谢你们一直的支持~~~

                                               

 

                                                 ——————————浅墨于2012年7月1日









 

9楼liutengteng130昨天 17:13
LZ写的很好,支持,加油哈。
Re: zhmxy555昨天 19:14
回复liutengteng130n谢谢~
8楼yjwhhh昨天 17:13
博主的更新速度有点慢
7楼cecfghb昨天 17:09
写得很仔细,但感觉对交换链讲得不够明白。。。
Re: zhmxy555昨天 17:12
回复cecfghbn谢谢你的指出~以后有机会会更详细讲解的。
6楼yifuzhiming昨天 17:00
为什么不接着以前的风格,也没有例子源代码,一下子就是DX11,有点不习惯,习惯了DX9了,不知道会不会很大不同,期待作者用DX演示一下粒子系统
Re: zhmxy555昨天 17:01
回复yifuzhimingn毕竟DirectX这一块才刚开始,基础知识先要介绍到位。不然就是走路都不会就在学跑了,似乎不合适吧。嗯,喜闻乐见的各种小demo在合适的时候会逐步放出的
Re: zhmxy555昨天 17:07
回复yifuzhimingn用DirectX演示粒子系统会提上日程的,谢谢你的建议~~
5楼yuan5531750昨天 13:24
希望你能越讲越好
Re: zhmxy555昨天 17:00
回复yuan5531750n嗯,谢谢~
4楼jangdelong520昨天 22:06
不错。
Re: zhmxy555昨天 23:17
回复jangdelong520n谢谢~
3楼yezhoumin136昨天 14:43
楼主的东西几乎就是www.ultimategameprogramming.com的DX11教程,只能说楼主英文不错
Re: zhmxy555昨天 19:46
回复yezhoumin136n是的,DirectX11的开始这几节我主要参考的就是这本书以及DirectX 11的官方文档,借鉴了其中的讲解形式的知识分类形式,翻译过程中在字里行间加入了很多个人的思考。
2楼vs2008wujiang前天 09:18
我会一直支持你的,学习之后,受益匪浅,希望能得到一些游戏开发的资料,邮箱地址 markzzzxyz@yahoo.com.cn
Re: zhmxy555昨天 09:40
回复vs2008wujiangn已发送,请查收~
1楼weiqubo前天 09:16
这是什么风格?用下划线做变量后缀,不过用也该用在成员变量身上。

热点排行