虚拟现实游戏开发之心得体会(原创)

 
                          虚拟现实游戏开发之心得体会(原创)
学习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/二、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代码的话,能够和我联系.
 写了这些东西,可能有不少的漏洞,可是无论怎样是本身的心得。但愿可以与有共同爱好的一块儿交流,一块儿进步。