3d游戏编程(转帖)

白修谨
2023-12-01
3d游戏编程(转帖) 我先声明,我不是编程高手,我还只是个初学者,但我觉得我所知道的对刚入门3D游戏编程的新手,应该能让他们少走弯路,我也很想用朝语来写,但是朝语的词 汇库很久没有更新过了,有些专业的单词很难用朝语来表达,也可以用韩语来说,但其实韩语也只是把英语的发音用朝语写的,和直接看英语没什么区别,真希望有 天能看到真正意义上的用朝语翻译的专业单词。 
  注释:我在下面所说当中DIRECTX的标准名称是 DirectX SDK ,玩游戏的时候需要安装的DirectX 9.0和编程所需要的DirectX SDK 9.0是不一样的,DirectX SDK 9.0是专门为编程人员提供的软件开发包。 
  我不知道从什么开始说好,那就先说说目标吧。。。 
  目标当然是3D游戏编程,不是2D游戏,而是3D游戏,不是游戏的美工或者游戏的音响或者游戏的策划,而是编写游戏引擎的工作(我知道我这是不必 要的说明,但有些人在学习过程中就学这个学那个的,他是什么都想学,我是希望不让这样的人迷失方向。),游戏的最终形态是把游戏和网络结合在一起的网络游 戏,3D 网络游戏的编程工作分2个部分,一个是客户端代码,一个是服务器端代码,所谓客户端代码,就是直接和玩家接触的游戏,这里包含了渲染,控制,网 络,音响,物理引擎,AI(人工智能)等等,所谓服务器端就是在游戏运行公司里的服务器所运行的程序,包含了数据库,游戏管理,网络等等,一般游戏开发公 司把这2部分的工作分开来做(国外的公司应该是同一个小组来做,但中国好象是分开的,可能是因为很难找到一个能做所有编程的人才吧。),我们要做的就是客 户端代码的编写,其实客户端的代码很类似于一个单机板的3D游戏的编程,也就是说,我们的目标是编写一个3D游戏引擎,所谓游戏引擎,就是为了简化游戏的 开发和提高游戏开发的速度,而封装了很多基本的底层工作的一个平台,只要有个这样实现所有基本功能的平台,那么开发一个游戏只需做一个美工或者关卡设计就 可以了,3D游戏引擎又包括渲染引擎,用户控制,声音,物理引擎,AI和网络等等,而其中最重要的也是最难的是渲染引擎,所谓渲染就是把想要显示的东西显 示在显示器上的过程,说到这里,我们的目标也就是编写一个3D渲染引擎。 
  目标已经明确了,那该怎么学呢?有3条路可以选,一个是去游戏学院学习,一个是自学,一个是进游戏公司,游戏学院虽然它广告做的好,但实际上它的 毕业设计也就是个2D的游戏,也就是说游戏学院毕业了程度也就是能编写2D游戏的水平,而且学费也很贵(一般都是10个月或者1年制,学费是2万左右), 进游戏公司的前提是你有一定的编程经验(我不是说游戏编程经验,很多从事多年软件开发的编程人员改行做游戏开发的),游戏公司是宁可要毕业游戏学院的人, 也不愿要本科毕业的人,原因是本科毕业生连基本的游戏编程的思路都没有,当然,游戏学院毕业的人也需要公司培养才能容入到开发小组一起开发, 
  呵呵,显然最好的学习方法就是自学(其实我也不愿意自学,太孤独了),想要有真本事,始终还是得靠自己!!! 
  目标已经有了,路也已经知道了,那该怎么走呢???你知道吗?!在没有人给你指点的情况下,也不知道该往哪里走,也不知道该怎么做,仿佛你是站在 一个伸手都见不到五指的黑夜,感到迷茫,感到失望,但又股起勇气继续寻找,以下我给你的指点,都是我用这样的方式摸索出来的,有时候一个问题都需要1~2 个月才能得到解决。 
  我们所要开发的游戏是基于WINDOWS操作系统上的,因为目前全世界微机几乎都用WINDOWS,所以我们要开发游戏是在WINDOWS操作 系统上运行的游戏,接下来选择一个编程语言,目前有很多编程语言,但他们都有各自的优势,而最适合游戏编程的程序语言就是C++,原因只有一个,因为能直 接控制硬件,接着我们得选择一个开发环境,我们选择VISUAL STUDIO 。NET 2003(VS。NET不是语言,只是个IDE(集成开发环境),C++才是语言。),然后得选择一个API(Application Programming Interface 应用程序接口),目前有OPENGL和DIRECTX,因为DIRECTX是微软提供的API,所以我们选择DIRECTX。 
  基本上都选好了工具,我想说一下掌握这些工具的程度,C++语言没有必要精通,你要做的不就是游戏开发吗?!那就只需要知道游戏开发所需要的就 可以了,VS。NET 我喜欢用2003,不喜欢2005的原因是,它把更多的细节封装了,更容易编程了,但有时候简单并不是好事,尤其是在学习过程中,你很容易不明白是怎么运 行的,你只会学会怎么用它,离开了你所依赖的,你就什么都不会了,不选择C#的原因也和这个类似,微软宣传C#的时候是说提高开发速度,减轻开发难度,其 实它就想强JAVA的市场而已,我们没有必要跟着大公司的风浪走,他们做他们斗争,我们走我们的路,VS。NET当中,你只需要知道如何生成一个 WIN32的程序就可以,其他的MFC,STL,ATL只类的不需要知道,我不是说那些没有用,而是在游戏编程中不需要,因为那些会降低游戏运行的速度, 3D游戏的开发基本上都 依赖于DIRECTX SDK,我在上面说过类似不应该依赖封装细节的开发包,其实DIRECTX SDK也是一个封装细节的开发包,但目前我们个人的能力还不够或者是没有必要摆脱这个开发包,因为DIRECTX SDK是微软许多软件工程师们好几年的心血结晶,如果我们想控制显卡或者是想用显卡的某个硬件功能的话,我们必须接触其显卡的驱动程序,了解此显卡的驱动 才能编程,这是非常大的工作量,而且不同的显卡有不同驱动程序,也就是说你想让在所有的显卡上运行你的游戏,你就得了解所有显卡厂家的驱动程序,几乎不可 能做到,微软的DIRECTX SDK给程序人员提供了一个平台,他与所有显卡厂家达成了一种协议,厂商提供驱动程序,这些驱动程序遵守一些规则,微软的工程师们基于通用的驱动程序上把 一些控制硬件的烦琐的工作封装成函数,就是我们说的DIRECTX SDK,呵呵,我感觉我说的太夸张了,在我用DIRECTX SDK中感觉其实它的数据结构也很不错,而且我在书上看到的,其实DIRECTX SDK所使用的硬件功能都能用软件来实现,只是速度非常慢而已,如果有人想学更深的话,可以尝试完全不依赖硬件功能,全部用软件来实现的3D渲染。 
  自学也有很多种,看书,或者看一些开放原代码的渲染引擎(OGRE,Nebula2等等。。。),说到书,我不得不说一些了,现在市面上能买到 的游戏编程书籍我都有,这句话其实没加任何水分,因为刚开始入门的时候一冲动就买好几本,你也知道计算机的书都特别贵的,回来一看很多内容都是 WINDOWS API(是WINDOWS 自带的API,和DIRECTX 不一样,因为WINDOWS API的速度慢,所以基本上不能用WINDOWS API来编写3D的游戏,只能写一些简单的游戏。),目前国内的游戏书籍很杂乱,想找好书不容易呀,我也不希望别人浪费金钱,以下是本人觉得值得买的书和 一些简单说明(说明都是个人的看法,仅参考供)。 
  “3D游戏编程大师技巧” 
  人民邮电出版社 
  Andre laMothe 著 
  李祥瑞 陈武译 
  内容提要:本书是游戏编程畅销书作者Andre laMothe 的打鼎之作,从游戏编程和软件引擎的角度深入探讨了3D图形学的各个重要主题。全书共分5部分,包括16章的内容。第1~3章简要的介绍了WINDOWS 和DIRECTX编程,创建了一个WINDOWS应用程序模板,让读者能够将经理放在游戏逻辑和图形实现中,而不用考虑WINDOWS和DIRECTX方 面的琐事;第4~5章简要的介绍了一些数学知识并实现了严格数学库,供以后编写演示程序时使用;第6章概述了3D图形学,让读者对本书将介绍的内容有大致 的了解;第7~11章分别介绍了光照,明暗处理,仿射纹理映射,3D裁剪和深度缓存等内容;第12~14章讨论了高级3D渲染技术,包括透视修正纹理映 射,Alpha混合,1/z缓存,纹理滤波,空间划分和可见性算法,阴影,光照映射等等;第15~16章讨论了动画,运动碰撞检测和优化技术。本书适合与 一定编程经验并想从事游戏编程工作或对3D图形学感性趣的人员阅读。 
  个人感想:本人还没有具备读懂本书的能力,但给我的印象就像刚才上面说的那样,不依赖与硬件功能而所有的硬件功能都用软件来实现的话,这位作者就是这么做的。。。我觉得这本书是一个很好的3D游戏的技术理论书。但遗憾的是它没有写任何关于DIRECTX的内容。 
  “2D游戏编程大师技巧” 
  中国电力出版社 
  Andre laMothe 著 
  沙鹰译 
  内容简要:你将学到什么 
  我决心要往你的大脑里面塞入如此之多的信息以至于可能会有些信息溢出来,本书覆盖了全部必要的元素,来创建于WINDOWS 9X/NT/XP/200平台的PC游戏:Win32编程,DirectX基础知识,2D图形和算法游戏编程技术和数据结构,多线程编程,人工智能,物理 建模,使用3D加速硬件设备,除了这些,还有更多其他的内容。。。。。 
  个人感想:这也是Andre laMothe 写的一本非常好的书,但有人评价说翻译的不够好,作者是在写“3D游戏编程大师技巧”之前写的,大约在2002年左右第一次出版的,本书的内容基本上围绕 着2D进行讲解的,本书讲的是DIRECTX 8.0版本,详细的讲了DIRECTX的各个部分和算法,数据结构,内存管理,人工智能等等,可惜的是DIRECTX 8.0版本的DIRECTDRAW是2D渲染的,目前的DIRECT 9.0 已经把DIRECTDRAW 和DIRECT3D合成为DIRECT GRAPHICS(又有人说其实是把DIRECTDRAW 部分去掉了,)如果想学2D的游戏编程,我觉得这本书是非常好的教材,但它一点都没有提到关于3D游戏编程的内容。 
  现在市面上的关于DIRECTX编程的书只有3本, 
  “Direct3D 游戏编程入门教程(第二版)” 
  [德] Wolfgang F. Engel 著 
  周惟迪 徐翎 张璐意译 
  人民邮电出版社 
  内容提要: 
  本书是基于DIRECTX 9.0编写的,是介绍DIRECT3D技术的入门教程。它详细介绍了DIRECT3D的背景,基本知识以及3D程序设计的相关概念与技术。全书由浅入深, 分为四个部分,第一部分介绍DIRECT3D的开发历史和基本知识,对3D程序设计中的术语,概念进行了深入讲解;第二部分着重讨论纹理映射技术,包括多 重等等;第三部分通过多个示例来探讨高级shader编程,并对,MD3文件格式做了详细分析;第四部分是附录,对本书中用到的概念和技术背景进行了简单 补充。 
  本书适用于略有DIRECTX基础的C/C++程序员学习DIRECT3D游戏开发,也适用于具有DIRECT3D开发经验的程序员参考。 
  个人感想:其实这本书是最早出来的关于DIRECTX SDK 9.0 版本的书,是2005年一月出版的,也是我接触的第一本关于DIRECTX编程的书,但我感觉它某些地方说明的不够详细,而且他基本上用的例子都是 DIRECTX SDK 自带的例子(SDK自带的例子都提供了原代码)。 
  “Direct3D游戏开发技术详解” 
  尚晶晶 编著 
  人民邮电出版社 
  内容简介: 
  本书分为两部分,第一部分是基础部分,全面系统地讲述了DIRECT3D游戏编程所需要的基础知识,并补仪以针对性的训练和实例。第二部分是进阶 部分,全面讲述了现代3D游戏中非常经典的技术和一些国外最新技术,包括地形渲染所涉及的关键技术和方法,主流3D动画技术,各种3D游戏实现的特效技 术,以及较新的基于可编程渲染管线的GPU Shader技术。 
  本人想法:这本书是2006年2月份出版的,从中也提到了不少新技术。 
  “3D游戏编程” 
  (韩)金容俊 编著 
  马晓阳 刘娟译 
  飞思科技产品研发中心 监制 
  电子工业出版社 
  内容简介: 
  本书比较全面地介绍了3D游戏开发的知识和技能,包括3D编程的基础知识,编程技术,并以实例的形式展现了相关的地形处理,卡通形象处理和其他高 级形象设计等应用技术。在讲解编程技术的同时,还介绍了一些相关的数学,物理知识,本书针对专业游戏开发者,着重培养初级水平开发者的实际操作能力,达到 初级冲向高级阶段的效果。作者是多年从事游戏程序教育的大学教师,将多年教学及实际开发经验总结写成本书,此外,本书在韩国国内已经作为专业游戏学习机构 的教材使用。 
  本人感想:这本书其实在韩国早在2004年就已经出版了,但在中国是在2006年四月份出版的,正如简介所说的那样,看本书就能感觉学的非常舒服,能感觉到作者的教育经验。 
  “ 网络游戏开发” 
  Jessica Mulligan Bridgette Patrovsky 著 
  姚晓光 王鑫 恽爽 
  机械工业出版社 
  内容简介: 
  本书出自两位世界级资深 网络游戏专家之手,全面介绍了如何构架,发行和维护 网络游戏,专业面又详尽地讲述了 网络游戏制作,发行及运营中的一些实际细节。书中汇聚了 网络游戏开发历程中的经验与教训。 
  对于从事 网络游戏开发的业内人士,特别是管理人员,本书是不可多得的佳作。本书同样适合于对 网络游戏开发有兴趣的玩家和读者。 
  本人感想:即使你是一个具有相当实力的游戏编程人员,你也未必是商业化的专业人员,本书的内容中没有一点关于技术的,全都是游戏开发小组或者游戏运营商的多年经验以及游戏从开始开发到真正运营的过程,这本书在美国是2003年出版的,在中国是2004年出版的。 
  “游戏编程精粹1”~“游戏编程精粹4” 
  Mark DeLoura 编 
  王淑礼 张磊译 
  姚勇 审校 
  人民邮电出版社 
  内容提要: 
  本书是由40多位国外游戏开发行业最为优秀的程序员撰稿的技术文集。每篇文章都针对游戏编程中的某个特定的问题,不仅提供了解决思路,还给出了能 立即应用到代码中的算法和原代码。全书分为通用编程技术,数学技巧,人工智能,多边形技术和像素特效五章;附录部分提供了两个非常有用的工具库,矩阵工具 库和文本工具库;随书附带的光盘中包含有全书所有的原程序,演示程序,附录中的两个工具库以及glSetup和GLUT等开发工具。  本书适合游戏开发专业人员阅读。专家级开发人员可以立刻应用书中介绍的技巧,而初中级程序员通过阅读本书将增强其技能和知识。本书是游戏程序员必备的参考资料。 
  个人感想:呵呵,天书四本。希望能有天能读懂那些。。。这本书(游戏编程精粹1)在美国是2000年出版的,在中国是2004年出版的。每本书的出版日期好象都不一样。 
  呵呵,这些书够你看一阵子了吧?!!?“3D游戏编程大师技巧”和“2D游戏编程大师技巧”这两本书没有 必要现在就看,毕竟我们想学的是DIRECTX的编程,我推荐大家直接看“3D游戏编程”,初学者也很容易上手,你只要按书上的去做就可以了。 
  接下来讲一些关于实际编程,说实在的本人的编程经验少的可怜,还希望大家多多谅解。自学当中分2个过程一个是看书过程一个是实际编程过程,很多人 说看了很多关于游戏编程的书,但是真正让他编写代码就感觉什么都不会了,这是因为看书只是编程的前提和基础,并不代表看了书就会编程了,实际编程完完全全 是一个字母一行代码地在计算机上编写代码所积累的经验,没有别的捷径!!! 
  在说实际编程之前,还得先说一下环境设置,你需要安装VISUAL STUDIO 。NET 2003 ,包括MSDN(倒板的7张碟的。。。),需要注意的是应该先安装VS。NET,然后再安装DIRECTX 9.0 SDK(如果顺序反了,就有可能出错。),假设你已经安装了VS。NET 2003,在说DIRECT SDK 之前还得说明一个东西,就是 COMMON框架,这是一个微软提供的框架,它把本来非常复杂游戏代码分了结构,让我们这些初学者不再感觉到无从下手,而且,微软的DIRECTX SDK为了介绍其SDK拥有的功能,DIRECTX SDK 提供了SAMPLE,把所有的效果或者功能用实例来给用户介绍的,当然提供了原代码,显然微软的意思是让程序员阅读这些实例来学习他们的新技术,这些实例 所用的都是 COMMON框架,所以我觉得我们有必要学习这个框架。 
  假设你已经安装了VS。NET 2003,你现在就需要安装DIRECTX SDK,但是!!!选择DIRECTX SDK的时候一定要注意版本,一定要安装DirectX9 SDK Update Summer 2003这个版本,因为我们用这个COMMON框架是用一个向导来使用的,但是除了这个版本,其他的版本都省略了这个向导(Directx9 Visual C++ Wizard),如果安装了DirectX9 SDK Update Summer 2003这个版本,在新建对话框的VISUAL C++里头能找到 Directx9 Visual C++ Wizard。 
  接着就是设置路径,在VS。NET 2003 界面当中,工具/选项当中,左边目录中选择项目/VC++目录, 
  右边就出现“平台”下拉采单和“显示以下内容的目录”的下拉采单,在“显示以下内容的目录”的下拉采单中选择“包含文件”,指定INCLUDE 路径(用路径选择框在DIRECTX安装文件夹里查找),点击“新行”,就出现路径选择对话框,列表当中添加了C:DXSDKInclude(假设安 装在C:DXSDK里)就是成功的,用同样的方式指定C:DXSDKSamplesC++CommonInclude.第一个路径是 DIRECTX开发库头文件;第二个是DIRECTX通用框架头文件;用同样的方法在“显示以下内容的目录”中的“源文件”中,添加C:DXSDK SamplesC++Common(或者是C:DXSDKSamplesC++CommonSrc,看.CPP文件在哪里就指哪里。),这 个路径是通用框架的.cpp文件的路径,“显示以下内容的目录”中的“库文件”中,添加C:DXSDKLib,这个路径是DIRECTX的链接库的路 径。 
  呵呵,,,现在可以开始DIRECTX编程了。。。 
  在编程的时候遇到的第一个问题就是,"vertices.obj : error LNK2019: 无法解析的外部符号 Direct3DCreate9@4 ,该符号在函数 "long __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAJPAUHWND__@@@Z) 中被引用Debug/vertices.exe : fatal error LNK1120: 1 个无法解析的外部命令", 
  这样的错误提示,在DIRECTX 中最重要的也是最基本的设备创建的函数,怎么可能是无法解析的函数呢?!?!但是光盘里的原代码和我的代码基本相同,就是能编译,然后我就一吨找毛病,结 果发现差别在与连接器中的输入中的依赖项有关,在VS.NET中的项目/属性/配置属性/连接器/输入/附加依赖项中添加以下文件名,d3dx9.lib d3dxof.lib d3d9.lib winmm.lib dxguid.lib comctl32.lib 就可以了. 
  这个问题还有另外一种解决方法,就是在程序的开头写 
  #pragma comment(lib,"d3d9.lib") 
  #pragma comment(lib,"winmm.lib") 
  #pragma comment(lib,"d3dx9.lib") 
  这几行就可以了....其实它俩的功能我觉得都差不多.#pragma comment是VC的编译预处理指令. 
  好了,我已经把我所知道的所有东西全都告诉你了,很遗憾我只能给你说这么多,因为我自己也不是一个高手。在今后的编程中所遇到的问题和解决方法我会接着写。。。 
  特别是最后的错误我也是一阵的好找,终于解决了,转帖一下让刚学的人少走弯路,也作为自己的一点积累吧 很抱歉,因为您在网易相册发布了违规信息,账号被屏蔽。被屏蔽期间他人无法访问您的相册。
  去帮助中心,了解如何重新恢复服务。
 类似资料: