我是一名C++程序员,拥有丰富的服务器编程经验.然而,我现在很无聊,我决定解决一个新领域:3D游戏编程,用于学习目的.另外,我认为如果我决定在这个领域工作,这个学习项目可能会成为未来的好简历材料.
我没有从头开始创建一个3D引擎,而是决定仿效我现有的一个:魔兽世界.如果你对原因感到好奇(随意跳过这个):
这是一个真正的世界成功的游戏
所有的地图纹理,模型和尚未完成的东西(我对学习如何用photoshop或其他东西绘制纹理不感兴趣)
他们的文件格式或多或少完全是逆向工程
已经有一个相同的开源项目(wowmapview),如果我遇到麻烦,我可以看看.
好的,这是一个很长的序言..现在,我的主要问题如下:我应该使用DirectX,OpenGL,sdl等包装库,还是什么?
在现实世界中最常用的是什么?
而且,让我感到困惑的其他事情:魔兽世界似乎正在使用两者!实际上,通常它使用DirectX,但您可以通过命令行使用"-opengl"开关启动它来使用opengl.
这在游戏中是常见的吗?他们为什么这么做?我想这是很多工作,根据我的理解,无论如何都没有人使用OpenGL(很少有人知道秘密切换).
如果这是通常做的事情,程序员通常会创建自己的3D引擎"包装器",如内部制作的SDL,并基于开关/ #defines/whatnot决定最终调用哪个API函数(DirectX或OpenGL)?或者这个功能是否已经内置在sdl中(您可以随意在DirectX和OpenGL之间切换)?
最后,你有任何书籍建议吗?
谢谢!
我知道你已经接受了答案,但我认为这值得更多的评论.很抱歉引用你的故障,我正在回答我认为重要的事情.
我没有从头开始创建一个3D引擎,而是决定仿效我现有的一个:魔兽世界.
但是我想专注于实际的3D和渲染引擎,而不是界面,所以我认为我不会在这个项目中使用它[lua].
从这两个片段中,我可以告诉你,你并不是想模仿游戏引擎.只是3D渲染后端.这不是一回事,与完整的游戏引擎相比,渲染后端部分非常小.
顺便说一句,这有助于回答您的一个问题:
魔兽世界似乎正在使用两者!实际上,通常它使用DirectX,但您可以通过命令行使用"-opengl"开关启动它来使用opengl.
是的,他们实施了两者.这样做的工作量是不可忽略的,但根据我的经验,渲染后端最多只占总代码的10%,通常更少.因此,实施多个问题并不是那么令人沮丧.
更重要的是,今天游戏引擎的编程部分并不是最大的一块.这是大部分的资产生产(包括大多数游戏编程.大多数lua脚本都被考虑在这一方面,例如)
对于WoW,OSX支持意味着OpenGL.所以他们做到了.他们也想支持旧硬件......所以他们支持DX8级硬件.这已经是3个后端了.我并不知道他们实际实施了多少,但这一切都归结为他们希望达到的客户群.
游戏引擎中的多个后端或多或少地需要扩展到所有图形卡/ OS /平台.我还没有看到一个不支持多个后端的真实游戏引擎(即使是第一方游戏也倾向于支持备用后端进行调试).
好的,这是一个很长的序言..现在,我的主要问题如下:我应该使用DirectX,OpenGL,sdl等包装库,还是什么?
嗯,这很大程度上取决于你想从中得到什么.我可能会补充一点,你的选项列表并不完整:
DirectX9的
的DirectX10
的DirectX11
OpenGL <3.1(删除已弃用的API之前)
OpenGL> = 3.1
OpenGL ES 1.1(仅在您需要时.它不可编程)
OpenGL ES 2.0
是的,那些API是不同的,你需要决定你想要处理哪些.
如果你想学习3D渲染的基础知识,那么任何一个都可以工作.OpenGL <3.1倾向于隐藏许多最终必须在用户代码中发生的事情(例如Matrix操作,请参阅此插件).
DX SDK提供了大量有助于理解基本概念的示例,但是当它们在启动时不一定需要时,它们也倾向于使用DX的最新和最强大的功能(例如,使用几何着色器渲染精灵......)
另一方面,大多数GL教程倾向于使用在现代硬件上基本上不具备性能的功能(例如glBegin/glEnd,选择/挑选,......请参阅从GL 3.1或其他插件中删除的内容列表)并倾向于为很多事情提出错误的概念.
在现实世界中最常用的是什么?
对于游戏,DirectX9是PC世界的标准.远远超过.
但是,我期待DirectX11能够获得更多的市场份额,因为它允许更多的多线程工作.不幸的是,它比DX9复杂得多.
无论如何都没有人使用OpenGL(很少有人知道秘密切换).
向Mac用户询问他们的想法.
另外一个问题,你是否真的认为硬件供应商会在OpenGL驱动程序上花费精力(如果真的如此)(我意识到我推广你的评论,对不起)?它有真实世界的用法.但在游戏中并不多.Apple通过iphone(OpenGL ES,真的)使OpenGL更具相关性.
如果它是通常做的事情,程序员通常会创建自己的3D引擎"包装器",
它通常是发动机设计的一部分.请注意,它不是在同一级别上抽象API,它通常更多地是"在那里用它的所有钟声和口哨画出来".应用于该绘制的哪种渲染算法往往是后端特定的.
然而,这与游戏引擎有关.如果你想更好地理解,你可以看看UE3,它只是免费发布(啤酒)用于非商业用途(我还没有看过它,所以我不知道他们是否暴露了后端,但它的价值看看).回到我的评论,游戏引擎不只是意味着3D,看看这个.