DirectX与OpenGL游戏开发对比

3
我有几个关于制作专业游戏(如魔兽世界,星际争霸2和暗黑破坏神3)时使用的图形平台的问题。
首先,如果使用OpenGL而不是DirectX,魔兽世界会有不同的外观吗?如果使用OpenGL呈现,性能是否会有显着差异?
其次,在创建游戏时的主要过程是什么,特别是在使用Maya或3DS Max中创建模型方面?是先创建模型,然后将模型导出为可读取的OpenGL / DirectX代码,并导出所有着色器程序,所有顶点和三角形都在代码中创建,最后在C ++ / c程序中使用代码?
总的来说,我想知道视频游戏设计师/程序员如何将实际的3DS MAX / Maya模型导入到他们的代码中。
5个回答

5
首先,如果使用OpenGL而不是DirectX来渲染WoW,它会看起来不同吗?实际上,WoW确实可以使用OpenGL来渲染(通过设置),但在D3D渲染中,它并不会看起来不同(DirectX不仅仅是Direct3D)。
其次,使用OpenGL渲染是否会显著影响性能?这不太可能。OpenGL实现可以更快地完成某些任务,但WoW并没有使用其中的任何功能。
再者,OpenGL和Direct3D都没有模型格式。即使.x文件在此时也已经过时,它们只是D3DX库的一部分,该库只是Microsoft在D3D之上编写的一个层。
其次,您不能将模型导出为“代码”。您需要将其导出为文件,然后在游戏中读取这些文件。通常,您需要将这些文件转换成更易于处理的格式,并根据您想要在游戏中使用的方式对网格进行优化。因此,导出为文件->处理为最终文件->在游戏中读取。

假设您有一个动画,您的模型会在用户按下键盘上的w键时运行该模型。这个动画将在一个单独的文件中,该文件被调用,并且文件本身会相应地更改顶点坐标? - Jim Hubbard
4
@Jim Hubbard - 不,外部文件包含字符的形状(顶点网格)和纹理(表面图像)。 这些由公司的艺术人员制作(那些有更多纹身和更好穿着的人)并由程序员整合到游戏引擎中。 然后,在游戏过程中,角色由游戏引擎进行调整和移动。 - Martin Beckett

3

首先,如果使用OpenGL而非DirectX进行渲染,那么《魔兽世界》是否会有所不同?如果使用OpenGL进行渲染,性能会有显著的不同吗?

OpenGL和Direct3D遵循类似的原则:一系列顶点进入,经过变换(固定功能或顶点着色器),变换后的顶点被分组成基元(点、线、三角形),并进行栅格化。即为每个像素计算覆盖该基元的计算(再次通过固定功能或自由可编程片段着色器执行)以确定所谓的“片段”颜色。最后,对片段进行可见性测试,并混合到正在绘制的图像中。

OpenGL和DirectX的后续版本添加了几何和镶嵌阶段,但这些只是细节。

在所有其他方面,它们的工作方式如此相似,以至于渲染结果几乎没有区别,除了由不同剪裁空间映射引入的顶点位置的舍入误差。

其次,创建游戏的主要过程是什么,特别是在使用Maya或3DS Max中创建的模型时?是先创建模型,然后将模型导出为可读的OpenGL/DirectX代码,其中包括所有导出的着色器程序和在代码中创建的所有顶点和三角形,并最终在C++/c程序中使用该代码吗?

不!模型及其辅助数据与代码分别存储。虽然在代码中存储几何图形是可能的,但这是一个相当糟糕的想法,不应该这样做。我解释了基本思想,即如何从How to Import models from 3D software, like Maya into OpenGL?导入模型。
总体而言,我对视频游戏设计师/程序员如何将实际的3DS MAX/Maya模型导出到他们的代码中感到好奇。他们不会这样做。他们将模型导出为优化了3D引擎高效加载的文件格式,然后引擎从文件中加载模型和辅助数据。这不是某种黑魔法。整个过程与从文件加载图像并显示它或播放一些音乐到扬声器没有太大区别。要对3D模型进行动画处理,模型包含额外的控制信息(骨架、骨头等),允许根据少量参数(手臂旋转、观察方向等)对其进行变形。然后改变这些参数。

1

你问了一个很大的问题,但至少对于它的“第二”部分 - 非平凡模型是在软件包中创建的,如你所描述,但通常会被导出到数据文件中,基本上表示几何图形列表。然后这些文件会被游戏资源加载器读取,并放入顶点数组或缓冲区对象等中。这样数据就独立于代码。

硬编码的几何图形通常用于小型固定物体和教程项目。 :)


0

你的第一个问题实际上是无法回答的 - 两个图形库都通过API使我可以访问底层图形硬件。游戏的外观在很大程度上取决于如何使用该API。如果我在OpenGL中将后备缓冲区设置为红色,它看起来与我在DirectX中将后备缓冲区设置为红色时相同。如果我在OpenGL中执行与DirectX相同的光照计算,我将看到相同的结果,依此类推。任何产生的差异可能是由于API不完全相同,因此程序员需要解决这个问题。

来自3D建模程序(例如Maya或3DsMax)的模型并没有“编码”,而是以游戏可以理解的格式导出。这些可以是基于XML的格式,例如Collada,基于文本的格式,例如OBJ,甚至是专有的二进制格式。重要的是,建模程序中的数据以一种游戏可以读取和转换为几何体内部表示的格式提供给游戏。几乎每个游戏引擎都以稍微不同的方式处理几何体。

从技术上讲,我只需保存以下文件:

V1  0.0, 0.5, 0.5
V2 -0.5,-0.5, 0.5
V3  0.5, 0.5, 0.5

M1 V1, V2, V3

只要游戏理解这个文件包含三个顶点(V1V2V3)和一个网格(M1),由这三个顶点组成,并且知道如何将其读入我们可以渲染的格式中,我们就可以开始绘制这个三角形到场景中作为一个网格。顺便说一下,这种格式与OBJ格式并没有太大差别。
大多数导出器比这个复杂得多,而大多数引擎支持更复杂的几何表示,以考虑这些(强大的)建模工具可以为我们提供的所有额外数据。

-1

这是一个非常大的问题,简短回答很难。

关于DirectX和OpenGL,它们在功能和性能方面并没有太大的区别(也许)。

DirectX总是领先于OpenGL。例如,它首先支持硬件镶嵌特性,然后过了一段时间,这个特性才出现在OpenGL中。但这不是什么大不了的事情,因为当你开发游戏时,你必须支持一系列机器,包括那些低性能的机器。所以你可能无法使用新的特性,直到它变得非常普遍。

是的,游戏开发者使用Maya和3Ds Max等软件来创建游戏模型,并通常将模型输出到模型文件中。这个文件由游戏引擎读取。

我不建议你从OpenGL或DirectX开始,我认为最好使用游戏(或图形)引擎。例如,Ogre 3D. http://www.ogre3d.org/

因为它支持DirectX和OpenGL,而且还有现成的3Ds Max、Maya导出器,使加载模型变得容易。


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