VC++2010游戏开发随记之三十八
- 格式:doc
- 大小:1.12 MB
- 文档页数:42
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++程序的开发也有了更深入的理解和实践。
【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 studio 2010学习心得1、多行注释:/*开始,*/结束。
2、去掉最后的}再加上,会自动对齐语句。
3、关键字的颜色为蓝色。
4、变量:计算机内存中用来存取值的地方。
使用:①声明变量。
②初始化变量。
变量名最好用小写字母开头。
变量赋值时新值会覆盖钓旧值。
5、字符串要包含在双引号中,单个字符则要包含在单引号中。
6、整数默认为int类型;浮点数默认为都double类型。
7、this.close()→关闭当前应用程序。
8、int.parse→把其他类型转化为int类型。
9、c#里%两边不一定是整型。
10、count=count+1;count++;++count等价。
11、var必须在声明的同时初始化。
12、方法定义时,返回值和参数列表中的数据类型不能是var,void不需要有返回值,调用return语句目的为提前结束该调用方法,return以后的语句不再执行。
13、类全局变量,除main()方法外所有方法均可访问,没有默认值的参数在前面,有默认值的在后面。
14、{n}表示占位符。
15、一般把简单条件表达式放在逻辑表达式左边,复杂的放在右边。
16、if语句没有必要用bool型变量,如执行多条语句需放在大括号里,通常只有一条语句也放在大括号里。
17、+=表示在原字符串基础上连接新字符串。
18、while循环语句①表达式必须是bool类型。
②bool类型表达式必须写在圆括号里。
③若第一次执行时bool类型表达式的值为false,则循环语句一次都不执行。
④若循环中包含两个或两个以上的语句,则这些语句必须包含在一对大括号里,组成语句块。
19、for循环中变量作用域仅局限于该循环内部。
20、do while循环体至少执行一次。
21、finally语句无论出现什么情况都会执行。
22、try语句必须跟catch霍finally结构中的一个或者两个都跟。
23、类里面包含字段和方法,其最基本的属性为封装。
【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 for范围(原创版)目录1.VC 2010 的概述2.VC 2010 的应用范围3.VC 2010 的优势与不足正文【概述】VC 2010,全称 Visual C++ 2010,是由微软公司开发的一款集成开发环境(IDE),主要用于 C++ 语言的编程。
它集合了代码编辑、编译、调试等多种功能,为程序员提供了方便的编程环境。
【应用范围】VC 2010 的应用范围广泛,主要体现在以下几个方面:1.Windows 应用程序开发:利用 VC 2010,程序员可以开发各种Windows 应用程序,如桌面应用程序、控制面板应用程序等。
2.游戏开发:由于 VC 2010 具有强大的图形处理功能,许多游戏开发者选择使用它进行游戏开发。
3.嵌入式系统开发:VC 2010 支持多种嵌入式操作系统,可以用于开发嵌入式系统应用程序。
4.数据库开发:VC 2010 可以与 SQL Server 等数据库系统无缝连接,方便进行数据库应用程序的开发。
5.网络应用程序开发:VC 2010 支持 HTTP、FTP 等网络协议,可以开发各种网络应用程序。
【优势与不足】VC 2010 作为一款成熟的集成开发环境,具有许多优势,如:1.强大的编译能力:VC 2010 具有强大的编译能力,可以高效地编译C++ 代码,生成可执行文件。
2.丰富的库函数:VC 2010 提供了丰富的库函数,方便程序员进行各种功能的开发。
3.良好的调试功能:VC 2010 提供了强大的调试工具,可以帮助程序员快速定位和解决程序中的问题。
然而,VC 2010 也存在一些不足之处,如:1.学习曲线较陡峭:对于初学者来说,VC 2010 的学习曲线较陡峭,需要投入较多的时间和精力进行学习。
2.开发效率相对较低:与一些现代的集成开发环境相比,VC 2010 的开发效率可能较低。
总的来说,VC 2010 是一款功能强大的集成开发环境,适用于各种C++ 应用程序的开发。
【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()函数的参数包括要绘制的图元类型、图元数量、保存要绘制的数据数组、顶点流大小。
c++ redistributable 2010【实用版】目录1.C++ Redistributable 2010 简介2.C++ Redistributable 2010 的功能与特点3.C++ Redistributable 2010 的安装与使用4.C++ Redistributable 2010 的优势与不足5.总结正文C++ Redistributable 2010 是一款由微软公司开发的 C++ 编程工具集,可用于 Windows 平台的应用程序开发。
该工具集提供了一系列的库和工具,可以帮助开发人员快速、高效地编写 C++ 代码。
以下是该工具集的功能与特点:C++ Redistributable 2010 提供了多种库和工具,包括 C++ 标准库、ATL(Active Template Library)、MFC(Microsoft Foundation Class) 等。
这些库和工具可以帮助开发人员轻松地实现各种功能,例如文件操作、网络通信、图形界面等。
该工具集还提供了一种名为“C++/CX”的新的编程模型,可以使得开发人员更容易地编写跨平台的 C++ 代码。
C++/CX 提供了对 Windows 8 API 的支持,同时也支持其他操作系统和平台。
C++ Redistributable 2010 的安装非常简单,只需要下载相应的安装程序,然后按照提示进行安装即可。
安装完成后,开发人员可以使用该工具集提供的命令行工具和 IDE 插件来进行 C++ 编程。
虽然 C++ Redistributable 2010 提供了许多功能和工具,但是它也有一些不足之处。
例如,它只支持 Windows 平台,对于其他操作系统和平台的支持不够完善。
此外,该工具集的文档和帮助也比较有限,需要开发人员自己进行学习和探索。
C++ Redistributable 2010 是一款功能强大的 C++ 编程工具集,可以帮助开发人员快速、高效地编写 Windows 平台的应用程序。
【Visual C++】游戏开发笔记之六——游戏画面绘图(三)透明特效的制作方法作者:孙广东邮箱: 1224708372@欢迎邮件交流编程心得由于百度文库不支持压缩文件格式,源代码不能分享,很抱歉,想要源代码的请把邮箱号码发给我。
我会把源代码发给你。
我的百度空间文库:/p/a1224708372?from=wenku欢迎访问,有更多专业资料。
从这节开始我们来讲解制作一般2D游戏画面经常要使用到的绘图特效。
笔记六我们主要介绍“透明”特效的制作方法。
透明效果由于所有的图文件都是以矩形来储存的,我们也许会需要把一张怪兽图片贴到窗口的背景图上,而这种情况下如果直接进行贴图,结果如下图:这似乎不是我们想要的结果。
为了得到透明效果,我们需要运用到BitBlt()贴图函数以及其参数Raster的值来将图片中不必要的部分去掉(又称去背),使得图中的主题可以与背景完美融合。
制作透明效果有很多种方法,但是基本上都是利用贴图时不同的Raster运算,通过转换而产生相同的透明效果。
在这里先来介绍一种透明运算的方法。
我们以图中的恐龙为例子,首先准备一张位图,如下图。
图中的左边的图是要去背并贴到背景上的前景图。
右边的黑白图称为“屏蔽图”,在透明的过程中会用到它。
要把去背的位图与屏蔽图合并成同一张图,透明的时候再按照需要来进行裁切。
可以把它分成两张图,但是这样程序必须运行两次图文件加载的操作。
有了屏蔽图就可以利用贴图函数来产生透明效果了,所需的贴图步骤如下:<1>将屏蔽图与背景图做"AND"运算,Raster值为SRCAND,贴到目的地DC中。
<2>将前景图与背景图做"OR"运算,Raster值为SRCPAINT,贴到目的地DC中。
为什么经过上面两个操作就能产生透明的效果呢?看下图就理解了:下面具体说明上面两个步骤所产生的图点色彩的变化。
1.屏蔽图与背景图做"AND"运算<1>屏蔽图中的黑色部分与背景图做"AND"运算:<2>屏蔽图中的白色部分与背景图做"AND"运算:进过这一运算所产生的结果如下图2.前景图与背景图做"OR"运算<1>前景图中的彩色部分与图第一步得到的“黑色恐龙”图做"OR"运算:<2>前景图中的黑色部分与第一步得到的“黑色恐龙”图做"OR"运算:经过这一运算后所显示的画面就是所需的透明图了,如下图所示:下面我们来看看实现上述透明贴图效果的源代码[cpp]view plainc opyprint?1.#include "stdafx.h"2.//全局变量声明3.HINSTANCE hInst;4.HBITMAP bg,dra; //声明两个位图对象,分别存储背景图与前景恐龙图5.HDC mdc; //声明一个内存DC"mdc",用来暂存位图6.//全局函数声明7.ATOM MyRegisterClass(HINSTANCE hInstance);8.BOOL InitInstance(HINSTANCE, int);9.LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);10.void MyPaint(HDC hdc);11.////****Winmain函数,程序入口点函数**************************************12.int APIENTRY WinMain(HINSTANCE hInstance,13.HINSTANCE hPrevInstance,14.LPSTR lpCmdLine,15.int nCmdShow)16.{17.MSG msg;18.MyRegisterClass(hInstance);19.if (!InitInstance (hInstance, nCmdShow))20.{21.return FALSE;22.}23.//消息循环24.while (GetMessage(&msg, NULL, 0, 0))25.{26.TranslateMessage(&msg);27.DispatchMessage(&msg);28.}29.return msg.wParam;30.}31.//****设计一个窗口类,类似填空题,使用窗口结构体*************************32.ATOM MyRegisterClass(HINSTANCE hInstance)33.{34.WNDCLASSEX wcex;35.wcex.cbSize = sizeof(WNDCLASSEX);36.wcex.style = CS_HREDRAW | CS_VREDRAW;37.wcex.lpfnWndProc = (WNDPROC)WndProc;38.wcex.cbClsExtra = 0;39.wcex.cbWndExtra = 0;40.wcex.hInstance = hInstance;41.wcex.hIcon = NULL;42.wcex.hCursor = NULL;43.wcex.hCursor = LoadCursor(NULL, IDC_ARROW);44.wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);45.wcex.lpszMenuName = NULL;46.wcex.lpszClassName = "canvas";47.wcex.hIconSm = NULL;48.return RegisterClassEx(&wcex);49.}50.//****初始化函数*************************************51.// 1.建立与窗口DC兼容的内存DC52.// 2.从文件加载背景图与恐龙图53.BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)54.{55.HWND hWnd;56.HDC hdc;57.hInst = hInstance;58.hWnd = CreateWindow("canvas", "绘图窗口" , WS_OVERLAPPEDWINDOW,59.CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);60.if (!hWnd)61.{62.return FALSE;63.}64.MoveWindow(hWnd,10,10,600,450,true);65.ShowWindow(hWnd, nCmdShow);66.UpdateWindow(hWnd);67.hdc = GetDC(hWnd); //获得窗口DC68.mdc = CreateCompatibleDC(hdc); //创建与窗口兼容的内存DC(mdc)69.bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,600,450,LR_LOADFROMFILE);70.//J加载背景图到bg中71.dra = (HBITMAP)LoadImage(NULL,"dra.bmp",IMAGE_BITMAP,170,99,LR_LOADFROMFILE);72.//加载恐龙图到dra中73.MyPaint(hdc);74.ReleaseDC(hWnd,hdc);75.return TRUE;76.}77.//****自定义绘图函数*********************************78.//透明贴图79.void MyPaint(HDC hdc)80.{81.SelectObject(mdc,bg);82.BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY); //先将背景图贴到显示窗口中83.SelectObject(mdc,dra); //选用恐龙图到"mdc"中84.BitBlt(hdc,280,320,85,99,mdc,85,0,SRCAND);//进行制作贴图的第一步骤,即将屏蔽图与背景图做"AND"运算,屏蔽图在整张恐龙图中,最左上角起始位置点得坐标为(85,0),BitBlt()函数中最后一个Raster参数值设置为SRCAND。
【Visual C++】游戏开发笔记三十三 浅墨DirectX 提高班之二 化腐朽为神奇:DirectX初始化四步曲这篇文章里,我们将迈出精通DirectX的第一步,先了解典型Direct3D程序的书写流程,然后学习COM接口的对象的一些思想,然后按照“四步曲”的思路,系统地学习DirectX的初始化方法,且文章最后进行了相关源代码的赏析以及源代码的下载。
看完这篇文章,也许你会豁然开朗,哦,原来Direct3D程序的结构是这样组成的,原来COM接口并没有那么神秘,原来DirectX的初始化是这么清晰简单。
由于文章比较长,浅墨在这里给大家配一个目录。
这篇文章大体分为以下五个部分:一、典型Direct3D程序的流程分析二、关于COM接口对象的一些介绍三、DirectX初始化四步曲Ⅰ. Direct3D初始化四步曲概述Ⅱ.Direct3D初始化四步曲之一:创接口Ⅲ.Direct3D初始化四步曲之二:取信息Ⅳ.Direct3D初始化四步曲之三:填内容Ⅴ.Direct3D初始化四步曲之四:创设备Ⅵ.DirectX初始化四步曲代码赏析四、关于库文件的添加五、详细注释的源代码欣赏3D游戏编程其实就是渲染的艺术。
为了学好DirectX 3D游戏编程,Direct3D自然是需要首先精通的API,后面我们讲解DirectX,会把80%的篇幅集中在讲解Direct3D之上。
我们其实不用把3D编程想象得多么神秘,说白了,3D编程就像一只纸老虎。
就像抓葡萄要抓葡萄架子,只要我们在学习过程中抓住了学习对象的关键“命门”,学习起来也就事半功倍了。
下面就来看看我们如何抓住葡萄架子,如何抓住学习的关键点。
正所谓万剑归宗,首先我们来进入第一个部分,介绍一下Direct3D应用程序的一般框架思路。
一、典型Direct3D程序流程分析首先我们来看一张典型的Direct3D程序框架图从上面这幅框架图中我们可以发现,Direct3D程序的基本结构是非常简单清晰的,主要可以分为下面5个部分:1.创建一个Windows窗口。
C#2010 制作扫雷游戏扫雷游戏是一款经典的益智游戏,本文将介绍如何使用C#2010制作扫雷游戏。
下面是游戏的基本实现步骤:1. 创建Windows窗体应用程序项目首先,打开C#2010并创建一个新的Windows窗体应用程序项目。
选择创建一个新的空白窗体,窗体的大小和标题可以根据需要进行自定义。
2. 设计游戏界面在窗体上添加所需的控件,如按钮、标签和表格等。
这些控件将用于游戏的交互和显示。
3. 初始化游戏地图创建一个二维数组来表示游戏的地图,用数字表示每个方格的状态。
一般来说,-1表示雷,0表示空方格,其他数字表示周围的雷数。
根据游戏难度等级可以初始化不同数量的雷。
4. 实现点击事件为每个方格添加点击事件处理程序。
当该方格被点击时,根据其状态显示不同的图标或将雷显示出来。
5. 实现扫雷逻辑通过递归算法实现扫雷逻辑。
当点击一个空方格时,自动扫描周围的方格,根据周围的雷数来判断是否需要继续扫描。
6. 添加计时和计分功能在界面上添加计时器和计分板,分别用来显示游戏的消耗时间和得分情况。
7. 游戏结束检测在每次点击方格后,检查游戏是否结束。
如果点击到雷,游戏结束,显示相关提示信息。
8. 添加游戏难度选择创建一个菜单或按钮,用来选择不同的游戏难度。
根据所选择的难度,调整雷的数量和地图大小。
9. 运行测试和调试完成以上步骤后,运行游戏进行测试,并根据需要进行调试和优化。
通过以上步骤,我们可以很容易地使用C#2010制作一个简单的扫雷游戏。
根据个人的需求和兴趣,我们还可以继续扩展游戏功能和改进界面设计。
【V isual C++】游戏开发笔记三十八浅墨DirectX提高班之六携手迈向三维世界:四大变换展身手本篇文章里,我们首先对Direct3D中固定功能渲染流水线相关概念进行了深入的剖析,然后介绍了创建三维游戏世界的四大变换的概念和使用的方方面面,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载。
从本篇文章开始我们就来开始来学习固定渲染流水线这套渲染体系。
其实固定渲染流水线和之后我们要学习的可编程渲染流水线体系有很多异曲同工之妙,所以先学习固定功能渲染流水线体系,再学可编程渲染流水线体系,就可以循序渐进,步步为营地掌握好DirectX。
空间中的物体需要使用三维坐标来描述,而我们的显示器是显然是二维的,所以在屏幕上渲染一个三维场景时,首先需要将物体描述空间物体的三维坐标变换为二维坐标(也就是世界坐标到屏幕坐标),这在Direct3D中称为顶点坐标变换。
顶点坐标变换通常通过矩阵来完成。
我们之前的几个demo中,演示的是如何显示一个二维的平面图形,它的顶点是以屏幕坐标系的二维值表示的,也是经过顶点坐标变换之后的顶点坐标数据,可以把顶点坐标变换想象成摄像的过程,三维世界的景物通过摄像机拍摄显示在二维的相片之上,有所不同的是把相片换成了屏幕。
文章开头,我们先来看一下固定功能渲染流水线这套渲染体系的核心思想。
一、固定功能渲染流水线概述在固定功能渲染流水线这套体系中,大体分为两个阶段,第一阶段我们将它称为坐标变换和光照处理阶段(Transforming &Lighting,简称T&L阶段)。
在这个阶段中,每个对象的顶点从一个抽象的、浮点坐标变换到基于像素的屏幕空间当中。
这里需要注意的是,坐标变换不仅包含物体顶点位置,它还可能包括顶点的法线、纹理坐标等等。
并根据场景中光源和物体表面的材质对物体顶点应用不同类型的光照效果。
还有其他一些比较重要的任务,比如视口的设置和裁剪也是在第一阶段进行的。
讲完第一阶段,我们再来看看第二阶段,第二阶段称为光栅化处理阶段。
顶点在经过第一阶段也就是变换与光照阶段的“洗礼”之后,已经略有雏形,在第二阶段,Direct3D将这些已经完成变换和光照阶段的顶点组织为以点、线、面为基础的图元,应用纹理贴图和物体顶点的颜色属性,并根据相关渲染状态的设置(比如着色模式等),决定每个像素最终的颜色值,并且在屏幕上显示出来。
为了大家更宏观和更深入的理解,浅墨依然是配了一幅图。
通过这幅图,大家可以对固定功能渲染流水线的结构脉络做到一目了然。
需要注意的是,渲染流水线中的步骤并不一定都要有的,根据实际情况可以省略一些。
比如之前我们给出的几个demo,都是省略了变换和光照阶段,直接将顶点作为屏幕坐标输出显示。
因为我们在定义顶点的属性的时候,给我们的顶点定的“标签”是D3DFVF_XYZRHW,表示包含经过坐标变换的顶点坐标值,这样Direct3D就知道这些顶点坐标不需要再经过顶点坐标变换了,他们的坐标值就是最终显示屏幕上的坐标值了。
目前我们重点介绍坐标变换和光照处理阶段(Transforming &Lighting,简称T&L阶段),也就是T&L阶段。
在这个过程中,未经过变换和光照的顶点从一端进入,在流水线内部这些顶点将完成几个连续的操作,这几个操作按顺序分别为世界变换,取景变换,光照处理,投影变换以及视口变换。
经过这些处理之后的顶点从另一端出来,表示已经完成坐标变换和光照处理了。
我们的应用程序是通过指定几个矩阵、视口以及所使用的光线来建立T&L流水线的,然后应用程序将顶点送入流水线,并对这些顶点在流水线中进行坐标变换、照明以及裁剪,将其投影到屏幕空间当中,并根据视口的规定对其进行缩放。
顶点在T&L流水线中进过“涅槃”之后,就可以去到第二阶段——光栅化处理阶段去完成新的试炼了。
关于变换和光照渲染流水线阶段,也就是T&L阶段,浅墨也配了一幅图,方便大家的记忆与理解:二、携手迈向三维世界:四大变换显身手首先来讲讲周边的概念。
在Direct3D中,如果我们未进行任何空间坐标变换而来绘制图形的话,图形将始终处于应用程序窗口的中心位置,在默认情况下这个位置就会成为世界坐标系的原点(0,0,0)。
另外,我们也不能改变观察图形的视角方向。
默认情况下的观察方向是世界坐标系的z轴正方向,也就是垂直程序窗口并向里观察的方向。
之前我们的几个demo都是默认的z轴正方向为观察方向的。
而为了迈向三维世界,为了能够随心所欲地在三维世界中绘制和观察游戏画面,就是四大变换的show time了。
所谓四大变换,其实是浅墨自己在学习Direct3D的时候自己归纳的一个东西- -,也就是世界变换,取景变换,投影变换和视口变换的总称。
下面我们先来大致概括一下这四大变换的用途。
1. 为了能在世界空间中的指定位置来绘制图形,就需要在绘制图形前进行四大变换之一的世界变换运算。
2. 为了以不同的视角观察图形,就需要用到四大变换之二的取景变换运算。
3. 为了将相对较远的图形投影到同一个平面上并体现出“近大远小”的真实视觉效果,就需要用到四大变换之三的投影变换。
4. 为了控制显示图形的窗口的大小,比例以及深度等等信息,就要用到四大变换之四的视口变换。
下面我们就开始分别展开讲解这四大变换的细节知识。
在讲解之前,有必要先跟大家说明一下。
这里的四大变换的前三都是以矩阵作为载体的。
这四大变换相关知识中或多或少会涉及到矩阵、向量,平面和射线等相关的数学知识,这些数学知识浅墨不准备专门花篇幅讲,因为讲起来都是概念,漫无目的,而且篇幅很长或许会花费几次更新的时间,况且写出来的东西肯定没新意而且没劲,所以没有写出来的必要。
如果去学习Direct3D这款API的话,大可不必去纠结那么多数学概念。
对矩阵和向量稍微有些了解就足够了,余下的高中数学(高中数学中没有矩阵相关的知识,所以矩阵相关概念需要另外学习)完全可以对付。
如果实际过程中有不理解的地方再有的放矢地去查书和资料,这样学习起来会轻松很多,学习效率也会高得多。
关于这方面数学知识的查阅资料,可以参看Direct3D 9龙书《Direct3D 9.0 3D游戏开发编程基础》的第一部分,Frank Luna已经为我们讲解得非常到位了。
好了,下面就开始依次讲解吧。
Ⅰ.四大变换之一:世界变换根据物体模型的大小、方向以及其他模型之间的相对关系,世界变换将物体模型从自身的局部坐标系中转换到时间坐标系中,并将所有的物体模型组织为一个场景,如下图:就像这个世界上有很多不同的个体,我们每个个体都有自己独特的局部坐标系,而我们每个个体仅仅是这个世界中的一份子而已。
就像那句英文名言的前半句一样,to the world,you maybe one person。
世界变换包括平移、旋转和缩放变换,我们可以通过D3DX库中D3DXMatrixTranslation、D3DXMatrixRotation*和D3DXMatrixSaling函数来进行变换,并得到一个世界变换矩阵。
其中D3DXMatrixTranslation用于矩阵的平移操作,D3DXMatrixRotation*用于矩阵的旋转操作,D3DXMatrixSaling用于矩阵的缩放操作(稍后会分别介绍)。
这三种变换是矩阵的最常用的变换。
调用这些函数将我们矩阵调整好之后,接着我们就调用IDirect3DDevice9接口的SetTransform方法来运用世界变换矩阵,表示认定某某矩阵就是我们的世界变换矩阵了。
我们可以在DirectX SDK中查到SetTransform方法的原型如下:[cpp]view plainc opyprint?1.HRESULT SetTransform(2. [in] D3DTRANSFORMSTATETYPE State,3. [in] const D3DMATRIX *pMatrix4.);<span style="font-family:Microsoft YaHei;font-size:14px;"> </span>■第一个参数,D3DTRANSFORMSTATETYPE类型的State,明显的可以看到,它是一个D3DTRANSFORMSTATETYPE枚举类型,用于表示变换的类型,是四大变换前三者之中的哪一种。
可以取值为D3DTS_WORLD,表示世界矩阵,或者是D3DTRANSFORMSTATETYPE 枚举中的一种,这个D3DTRANSFORMSTATETYPE枚举类型定义如下:[cpp]view plainc opyprint?1.typedef enum D3DTRANSFORMSTATETYPE {2. D3DTS_VIEW = 2,3. D3DTS_PROJECTION = 3,4. D3DTS_TEXTURE0 = 16,5. D3DTS_TEXTURE1 = 17,6. D3DTS_TEXTURE2 = 18,7. D3DTS_TEXTURE3 = 19,8. D3DTS_TEXTURE4 = 20,9. D3DTS_TEXTURE5 = 21,10. D3DTS_TEXTURE6 = 22,11. D3DTS_TEXTURE7 = 23,12. D3DTS_FORCE_DWORD = 0x7fffffff13.} D3DTRANSFORMSTATETYPE, *LPD3DTRANSFORMSTATETYPE;其中D3DTS_VIEW表示取景变换,D3DTS_PROJECTION表示投影变换。
而D3DTS_TEXTURE0~7显然表示的就是某层纹理(0到7层)对应的变换矩阵了。
第二个参数,const D3DMATRIX类型的*pMatrix,是一个实实在在有内容的矩阵,显然就是我们想要设置为和第一个参数中指定的类型相挂钩的候选人矩阵了。
接着我们来分别介绍经常会用到的矩阵的一些基本变换方法:1.矩阵的平移首先介绍D3DXMatrixTranslation方法,D3D中的平移函数。
在Direct3D里,平移矩阵应是使用最多的矩阵。
这是因为每个物体的相对位置,都是通过平移矩阵来创造出来的。
物体的整体移动,说白了就是坐标点的移动。
比如从点(x,y,z)移动到新的位置(x', y', z')。
在Direct3D就为我们提供了D3DXMatrixTranslation方法用于矩阵的平移。
我们先来看一下这个函数的原型:[cpp]view plainc opyprint?1.D3DXMATRIX * D3DXMatrixTranslation(2. __inout D3DXMATRIX *pOut,3. __in FLOAT x,4. __in FLOAT y,5. __in FLOAT z6.);这个函数其实就是在创造一个有相对于原点(0,0,0)有偏移量的矩阵出来。