我学习Vc++、OpenGL、DirectX编程已经有一段时间了(大概两年了),也一直在思考。 我希望能够总结一下,对自己这方面进行一个比较系统的总结。 找出你还存在哪些问题,以便你更清楚地了解下一步。
我总喜欢自己总结,但如果不写下来,一来觉得没什么可写的,二来不知道怎么写。 不过这样一来,我感觉有太多概念不是很清晰。
话不多说虚拟现实游戏开发,让我们来看看OpenGL和DirectX之间的区别。 以下是我在网上找到的一些分析。 我觉得它们基本上涵盖了所有差异,所以我将它们放在这里作为开始:
一。 直接3D (D3D)
Direct 3D是一种基于微软通用对象模式COM(Common Object Mode)的3D图形API。 它是微软制定的3D API规范。 Microsoft 拥有该库的版权。 它的所有语法定义都包含在微软提供的程序开发组件的帮助文件和源代码中。 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架构审查委员会(ARB)控制。SGI等ARB成员通过投票产生标准,并将其制成规范文件(规范)以供出版。 每个软件和硬件制造商都相应地在自己的系统上开发实现。 只有通过了ARB规范的所有测试的实现才能称为OpenGL。 目前ARB投票成员包括SGI、英特尔、IBM、nVIDIA、ATi、微软、苹果等行业精英。
OpenGL 现在有更新版本
二。 vc++,这里先明确一下:c++是一种编程语言(比如C、JAVA、C#等编程语言)
VC++是一种编程工具和开发环境; VC、BCB等是集成开发环境,汇集了各种开发工具,并提供了一些方便用户使用的开发包;
用于虚拟3D开发的语言有很多种,VC++是比较流行的工具之一。
还有Vb、C#等;
现在我们来看看Vc++6.0和Vc++6.0的区别:
1、单就编程而言,vc .net比vc6容易很多,因为.net中的库非常丰富,接触底层的机会较少;
2、VC .Net是托管C,托管C,加上托管程序,VC和VC .NET在语法上有一些区别。 .Net引入了一种称为SCL(标准组件语言)的机制。 初衷是任何支持这种机制的语言都可以做出完全可互操作的组件,即可以通用。 换句话说,这些语言之间唯一的区别就是语法的区别——比如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中的C++编译器好很多,并且更符合标准。 而且,VC++.Net中包含的C++标准库也进行了重写,更加接近标准。
6、VC6.0=C++&MFC; .NET是一个系统平台,提供了公共语言框架(CLI)和.NET Framework。 C++.NET 是基于.NET 类库的C++。 它制作的程序要么是dll,可以被C#.NET、VB.NET等支持.NET的语言调用;
7、C++.net支持.net开发,此时与C#没有什么区别。 不过C++.net支持MFC7.0,而VC是MFC6.0,是MFC比VC高的版本(这些区别我不是很清楚,只是收集了一下,稍微整理了一下。
补充一点:其实现在对于虚拟现实模拟来说,游戏开发都不会使用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++游戏开发技术与实例》;
除了在MFC对话框、单文档、多文档中创建OpenGL绘图环境外,还可以在Win32 Console Application(控制台应用程序环境下)和Win32 Application(应用程序下)中创建。 到目前为止,只有在Win32应用程序下建立OpenGL渲染环境的常用设置模式有3种。
当然,没必要全部掌握,只要掌握最常用的环境设置即可。
基于MFC库建立渲染环境本质上改变了显示窗口的渲染方式。
四。 完成OpenGL渲染环境的选择和设置后,我们就开始编程了。 盲目地写几行代码显然没有多大意义。 想象一下你能创造出什么样的效果。
当时我看过很多演示效果,所以我的第一个想法是实现一个可以在其中漫游的大场景。当时我关心的是场景中的碰撞检测、运动控制等,但是这个想法非常不清楚。 后来,在学习的过程中,我发现了当时很多错误的想法。 比如场景的分割就很不清楚,我感觉自己真的没有想法。 更不用说接机的作用了。
这里简单说一下游戏的常用算法:
其实很多游戏书籍里都有完整的列表,但很多算法只提供理论分析。 在设计虚拟系统和游戏时,需要创新,因为特定的应用会产生特定的需求。 ,这可能需要完全不同的结构算法,具体取决于项目的具体要求。
我觉得做编程,必须对算法有很强的理解,能够设计算法,尤其是虚拟和游戏设计。
掌握常用函数库的使用是基础,要能根据系统需求设计出符合要求的算法。
例如八叉树、BSP等空间分割算法。 当然,现在很多发动机已经很好的满足了这个要求。 您只需使用场景编辑软件编辑所需的场景信息即可。 场景导入到程序后,根据引擎的分割算法、检测规则、相机移动和旋转设置来运行。
我曾经写过一个OpenGL版本的八叉树分割算法,它是仿照dxsdk中D3d中的八叉树版本建模的。 我感觉只是削减了空间,更方便管理,但离真正的应用检测还有一定的距离。
一般来说,在做游戏开发的时候,需要更加注重通用性设计。 很多时候,你需要为场景设计一个编辑操作软件(这个软件可以用各种语言编写),然后将其转换成适合引擎的资源包。 当程序打开并运行时,它被导入并显示。
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、half-life等。
如果有人需要八叉树或q3代码,可以联系我。
我写的可能有很多漏洞,但无论如何都是我自己的经历。 希望与有共同兴趣的人交流,共同进步。
文章来源:https://blog.csdn.net/firedragon7031/article/details/1607257?locationNum=11&fps=1