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

news/2024/7/4 8:55:35

学习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
 写了这些东西,可能有很多的漏洞,但是不管怎样是自己的心得。希望能够与有共同爱好的一起交流,一起进步。
 

http://www.niftyadmin.cn/n/1997382.html

相关文章

linux安装php的问题,linux命令怎么安装php

linux命令安装php的方法:首先从php的官方网站下载php的安装源码包;然后执行命令“./configure --prefix/usr/local/servers/php”配置安装环境;接着在解压目录执行编译命令;最后执行安装命令。linux系统安装php【下载php源码】&am…

mysql存储过程和函数的使用_mysql中存储过程和存储函数是什么?

在mysql中,存储过程和存储函数都是数据库中定义的一些SQL语句的集合。其中,存储函数可以通过return语句返回函数值,主要用于计算并返回一个值;而存储过程没有直接返回值,主要用于执行操作。(推荐教程:mysql…

技校可以学php吗,上技校学技术,该选什么专业好就业?

俗话说:“男怕入错行,女怕嫁错郎”,正因为如此,这句话也从另一方面激励着每一个有志青年为了自己的人生更加精彩而不懈奋斗。越来越多的青年选择上技校学技术,那么,上技校如何选专业呢?做到“入…

MFC应用程序中指针的获取(1)

MFC应用程序中指针的使用 1) 在View中获得Doc指针 2) 在App中获得MainFrame指针 3) 在View中获得MainFrame指针 4) 获得View(已建立)指针 5) 获得当前文档指针 6) 获得状态栏与工具栏指…

python中的start_在scrapy框架python的start_urls列表中为url构造...

我对Scrapy非常陌生,而且之前我没有使用过正则表达式以下是我的spider.py代码class ExampleSpider(BaseSpider):name "test_codeallowed_domains ["www.example.com"]start_urls ["http://www.example.com/bookstore/new/1?filterbookstore",&quo…

matlab画出积分波形,matlab课程设计参考题目

课题一:连续时间信号和系统时域分析及MATLAB实现课题要求:深入研究连续时间信号和系统时域分析的理论知识。利用MATLAB虽大的图形处理功能、符号运算功能以及数值计算功能,实现连续时间信号和系统时域分析的仿真波形。课题内容:一…

全程干货!中国商标注册全流程,注册中国商标操作指南

只有注册了商标的商品,能够进入商场、超市、电商平台销售。商标利于消费者记忆,防止被仿造。注册商标受法律保护,享有专用权,其他任何人均不能再相同或近似商品上使用。中国商标是企业的无形财产,可授权、转卖、加入资…

在MFC类中各种类的指针的获取和应用 (2)

关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特    别是对于英语较差的人,我查看了一些blog,总结了一下!希望对和我一样的人有点帮助!    1:  因为对于SDI程序,主框架窗口就是文档框窗(如果这个也不…