VC++2010游戏开发随记之二十七
vc++2010实验实训结果或结论

vc++2010实验实训结果或结论VC++2010是微软推出的一款集成开发环境,主要用于C++程序的开发。
通过实验实训,我们对VC++2010进行了深入的学习和实践,掌握了其基本操作和功能,同时也对其在C++程序开发中的应用进行了探索和实践。
在实验实训过程中,我们获得了许多有价值的经验和知识,并得出了一些结论和结果。
首先,在实验实训中,我们深入了解了VC++2010的界面和功能。
VC++2010的界面清晰明了,功能丰富多样,包括代码编辑器、解决方案资源管理器、工具箱、属性窗口、输出窗口等。
我们学会了如何创建新项目、添加文件、编写代码、编译和运行程序等基本操作,也熟悉了VC++2010的各种工具和窗口的功能和用法。
其次,在实验实训中,我们掌握了VC++2010在C++程序开发中的应用。
我们通过实例分析和练习,学会了使用VC++2010进行C++程序的开发和调试。
我们编写了一些简单的C++程序,如Hello World程序、计算器程序、图形图像处理程序等,通过这些实践,我们深入了解了VC++2010在C++程序开发中的应用和技巧。
此外,在实验实训过程中,我们还发现了一些问题和解决了一些难点。
比如,在编写程序时遇到了一些错误和异常,我们通过调试和查阅资料,最终找到了解决方法。
我们还发现了一些VC++2010的一些特性和功能,如智能感知、代码重构、版本控制等,这些功能使得程序的开发和维护更加高效和便捷。
最后,通过实验实训,我们得出了一些结论和结果。
首先,VC++2010是一款功能强大、易用便捷的集成开发环境,适用于C++程序的开发。
其次,VC++2010在C++程序开发中具有丰富的功能和工具,包括代码编辑器、调试工具、版本控制等,能够满足程序开发的各种需求。
再次,通过实验实训,我们对VC++2010有了深入的了解和掌握,获得了宝贵的经验和知识,这将对我们今后的学习和工作有很大的帮助。
总之,通过VC++2010实验实训,我们对VC++2010有了全面的了解和掌握,对C++程序的开发也有了更深入的理解和实践。
VisualC++2010的使用

VisualC++2010的使⽤Tools->Settings>Rest... 还原所有设置运⾏程序:"D:\Program Files\VCExpress\Install\Microsoft Visual Studio 10.0\Common7\IDE\VCExpress.exe"⼀、Visual C++2010(微软vc2010)如何编写并运⾏C++程序?1、刚开始打开vc2010编译器的时候是⼀个start page 页⾯。
根据页⾯的New Project. . .提⽰选项新建⼀个项⽬。
2、选择Win32 Console Application(win32控制台程序),键⼊项⽬名。
3、新建⼀个win32的空⼯程Empty project。
4、新建后的界⾯如下图所⽰。
5、选中项⽬名,添加⼀个新项⽬。
右键Add -> New Item。
在⽂件类型中选择C++ file。
6、在菜单栏的空⽩处点击右键添加快捷按钮,点击Build,菜单栏显⽰Build按钮。
7、编写程序如下图所⽰,编写完后按build 和 Start Debugging按钮。
对应位置如图所⽰。
程序运⾏。
今天初次使⽤VS2010版本,在coding完⼀个⼯程后,报错:LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt编译也没有任何错误,链接⼀直报错,也找不出什么原因,上⽹找了找,是⼯具的原因。
Microsoft Visual Studio 2010 英⽂版Project->xx PropertiesManifest->Input and Output->Embed Manifest将yes修改为no再重新编译OK了microsoft visual c++ 2010 express will run for 22 more daysvisual c++ 2010 express注册码6VPJ7-H3CXH-HBTPT-X4T74-3YVY7那么我们怎么来写⼀个C语⾔程序呢?和创建c++程序⼀样我就写了如下C程序,按F5后运⾏⼀下就没了,怎么解决呢?有两种⽅法:(⼀)Ctrl+F5可以解决:最后运⾏到的结果⽅法⼆:加system(“pause”);但是头⽂件要改变为c++标准头⽂件#include<iostream>using namespace std;加好了再按F5就可以了。
VC++2010游戏开发随记之二

【Visual C++】游戏开发笔记之二——最简单的DirectX,vc窗口的编写笔记一中我们介绍了如何用代码创建空的win32窗口,然而创建空的win32窗口只完成了一半的工作,接下来要做的工作是设置Direct3D,从而可以在屏幕上渲染图形。
Direct3D要调用很多函数才能成功设置API。
一旦完成设置,并且设置成功,就可以向屏幕上渲染图形。
下面是函数中设置Direct3D所需的最少代码。
[cpp]view plainc opyprint?1.bool InitializeD3D(HWND hWnd, bool fullscreen)2.{3.D3DDISPLAYMODE displayMode;4.// Create the D3D object.5.g_D3D = Direct3DCreate9(D3D_SDK_VERSION);6.if(g_D3D == NULL) return false;7.// Get the desktop display mode.8.if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))9.return false;10.// Set up the structure used to create the D3DDevice11.D3DPRESENT_PARAMETERS d3dpp;12.ZeroMemory(&d3dpp, sizeof(d3dpp));13.if(fullscreen)14.{15.d3dpp.Windowed = FALSE;16.d3dpp.BackBufferWidth = 640;17.d3dpp.BackBufferHeight = 480;18.}19.else20.d3dpp.Windowed = TRUE;21.d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;22.d3dpp.BackBufferFormat = displayMode.Format;23.// Create the D3DDevice24.if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,25.D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))26.{27.return false;28.}29.return true;30.}上段代码中的InitializeD3D函数的参数有窗口句柄hWnd,标识窗口是否全屏的标识符fullscreen。
基于Visual C++ 2010开发Windows7应用-开发多点触控MFC应用程序

基于Visual C++ 2010开发Windows7应用-开发多点触控MFC应用程序收藏此文于2010-05-05被推荐到CSDN首页当下电脑变得越来越智能化,越来越无所不能,触摸屏的普及只是时间问题了。
虽然鼠标和键盘不会很快就离开人们的视野,毕竟人们使用鼠标跟键盘已经成为一种习惯,但是处理信息或者说操作电脑的其他方法也层出不穷——比方触控技术。
从硬件技术的角度来讲,触控技术是可行的,随着最新一代的触摸屏技术,接触技术现在已经存在,如今Web 开发人员可以利用Silverlight 3提供多点触摸功能。
可惜的是,只有Windows 7同时支持Silverlight和多点触摸能力。
这个因素大大制约了这部分功能的运用和推广,不过如果多点触摸继续流行开来的话,情况会有所改变的,不过现在Windows 7为触摸屏技术提供了发挥的软件空间,Windows 7让屏幕触控技术成为可能。
借助Windows 7 和触摸感应屏幕,您只需使用手指即可在电脑上翻阅在线报纸,翻阅相册,拖拽文件和文件夹。
多年来在Windows 中早已开始采用触控技术。
Windows 7 进一步将其扩展到电脑的每个角落。
“开始”菜单和任务栏现在都采用了加大显示、易于手指触摸的图标。
常用的Windows 7 程序也都可以执行触摸操作。
您甚至可以在“画图”中使用手指来画图!Windows 触控功能还可以识别多点触控(使用适当的监视器)。
是否需要缩小图片将手指捏在一起即可。
是否要用鼠标右键单击某项内容?用一个手指触及该内容,并用第二个手指点击屏幕即可。
Windows 触控功能仅在Windows 7 的家庭高级版、专业版和旗舰版中提供。
什么是触控操作呢?触控指Windows 允许你使用手指直接与电脑进行交互的方式。
与使用鼠标、键盘或手写笔相比,触摸更加方便、自然、具有吸引力。
也更符合人们日常的交流习惯。
而Windows 7中引入了全新的多点触摸的概念。
VS2010_C++指导教程

Visual Studio IDE 简介 (C++)Visual Studio 集成开发环境 (IDE) 提供了一组工具,可帮助您编写和修改代码,以及检测和更正错误。
在这些主题中,您将创建一个新的标准 C++ 程序,并使用 Visual Studio 为 C++ 开发人员提供的功能测试该程序的功能。
您创建的简单程序将跟踪有多少个玩家正在玩各种纸牌游戏。
本演练涵盖以下内容:∙演练:使用项目和解决方案 (C++)∙演练:生成项目 (C++)∙演练:测试项目 (C++)∙演练:调试项目 (C++)∙演练:部署程序 (C++)演练:使用项目和解决方案 (C++)在 Visual Studio 中,可以将您的工作组织为项目和解决方案。
一个解决方案可以包含多个项目,例如,一个 DLL 和一个引用该 DLL 的可执行文件。
有关更多信息,请参见介绍解决方案、项目和项。
此演练演示如何创建项目,使用“解决方案资源管理器”向项目中添加文件,在文件中键入代码,然后生成项目。
创建项目在使用 Visual Studio 编写 Visual C++ 程序的过程中,第一个任务是选择项目的类型。
对于每种项目类型,Visual Studio 都为您设置编译器设置并生成起始代码。
在此演练中的项目中,您将创建一个基本程序,该程序跟踪有多少个玩家正在玩不同的纸牌游戏。
创建项目1.在“文件”菜单上指向“新建”,再单击“项目”。
2.在“项目类型”区域中,单击“Visual C++”。
然后,在“Visual Studio 已安装的模板”窗格中,单击“Win32 控制台应用程序”。
3.键入项目名称。
对于此示例,请键入 game。
当您创建项目时,Visual Studio 会将该项目放入一个解决方案。
默认情况下,解决方案的名称与项目名称相同。
接受该名称。
您可以接受默认位置、键入一个不同的位置或者浏览到要保存项目的目录。
单击“确定”启动“Win32 应用程序向导”。
VC++2010游戏开发随记之十二

【Visual C++】游戏开发笔记十二游戏输入消息处理(一)键盘消息处理相信大家都熟悉《仙剑奇侠传98柔情版》的人机交互方式,用的仅仅是键盘。
在那个物质并不充裕的时代,一台配置并不高的电脑,一款名叫《仙剑奇侠传》的游戏,却能承载一代人对梦想的追逐。
虽然在这十几年间,各种新潮的游戏层出不穷,但是《仙剑奇侠传98柔情版》,作为国产单机游戏无法被超越的传奇,已经永远留在了我们这代人的心中。
那是一个永远无法被取代的,最最唯美的梦。
从这节笔记开始,我们就开始讲解游戏输入消息的处理,开始人机交互,开始真正意义上的游戏开发。
这一节里我们主要讲解键盘消息的处理。
键盘作为基本的输出装置,在每一款优秀的游戏研发中都有着至关重要的地位(当然我们在这里暂时不讨论ios和android平台)。
首先我们对Windows系统下键盘的基本概念及键盘消息的处理方式做一个简单介绍。
1.虚拟键码所有键盘的按键都被定义出一组通用的“虚拟键码”,也就是说在Windows系统下所有按键都会被视为虚拟键(包含鼠标键在内),而每一个虚拟键都有其对应的一个虚拟键码。
2.键盘消息Windows系统是一个消息驱动的环境,一旦使用者在键盘上进行输入操作,那么系统便会接收到对应的键盘消息,下面我们列出最常见的3种键盘消息:WM_KEYDOWN 按下按键的消息WM_KEYUP 松开按键消息WM_CHAR 字符消息当某一按键被按下时,伴随着这个操作所产生的是以虚拟键码类型传送的WM_KEYDOWN与WM_KEYUP消息。
当程序接收到这些消息时。
便可由虚拟键码的信息来得知是哪个按键被按下。
此外,WM_CHAR则是当按下的按键为定义于ASCⅡ中的可打印字符时,便发出此字符消息。
3.系统键Windows系统本身定义了一组“系统键”,这些按键通常都是【Alt】与其他按键的组合,系统键对于Windows系统本身有一些特定的作用,Windows中也特别针对系统键定出了下面的相关消息WM_SYSKEYDOWN 按下系统键消息WM_SYSKEYUP 松下系统键消息消息代号中加入“SYS”代表系统键按下消息,然而实际上程序中很少处理系统键消息,因为当这类消息发生时Windows会自行处理并进行相应的工作。
vc2010详细介绍
《Visual C++ 2010入门教程》写在前面在我还在上学的时候,我选择了C++,最初我用VC6作为我的IDE,我看过很多本C++的教材,有的适合我,有的不适合我,其中有一本叫《Visual C++ 2005入门经典》的书帮了我不少的忙。
因为通常的C++教材都只会介绍C++的语法什么的,很少会告诉我们如何去编译、运行,告诉我们什么是控制台程序,什么事Win程序,什么是GUI程序,C++能干什么,VC 和C++的区别是什么。
现在有很多的朋友应该也有这些问题吧?学C++用C++也有几年了,算不上熟悉,算是初窥门径吧,我想我应该做点什么帮助一下那些和曾经的我一样困惑的朋友,特别是学生朋友,告诉他们他们所困惑的问题的答案.记得我学C++的时候,没有人教,有的时候也走了不少弯路,甚至连调试也不会,也不知道可以通过看调用堆栈看调用次序,还自己慢慢的去搜索,好傻啊.接下来我会做一个《Visual C++ 2010入门教程》系列,用来帮助初学者。
刚开始学的时候是很痛苦的,这个我深有体会,特别是身边还没有人能够指导一二的。
内容主要涵盖在Windows下面使用C++进行开发的常见内容,Visual Studio 2010的使用,如何创建新项目,如何调试,如果配置项目属性等等,另外还会介绍Visual C++ 2010中新加如的一些内容,包括一些新的STL组建,一些新的语法支持等等。
由于本人水平有限,其中难免有错误,希望大家谅解,如果大家有发现问题还请务必及时指出来,否则误导了他人我就罪不容恕了。
注意,本教程非C++教程,不会教你C++,只会教你如何使用Visual C++ 2010去练习去学习其它C++教材上面的程序.因此建议大家认真的去看其他的C++教程,在使用Visual C++ 2010实践的时候如果遇到问题可以到这里来参考.推荐《C++ Primer》、《C++程序设计语言》《Visual C++ 2008入门经典》。
C#2010 制作迷宫游戏
C#2010 制作迷宫游戏C#2010制作迷宫游戏引言本文档将介绍如何使用C#2010制作迷宫游戏。
迷宫游戏是一种有趣且富有挑战性的游戏,玩家需要在迷宫中寻找出口。
我们将通过使用C#2010编程语言来创建一个基本的迷宫游戏。
步骤一:准备工作在开始制作迷宫游戏之前,您需要准备以下工作:1. 一台安装有C#2010的计算机。
2. 对C#编程语言有一定的了解。
3. 图形用户界面(GUI)设计的基本知识。
步骤二:创建游戏窗体在C#2010中,您可以使用Windows Forms应用程序来创建游戏窗体。
以下是创建游戏窗体的步骤:1. 打开Visual Studio 2010,并创建一个新的Windows Forms应用程序项目。
2. 设计游戏窗体的外观,包括标题、大小和背景色等。
步骤三:绘制迷宫在游戏窗体上绘制迷宫是制作迷宫游戏的关键步骤。
以下是绘制迷宫的一种方法:1. 使用C#的绘图功能,创建游戏窗体上的迷宫地图。
2. 定义迷宫的大小和结构。
3. 绘制迷宫的墙壁和通道。
步骤四:添加玩家角色玩家角色是游戏的主要参与者,他们需要通过迷宫找到出口。
以下是如何添加玩家角色的步骤:1. 在游戏窗体上添加一个角色图像或图标。
2. 实现玩家角色的移动功能,例如使用键盘控制。
步骤五:设置游戏规则和目标为了使迷宫游戏更有挑战性,您可以设置一些游戏规则和目标。
以下是一些示例:1. 设置游戏的时间限制。
2. 添加障碍物或敌人,使游戏更有难度。
3. 定义玩家需要达到的目标,例如收集所有宝藏或解决谜题。
步骤六:添加游戏功能为了增加游戏的趣味性和交互性,您可以添加一些额外的游戏功能。
以下是一些建议:1. 添加音效和背景音乐。
2. 提供游戏暂停和重新开始功能。
3. 计分系统和排行榜。
结论通过本文档,您了解了使用C#2010制作迷宫游戏的基本步骤。
希望这些信息对您有所帮助,祝您成功创建一个有趣的迷宫游戏!。
VC++2010游戏开发随记之三十八
【V isual C++】游戏开发笔记三十八浅墨DirectX提高班之六携手迈向三维世界:四大变换展身手本篇文章里,我们首先对Direct3D中固定功能渲染流水线相关概念进行了深入的剖析,然后介绍了创建三维游戏世界的四大变换的概念和使用的方方面面,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载。
从本篇文章开始我们就来开始来学习固定渲染流水线这套渲染体系。
其实固定渲染流水线和之后我们要学习的可编程渲染流水线体系有很多异曲同工之妙,所以先学习固定功能渲染流水线体系,再学可编程渲染流水线体系,就可以循序渐进,步步为营地掌握好DirectX。
空间中的物体需要使用三维坐标来描述,而我们的显示器是显然是二维的,所以在屏幕上渲染一个三维场景时,首先需要将物体描述空间物体的三维坐标变换为二维坐标(也就是世界坐标到屏幕坐标),这在Direct3D中称为顶点坐标变换。
顶点坐标变换通常通过矩阵来完成。
我们之前的几个demo中,演示的是如何显示一个二维的平面图形,它的顶点是以屏幕坐标系的二维值表示的,也是经过顶点坐标变换之后的顶点坐标数据,可以把顶点坐标变换想象成摄像的过程,三维世界的景物通过摄像机拍摄显示在二维的相片之上,有所不同的是把相片换成了屏幕。
文章开头,我们先来看一下固定功能渲染流水线这套渲染体系的核心思想。
一、固定功能渲染流水线概述在固定功能渲染流水线这套体系中,大体分为两个阶段,第一阶段我们将它称为坐标变换和光照处理阶段(Transforming &Lighting,简称T&L阶段)。
在这个阶段中,每个对象的顶点从一个抽象的、浮点坐标变换到基于像素的屏幕空间当中。
这里需要注意的是,坐标变换不仅包含物体顶点位置,它还可能包括顶点的法线、纹理坐标等等。
并根据场景中光源和物体表面的材质对物体顶点应用不同类型的光照效果。
还有其他一些比较重要的任务,比如视口的设置和裁剪也是在第一阶段进行的。
VC++2010游戏开发随记之三
【V isual C++】游戏开发笔记之三——绘制图元使用Direct3D绘制图元我们接下来的部分将介绍使用Direct3D在屏幕上绘图的图元。
计算机图形学中的图元是可以渲染到屏幕上的基本形状。
将图元组合在一起可以构成不同的形状和物体,诸如人物模型、场景物体、墙、建筑物等。
最常用的图元是三角形。
在游戏中常使用三角形,这是因为这样可以优化现代图形硬件,有效处理这类图元。
其他图元包括四方形、直线和多边形。
多边形被认为是图形,它是由直线构成的封闭区域。
Direct3D中在屏幕上绘制图元的方法主要有两种。
第一种是使用指针将几何图形数据数组发送给某个Direct3D函数。
通常很少使用这种方法,因为这种方法运行缓慢,而且效率很低。
这种方法之所以运行缓慢,是因为在Direct3D内部要对数据做一些不必要的工作,这样才能将数据下传给流水线,流水线负责绘制每个对象的每一帧。
第二种方法是在绘制几何图形时使用一种名为顶点缓存的结构。
顶点缓存是一个Direct3D对象,它可以按照Direct3D格式存储几何图形数据。
借助用户指针(第一种方法),每次在程序中调用渲染函数时,Direct3D都不得不创建一个临时顶点缓存。
这很浪费时间,尤其是如果信息没有发生变化,而且从技术角度而言,只需要创建顶点缓存一次时。
为了使用用户指针在屏幕上绘制图元或图元组,就要调用Direct3D设备对象中的DrawPrimitive()函数。
该函数原型如下所示:[cpp]view plainc opyprint?1.HRESULT DrawPrimitiveUP(2.D3DPRIMITIVETYPE PrimitiveType,3.UINT PrimitiveCount,4.CONST void* pVertexStreamZeroData,5.UINT VertexStreamZeroStride6.);DrawPrimitiveup()函数的参数包括要绘制的图元类型、图元数量、保存要绘制的数据数组、顶点流大小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【Visual C++】游戏开发笔记二十七Direct3D 11入门级知识介绍上一节里我们介绍了在迈入DirectX 11的学习旅程之后第一个demo创建的全过程。
但由于知识衔接的需要,我们的第一个demo里面涉及到的大部分知识都是关于Win32的。
而为了使之前讲解的Blank Win32 Window Demo蜕变成我们期望的Direct3D的模样,我们将在这节的笔记里面对Direct3D的入门级的基础知识做一个详细的介绍,以便在下节笔记里轻车熟路地写出属于我们的第一个完整的Direct3D11 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 /Windows7/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 指明驱动设备类型和特征等级[cpp]view plaincopyprint?1.RECT dimensions;2.GetClientRect( hwnd, &dimensions );3.unsigned int width = dimensions.right - dimensions.left;4.unsigned int height = dimensions.bottom - dimensions.top;5.D3D_DRIVER_TYPE driverTypes[] =6.{7.D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP,D3D_DRIVER_TYPE_SOFTWARE8.};9.unsigned int totalDriverTypes = ARRAYSIZE( driverTypes );10.D3D_FEATURE_LEVEL featureLevels[] =11.{12.D3D_FEATURE_LEVEL_11_0,13.D3D_FEATURE_LEVEL_10_1,14.D3D_FEATURE_LEVEL_10_015.};16.unsigned int totalFeatureLevels = ARRAYSIZE( featureLevels );三、设备与交换链的创建下一步便是创建一个交换链,交换链在Direct3D中为一个设备渲染目标的集合。
每一个设备都有至少一个交换链,而多个交换链能够被多个设备所创建。
一个交换目标可以为一个渲染和显示到屏幕上的颜色缓存(在后面会讨论),等等。
通常在游戏中有,有两种颜色缓存,分别叫做主缓存和辅助缓存,他们一起被称为前后台缓存组合。
主缓存中的内容(前台缓存)会显示在屏幕上,而辅助缓存(后台缓存)用于绘制下一帧(真是两个好基友-o-)。
渲染的发生非常之快,屏幕的一部分可以在显示器完成显示更新之前,在先前的结果为基础上进行绘制。
缓存之间的切换,可以进行一个良性的运作,前台在显示图像,后台正在为前台准备下一刻将要显示的图像,这样做可以避免很多棘手的问题,提高了效率。
这种技术在计算机图形学中叫做双缓冲(doublebuffering),或者叫页面翻转(page flipping)(这种技术我们之前的一系列Win32 GDI demo中使用得比较勤,研究了之前的demo的朋友们应该已经耳濡目染了吧)。
一个交换链能拥有一个或者多个这样的缓冲。
代码段2中列出了创建一个交换链的代码。
一个交换链的描述用来定义和创建符合我们需要的交换链。
代码段2 对交换链的设置[cpp]view plaincopyprint?1.DXGI_SWAP_CHAIN_DESC swapChainDesc;2.ZeroMemory( &swapChainDesc, sizeof( swapChainDesc ) );3.swapChainDesc.BufferCount = 1;4.swapChainDesc.BufferDesc.Width = width;5.swapChainDesc.BufferDesc.Height = height;6.swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;7.swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;8.swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;9.swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;10.swapChainDesc.OutputWindow = hwnd;11.swapChainDesc.Windowed = true;12.swapChainDesc.SampleDesc.Count = 1;13.swapChainDesc.SampleDesc.Quality = 0;14.这个范例中定义了D3D的多种取样属性,多重取样(Multisampling)是一种用于采样和平衡渲染像素的创建亮丽色彩变化之间的平滑过渡的一种技术。
缓存的使用和交换链的描述有大量的成员需要设置,但这些设置都是非常简单的。
缓存的对交换链的使用是设置下DXGI_USAGE_RENDER_TARGET_OUTPUT,以便交换链能够用于输出,或者换句话说,它能被渲染。
下一步是创建渲染上下文,渲染设备,以及我们拥有的交换链描述。
D3D设备一般都是设备本身和硬件之间的通信,而D3D上下文是一种描述设备如何绘制的渲染设备上下文,这也包含了渲染状态和其他的绘图信息。
正如我们讨论过的,交换链是设备和上下文将要绘制的渲染目标。
创建设备上下文,渲染上下文和交换链所需的代码在代码段3中详细列出了,.这段代码为下次内容即将展示的Direct3D 11 BlankWindows Demo的一个片段。
代码段3 Direct3D设备,设备上下文,以及交换链的创建[cpp]view plaincopyprint?1.ID3D11Device device_;2.ID3D11Context d3dContext_;3.IDXGISwapChain swapChain_;4.unsigned int creationFlags = 0;5.#ifdef _DEBUG6.creationFlags |= D3D11_CREATE_DEVICE_DEBUG;7.#endif8.HRESULT result;9.unsigned int driver = 0;10.for( driver = 0; driver < totalDriverTypes; ++driver )11.{12.result = D3D11CreateDeviceAndSwapChain( 0, driverTypes[driver],0,13.creationFlags, featureLevels, totalFeatureLevels,14.D3D11_SDK_VERSION, &swapChainDesc, &swapChain_,15.&d3dDevice_, &featureLevel_, &d3dContext_ );16.if( SUCCEEDED( result ) )17.{18.driverType_ = driverTypes[driver];19.break;20.}21.}22.if( FAILED( result ) )23.{24.DXTRACE_MSG( "Failed to create the Direct3D device!");25.return false;26.}27.交换链,设备和渲染上下文可以在单独的Direct3D函数调用中被创建,或者通过特定对象的Direct3D来调用(例如用CreateSwapChain函数来专门创建一个交换链)。