您的位置:首页 > 其它

虚拟现实游戏开发之心得体会

2007-07-25 17:01 246 查看
学习Vc++,OpenGL,DirectX编程已经有一段时间了(两年左右),一直都在思考,希望总结一下,对自己的这方面来一个比较系统的总结。找到自己还存在的问题,从而更明确的进行下一步的学习。
自己一直是喜欢自己总结,但是不写下来,一来觉得没有什么可以写的,二来不知道如何去写,但是这样一来,却又觉得有太多的概念不是很清楚。
废话就不说了,先来看看OpenGL,DirectX的区别吧,以下是我在网上找的一些分析,感觉基本上把区别都包含了,于是就放在这儿,当个开头了:
一.Direct3D(D3D)

Direct 3D是基于微软的通用对象模式COM(Common Object Mode)的3D图形API。它是由微软(Microsoft)一手树立的3D API规范,微软公司拥有该库版权,它所有的语法定义包含在微软提供的程序开发组件的帮助文件、源代码中。Direct3D是微软公司DirectX SDK集成开发包中的重要部分,适合多媒体、娱乐、即时3D动画等广泛和实用的3D图形计算。自1996年发布以来,Direct3D以其良好的硬件兼容性和友好的编程方式很快得到了广泛的认可,现在几乎所有的具有3D图形加速的主流显示卡都对Direct3D提供良好的支持。但它也有缺陷,由于是以COM接口形式提供的,所以较为复杂,稳定性差,另外,目前只在Windows平台上可用。

作为微软DirectX技术的组件之一,Direct 3D也随着DirectX的升级而不断更新,同时在微软的全力扶植下,Direct 3D技术的发展速度极快,DirectX 7:正式支持硬件T&L(光影变换)、DirectX 8:对Pixel Shader(像素着色器)Vertex Shader(顶点着色器)的支持、DirectX 9:提供2.0版本的可编程顶点和像素着色模式,显卡硬件厂商也纷纷以对最新的D3D特效的硬件支持为卖点。遗憾的是,由于平台的局限性等原因,D3D应用至今仍主要集中于游戏和多媒体方面,专业高端绘图应用方面,老牌的3D API---OpenGL仍是主角。
当然,现在DirectX已经推出了9,10版本,功能又提升。

OpenGL
OpenGL的英文全称是“Open Graphics Library”即“开放的图形程序接口”,它是计算机工业标准应用程序接口,主要用于定义二维三维图形。
OpenGL是一套底层三维图形API,之所以称之为底层API,是因为它没有提供几何实体图元,不能直接用以描述场景。但通过一些转换程序,可以很方便的将AutoCAD、3DS等图形设计软件制作的DFX和3DS模型文件转换成OpenGL的顶点数据。

OpenGL是与硬件无关的软件接口,使用它图形软件生产厂商再不用为各种不同的机型开发设计不同的软件,只要操作系统使用了OpenGL适配器就可以达到相同的效果,它是一个开放图形库,目前在Windows、MacOS、OS/2、Unix/X-Windows等系统下均可使用,且仅在窗口相关部分(系统相关)略有差异,因此具有良好的可移植性,同时调用方法简洁明了,深受好评,应用广泛。OpenGL能在网络环境下以客户机/服务器模式工作,充分发挥集群运算的威力,是专业图形处理、科学计算等高端应用领域的标准图形库。

将OpenGL称之为SGI的OpenGL毫不为过,它源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。SGI在1992年7月发布1.0版,后成为工业标准,由成立于1992年的独立财团OpenGL Architecture Review Board (ARB)控制。SGI等ARB成员以投票方式产生标准,并制成规范文档(Specification)公布,各软硬件厂商据此开发自己系统上的实现。只有通过了ARB规范全部测试的实现才能称为OpenGL,现在的ARB投票成员包括SGI、Intel、IBM、nVIDIA、ATi、Microsoft、Apple等业界群英。
OpenGL现在已经有更新的版本
  
二.Vc++,这里要清楚一点:c++是一种编程语言(如C,JAVA,C#等等编程语言)
而VC++是一种编程工具,开发环境;VC,BCB等是将各种开发工具集中在一起,并提供一些方便用户的开发包的集成开发环境;
用于虚拟3D开发的语言很多,VC++就是其中比较流行的工具之一。
还有Vb,C#,Vs.net,等等;
现在来看看Vc++6.0与Vc.net的区别:
1. 单编程来说vc .net比vc6要容易多了,因为.net里的库很丰富,接触底层的机会就少了;
2. VC .Net是托管C ,托管C ,多了托管程序,VC 和VC .NET的语法上有些区别。.Net引入了一个机制,叫做SCL(standard component language),本意是要让支持此机制的任何语言都可以做出完全互相通用的组件,即可以通用地使用它们。也就是说这些语言的唯一差别就只是语法上的不同而已了—如VB使用的系统类,C#、VC也可以同样方便地使用;
3. .Net中的C#和VB是自动支持SCL的,你无法改变它。VC是默认支持,但你可以改变,.net中也只有VC可以采用不支持SCL的方式编程。
4. 在.Net这个框架下我们可以开发出基于web或应用程序的跨语言代码,例如我们以前在VC 下用的是mfc,vb,J++,他们之间没有通用的标准,现在情况不一样了,这些分歧在.net的框架生下统一了。
5. VC++.NET里面的C++编译器比VC++6时候的好得多,更加符合标准,而且VC++.Net里面带的C++的标准库也是重写过的,与标准更加接近
6. VC6.0=C++&MFC;而.NET是一个系统平台,它提供了公共语言架构(CLI)和.NET Framework,C++.NET是C++基于.NET类库的C++,它做出来的程序或者dll,可以被C#.NET,VB.NET等等支持.NET的语言互相调用;
7. C++.net支持.net开发,此时跟C#等没有什么区别,不过C++.net支持MFC7.0, VC为MFC6.0,比VC的MFC版本更高 (这些区别我也不是很清楚,是收集略加整理一下的。
补充一点:事实上现在做虚拟现实模拟,游戏开发不会用到VC++中的MFC库支持,因为开发的虚拟系统完全用不到MFC提供的功能作用模块。
而且,MFC的加入会带来冗余的代码。

完成了这几个方面的大概介绍,也比较清楚了这些工具,语言的特点与关系。
现在就来总结一下自己的学习历程:
因为有些东西还需要好好整理一下,因此,在这里谈到的一些东西,可能是语言描述一下:
三.按道理来说,学习OpenGL,D3D编程,应该只用Win32 API就足够了,但是学习的时候,发现用Vc++(MFC)写软件程序还有很大的前景,加上觉得.Net的应用还不是很广泛,就决定用MFC库编写OpenGL,D3d程序,一方面可以借此学习VC++(本质上是MFC库的学习),以及同步学习Win32 API;
使用MFC编写OpenGL,D3d程序的参考资料相比用Win32API编写程序来说要少的多,因为很多的开发者都用不到MFC提供的功能,以及上述的问题,但是还是有这方面的参考资料的,以下是我知道的几本参考资料:(基于MFC对话框,单文档,多文档建立OpenGL绘图环境):
1.《OpenGL高级编程与可视化系统开发——高级开发篇》,《OpenGL高级编程与可视化系统开发——系统开发篇》;
2.《VC++游戏开发技术与实例》;
OpenGL绘制环境除了在MFC对话框,单文档,多文档三种情况下建立,还能在Win32 Console Application (控制台应用程序环境下建立), Win32 Application(应用程序下)建立,现在为止,单单在Win32 Application下建立OpenGL渲染环境就有三种常见的设置模式。
当然全部掌握是不需要的,只要掌握最常用的环境下设置就行了。
在MFC库基础上建立渲染环境,本质上就是改变显示窗口渲染模式。

四.完成了OpenGL的渲染环境的选择和设置,那就开始编程吧,盲目的编几行代码显然没有多大的意思,想象自己能去做一个什么样的效果吧。
自己当时看过很多的演示效果,于是第一个想法是实现一个很大的场景,可以在里面遨游,当时对场景中的碰撞检测,移动控制,等等,但是思路很不清楚,后来在学习的过程中发现很多的当时错误的想法,比如场景的分割意识相当模糊,感到真的没有什么思路。拾取的作用更不要提了。
这里大概谈一下游戏的常见的算法:
事实上在很多的游戏书里都有完整的列出,但是有很多的算法只是给出理论上的分析,真正到设计虚拟系统,游戏的时候就要创新了,因为具体的应用导致具体的需求,可能需要的是完全不同的结构算法,这就看项目中的具体的要求了。
我感觉,做编程,对算法的理解一定要过硬,能设计算法,特别是虚拟,游戏设计方面。
掌握通常的函数库使用是基础,要能够根据系统需要设计出满足要求的算法。
比如Octree,bsp等空间的分切算法,当然现在的很多的引擎已经很好的完成了这个要求,需要做的只是用场景编辑软件编辑好需要的场景信息,在场景导入到程序中后,根据引擎的分割算法,检测规则,摄象机移动旋转设置来运行。
自己曾写过一个OpenGL版本的Octree分割算法,是仿照dxsdk里一个D3d中Octree版本写的,感觉只是将空间切割了,便于管理了,但是与真正的应用检测还是有一定的距离的。
一般要做游戏开发,要多注意通用性的设计,往往场景要设计一个编辑操作软件,(这个软件可以用各种语言编写),然后将其转换后,变成适合引擎的资源包等形式在程序打开运行时导入并显示。
D3d与OpenGL的编程中,都有很多的地方相似,不是说语言,而是思想,当然在程序运行本质上是不一样的。
D3d同样可以在Vc++(基于MFC对话框,单文档,多文档建立D3d绘图环境):
与OpenGL和MFC的关系一样,D3d同样不需要MFC库提供的功能模块,因此也是主要在Win32 Application(应用程序)下编写应用程序。

五.对于OpengL还是D3d,现在都有很成熟的封装SDK,可以直接调用现成的SDK函数就可以实现功能,当然前提是包含该SDK的支持。
对D3d,有dxsdk支持,msdn上也有说明和帮助;
对OpengL,现在有如下一些SDK:vega
Vega实际上是基于场景图(Scene Graph)之上的,而场景图管理系统本身又建立在OpenGL这样的标准图形库之上。在SGI平台上,Vega所依附的场景图管理系统就是Performer,而在Windows平台上,Vega所依附的是一套被称为“Jolt”的场景图管理系统(Jolt实际上就是PC上的Performer实现)。

曾经研究一些引擎,比如quake3,半条命,等等,
如果有朋友需要Octree或q3代码的话,可以和我联系啊(firedragon7031@126.com
QQ:420579621
写了这些东西,可能有很多的漏洞,但是不管怎样是自己的心得。希望能够与有共同爱好的一起交流,一起进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: