【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日