我应该使用哪个3D图形框架来开发一个真实世界的游戏引擎?

15

我是一名C++程序员,拥有非常丰富的服务器编程经验。但目前我感到相当无聊,决定尝试一个新领域:3D游戏编程,以便学习。此外,我认为这个学习项目在未来可能会成为很好的简历素材,如果我决定在这个领域工作。

我决定模仿一款现有的3D引擎,而不是从头开始创建一个3D引擎:《魔兽世界》的引擎。如果你想知道为什么(可以跳过这部分):

  • 它是一款真正成功的游戏
  • 所有地图纹理、模型等都已经完成(我不想学习如何使用photoshop或其他软件绘制纹理)
  • 他们的文件格式已经被彻底逆向工程了
  • 已经有一个完全相同的开源项目(wowmapview),如果我遇到问题,我可以参考它。

好的,那是一个很长的前言…现在,我的主要问题是: 我应该使用DirectX、OpenGL、类似sdl的包装库还是其他什么?

在真实世界中最常用的是哪一个?

还有一些令我困惑的问题:《魔兽世界》似乎同时使用两者!事实上,通常它使用DirectX,但你可以通过命令行启动使用OpenGL。

这在游戏中是很常见的吗?他们为什么要这样做?我想这需要很多工作,而且从我的理解来看,几乎没有人使用OpenGL(非常非常少的人知道有这个开关)。

如果这是通常做的事情,那么程序员通常会创建他们自己的3D引擎“包装器”,类似于SDL内部设计,并基于开关/#define等决定最终调用哪个API函数(DirectX或OpenGL)吗?还是这个功能已经内置在SDL中(您可以随意切换DirectX和OpenGL)?

最后,你有什么书推荐吗?

谢谢!


6
他们为什么这样做?是因为Mac OS X不支持DirectX吗? - Georg Fritzsche
3
SDL仅是一个平台抽象层,它既不替代OpenGL也不替代DirectX。然而,当使用SDL时,它通常与OpenGL一起使用,因为两者都是跨平台库。值得注意的是,SDL不提供小部件工具包,因此如果这是一个需求(在全屏3D游戏中不太常见),则像Qt这样的跨平台应用程序可能是更好的选择。 - codelogic
1
@gf:好观点。让我想知道为什么他们不支持Linux本地化,因为他们费尽心思使OpenGL适用于Mac..应该只需要相对简单的更改。哦,好吧,我猜我永远不会知道了。 - Andreas Bonini
暴雪公司在某个时候内部曾经开发了一个不受支持的 Linux 版本,但是从未发布过。我相信他们也在使用 SDL,因为 WoW 的首席界面程序员 Slouken 也是 SDL 的作者... - Kieron
也可以看看这个链接 http://gamedev.stackexchange.com/questions/90/why-is-it-so-hard-to-develop-a-mmo 这是我最喜欢的帖子,当我觉得无聊并决定做一些有趣的游戏,特别是像魔兽世界这样的游戏。^_^ - zinking
5个回答

32
我知道你已经接受了一个答案,但我认为这个问题值得更多的评论。抱歉引用您的话顺序不正确,我将按照我认为重要的内容回答。
与其从头开始创建一个3D引擎,我决定尽可能精确地模拟现有的一个:《魔兽世界》的引擎。
然而,我想专注于实际的3D和渲染引擎,而不是界面,所以我不认为我会在这个项目中使用它[lua]。
从这两段摘录中,我可以告诉你,你并不是在试图模拟游戏引擎。只是3D渲染后端。这不是同一回事,而渲染后端部分相对于整个游戏引擎来说非常小。
顺便说一下,这可以帮助回答你的一个问题:
《魔兽世界》似乎都在使用!事实上,通常情况下它使用DirectX,但你可以通过命令行使用“-opengl”开关来使用opengl。
是的,他们实现了两者。这样做的工作量是不可忽视的,但在我的经验中,渲染后端最多占总代码的10%,通常少于这个比例。因此,实现多个后端并不是那么令人气愤。
更重要的是,今天游戏引擎的编程部分不是最大的部分。资产生产是主体(其中包括大多数游戏编程。大多数lua脚本被认为在这方面,例如)。
对于魔兽世界,OSX支持意味着OpenGL。所以他们这样做了。他们还想支持旧硬件...所以他们支持DX8级别的硬件。这已经是3个后端了。我不知道他们实际实现了多少,但归根结底,这取决于他们想要覆盖的客户群。
在游戏引擎中使用多个后端几乎是必需的,以适应所有图形卡/操作系统/平台。我没有见过一个真正的游戏引擎不支持多个后端(即使第一方标题也倾向于支持备用后端进行调试)。
好的,这取决于你想从中获得什么。我可以补充说,你的选项列表并不完整:
-DirectX9 -DirectX10 -DirectX11 -OpenGL <3.1(在弃用API之前) -OpenGL >=3.1 -OpenGL ES 1.1(仅在需要时。它不能编程) -OpenGL ES 2.0
是的,这些API足够不同,您需要决定要处理哪些。
如果你想学习3D渲染的基础知识,任何一个都可以。OpenGL < 3.1往往会隐藏许多最终必须在用户代码中发生的事情(例如矩阵操作,请参见this plug)。
DX SDK附带了许多示例,有助于理解基本概念,但它们也倾向于在开始时使用最新和最大的DX功能,即使不一定需要(例如使用几何着色器来呈现精灵...)。
另一方面,大多数GL教程倾向于使用在现代硬件上基本上无法执行的功能(例如glBegin/glEnd、选择/拾取...请参见从GL 3.1中删除的内容列表或this other plug),并且往往为许多事物种下错误的概念。
“在现实世界中最常用的是哪个?”
对于游戏而言,在PC世界中DirectX9是标准。远远超过其他。但是,我期望DirectX11将获得更多市场份额,因为它允许进行一些更多线程的工作。不幸的是,它比DX9复杂得多。
“反正没人使用OpenGL(非常非常少的人知道秘密开关)。”
问问Mac所有者他们的看法。

附带问题,如果真是这样,硬件供应商会花费精力在OpenGL驱动程序上吗?(我意识到我概括了您的评论,抱歉)?有实际的用途。虽然在游戏中不太常见。而且苹果通过iPhone使OpenGL变得更加重要(实际上是OpenGL ES)。

如果这是通常做的事情,程序员通常会创建自己的3D引擎“包装器”,对吗?

这通常是引擎设计的一个完整部分。请注意,它并没有在同一级别上抽象API,通常更多地是“用所有的铃铛和哨子在那里画出来”。应用于该绘图的渲染算法往往是后端特定的。

然而,这非常依赖于游戏引擎。如果您想更好地理解,可以看看UE3,它刚刚免费发布(啤酒)供非商业使用(我还没有看过,所以不知道他们是否公开了后端,但值得一看)。 回到我的评论,游戏引擎不仅意味着3D,看看这个


3
非常感谢你的答案,非常全面和深思熟虑!+1 - Drew Hall
1
非常好的答案,我已将其标记为被接受的答案。谢谢! - Andreas Bonini
哇,我甚至不知道您可以在事后更改接受的答案。 - Bahbar
+1 对于注意到渲染器和游戏逻辑所需的工作量比资产要少几个数量级的观点。渲染器和引擎可以在几天内制作完成,但是适当的资产设计可能需要数月时间。 - Aaron3468

3
我认为使用OpenGL而不是DirectX的主要优点是可移植性。DirectX只能在Windows上运行。然而,这通常不是问题(许多游戏只能在Windows上运行)。
DirectX还提供了其他库,对于与图形无关的游戏,如声音和输入,这些库都非常有用。我相信有一些等效的库经常与OpenGL一起使用,但我不认为它们实际上是OpenGL本身的一部分。
如果您将锁定到DirectX并且愿意/有兴趣学习C#和托管代码,我发现XNA是一个极其易于学习的平台。它使您可以学习大多数概念,而不必处理DirectX(或OpenGL)中的许多棘手细节。您仍然可以使用着色器代码,并拥有DirectX的全部功能,但在更友好的环境中。这是我的建议,但再次强调,您必须切换到C#(请注意,您也可以将其放在简历上)。

DirectX不再支持C#:http://social.msdn.microsoft.com/Forums/en-US/gametechnologiesdirectx101/thread/e9f458e0-65c6-4936-9af4-4276fc92f111。我使用的最后一个支持C#的版本是9.0c。 - James Black
2
考虑到提问者的背景和该技术的未来适用性,我强烈推荐使用XNA。 - gn22
是的,你不能直接用C#来编写DirectX程序,然而,XNA是一个使用DirectX作为底层的C#库。它与DirectX不同,并且在今天仍然被广泛使用,最近刚发布了3.0版本。 - Daniel Brotherston

1

你可能想要查看一些项目,它们将低级别的3D API 封装在一个更高级别的接口中,该接口是独立于API 的,例如Ogre3D。由于你正在学习这个,我假设你可能更有兴趣自己实现低级别的细节,但是你可能可以从这样的项目中学到很多。


1
或者是irrlicht,或者是openscenegraph。 - Martin Beckett

0

我现在正在进行一些OpenGL的工作(在Windows和Mac上)。

与使用Unity3D引擎进行午夜游戏编程相比,使用OpenGL有点像是不得不砍伐自己的树木来建造房屋,而不是购买材料。

Unity3D可以运行在任何平台上(Mac、PC和iPhone、Web播放器等),让你专注于使游戏成为游戏的本质。更重要的是,它比我能写的任何东西都要快。你可以用C#、Java(编辑:改为JavaScript)或Boo编写它。(编辑:Boo支持已被取消)

我刚刚使用Unity为一个想要使用OpenGL制作某些东西的客户制作了一个演示文稿,所以它也有实际应用。

-Chris

PS:Unity Indie版本最近变成了免费。


1
稍作更正:你可以使用JavaScript进行编程,而不是Java! :-) - Thiago Silveira
谢谢Thiago。我在7年后终于修复了它... - Chris Bennet

0

如果你只对渲染部分感兴趣,我可以建议使用Ogre3D。它是一个干净、C++编写的、经过测试的跨平台引擎。我在两个项目中使用过它,并与其他经验(例如Torque3D)进行了比较,我喜欢它良好的支持(教程/维基/论坛)和不那么陡峭的学习曲线。我认为通过查看源代码和设计中使用的概念,有人也可以学到很多东西。还有一本附带的书,虽然有点过时,但对于入门来说还是不错的。

问题在于,你将会局限于这个引擎内思考,很快你就需要类似游戏玩法的元素(计时器、事件)来模拟和测试你的效果或者你想做的任何事情。所以你最终会绕过Ogre3D的缺点(它不是一个游戏引擎),自己实现或使用另一个中间件。

因此,如果你真的想先接触3D渲染,我建议阅读一些计算机图形学书籍(GPU Gems、ShaderX),并在网上查看一些教程和演示,开始构建自己的基本框架。这是为了获得经验,我认为你会从这种方法中学到最多。至少我是这样做的...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接