在Windows系统中,是应该使用Direct3D还是OpenGL?

10

由于微软对Direct3D有一定的偏向,所以在使用VBO时,Direct3D中的场景是否比OpenGL中使用VBO的同一场景更快,或者它们是相同的,因为这取决于显卡驱动程序。

9个回答

20

就性能而言,并假设GPU驱动程序良好,整体上没有区别。

某些操作在OpenGL中本质上比DirectX9更快,不过DX10已纠正了这一点。

但是,在处理外部硬件时的一个实用建议是,决定性能的并不是你使用的API。

编写网络代码时,瓶颈在于网络适配器,无论你的套接字代码是使用.NET、C中的原始Berkeley套接字,还是使用Python库,都没有关系。

编写使用GPU的代码时,GPU是限制因素。DirectX和OpenGL之间最大的区别在于,可能需要调用一个或两个函数才能完成特定任务 - 而其性能成本几乎不存在。发生在GPU上的情况在任何一种情况下都相同,因为这由GPU驱动程序决定,并且因为OpenGL和DirectX都尽可能地高效。

然而,有合法的理由偏向于任何一个API。

DirectX拥有更好的工具支持。微软在这方面做得非常好。使用诸如PIX之类的工具,调试和优化DirectX代码要容易得多。此外,微软还提供了助手库D3DX,其中包含了许多常用功能的高效实现。

OpenGL的优势在于它不受特定操作系统的约束。DirectX9仅适用于Windows。DX10及以上版本仅适用于Vista及以上版本。

只要编写了OpenGL驱动程序,OpenGL就可以在任何有操作系统上运行。

在Windows上,情况有时会有点尴尬。Windows本身仅提供古老的OpenGL实现。(我相信XP是1.1,而Vista/7是1.5)

因此,在Windows上运行OpenGL应用程序依赖于GPU供应商提供带有其驱动程序的更新实现。ATI和NVidia提供非常好的实现,所以这不是太大的问题。Intel的OpenGL驱动程序通常落后于质量和支持的功能。


1
谢谢您。这是我到目前为止在SO上读过的最有用的排序比较。 - Jules G.M.

3

查看一些相关问题 -

OpenGL在非游戏领域仍优于Direct3D吗?

新的Windows游戏项目应该使用OpenGL还是Direct3D?或者其他什么?

微软现在非常偏向于Direct3D。许多低端的英特尔集成显卡默认情况下不会提供OpenGL驱动程序,或者如果提供了,只支持较旧版本/规范的OpenGL,例如1.2 / 1.4。如果您的目标是这样的机器(英特尔占有50%的图形市场份额),那么将很难利用更高级的功能,如着色器(OpenGL 1.5中可用)。而由于这些低端卡的更好驱动程序的可用性,您将能够在Direct3D中使用类似的着色器。当然,Direct3D仅适用于Windows。

另一方面,如果您真的不需要使用着色器,则可以选择Direct3D或OpenGL。尽管我更倾向于OpenGL。它是跨平台的,并且除了Microsoft之外,每个人都支持它。像绘制线条(各种宽度)之类的一些东西,在OpenGL中也要容易得多。 OpenGL还内置了一个拾取模式,比光线拾取更加稳健(特别是如果您想选择点和线)。

第三个选项是使用抽象API或现有引擎,可以渲染到OpenGL和Direct3D。


不会点踩,但是有哪些高级着色器可以使用D3D编写而无法使用OGL编写?请至少列举一个。 - stinky472
抱歉,我的意思不是OpenGL无法编写。我想说的是,微软为英特尔显卡提供的默认驱动程序仅支持OpenGL 1.2/1.4,因此您无法使用高级着色器,尽管它们可用并且可能受到最新驱动程序支持的显卡支持。 - tathagata
@tathagata:你的回答非常强烈地暗示OpenGL不能使用“高级着色器”。它绝对有能力使用“高级”着色器,大多数着色器功能早在DirectX之前就出现在OpenGL扩展中。甚至DirectX的HLSL也是从OpenGL中使用的一种着色器语言演变而来的。(我认为是NVIDIA的Cg,但我可能错了。) - greyfade
Cg是一种“跨平台”的着色器语言,可以编译为D3D/GL着色器。 HLSL随DX9一起推出,非常类似于Cg,但我不知道哪个先出现。 - Mr. Boy
请记住,那些没有提供适当的OpenGL驱动程序的英特尔GPU实际上也无法有效地运行DirectX。 - jalf
@John:Cg先出现。我知道它被用作微软的HLSL的基础,并且我认为它也影响了GLSL。在那之前,GL提供了更低级别的着色器程序扩展。 - greyfade

2

一般来说,它们差不多。曾经有一段时间,DirectX在速度上比OpenGL更具优势,但对于大多数实际用途而言,这已成为历史。


2
事实上,没有快速的OpenGL软件渲染器更多地是历史的产物,而不是API设计的问题,尽管我们游戏图形人员认为它基本上是有缺陷的,因为它与我们对3D图形应该如何工作的概念不符。SGI最终发布了一款竞争性的软件OpenGL,以对抗来自Redmond的FUD。 - Arthur Kalliokoski

0
如果您愿意,可以自己尝试一下。Ogre3D是一个很棒的3D库,在开始时,您可以选择使用DirectX或OpenGL。如果我没记错的话(距离我上次使用已经有3-4年了),他们的示例中甚至有帧率和其他数据,您可以看到哪个更快。

0

实际上,这取决于您正在进行的项目类型。

如果您想将其移植到不同的平台,请不要使用DirectX。如果您想在Windows上拥有完全控制和快速开发库,则DirectX是最好的选择。如果您找到了一个具有所有所需功能的图形引擎,请使用它。与使用纯DX或OpenGL相比,特别是如果它支持工具链(级别编辑器,从3D建模器导入模型等),这样做更容易。

如果您想学习DX,请选择DX或SlimDX。如果您想学习OpenGL,请选择OpenGL。


0

请注意,Windows上的GL驱动程序通常非常不稳定和有缺陷。 OEM在Windows下通常很少使用GL驱动程序。 只足够让最新的id游戏正常运行。 如果您以不同的方式处理,则会很麻烦。

您应该在两者之间编写一个抽象层,并实现两个后端。 这为您提供了最佳选择。 DirectX在Windows下的稳定性和OpenGL的跨平台性。 它还使您能够在其中添加一些未来的渲染后端,如果您想要的话,这也给您带来了巨大的优势。

值得注意的是,X-Box和DirectX有足够的不同之处,意味着如果您尝试这样做,您需要为两个平台都准备一个单独的后端。

就我个人而言,我的引擎支持DX9,DX10,Open GL3,OpenGL ES2.1,我更喜欢抽象层:)

编辑:根据评论,我要指出nVidia驱动程序是最不稳定的Windows OpenGL驱动程序。 几乎每个其他制造商都有问题。 即使nVidia也有很多问题。 在我看来,很多时候,您会与DirectX“只需工作”(tm)的驱动程序作斗争。


我不知道你对于Windows上有缺陷的GL驱动程序的看法是从哪里来的。根据我的经验,它们与Linux驱动程序一样好或一样差 - 至少对于nVidia而言,大部分代码都是相同的。 - eile
@eile,我认为Goz的意思是相对于Windows/DirectX驱动程序。特别是英特尔芯片组,他们声称支持OpenGL2.1,但我笔记本电脑上的那个甚至无法正确绘制简单的线条。 - Martin Beckett

0

使用中间件。如果您想要具有许多功能(加载3D模型和动画等)的东西,则Ogre很好。如果您只想要一个简单的包装器,则SDL很好。

回答您实际的问题,这完全取决于驱动程序。这在制造商之间有所不同。我的理解是,现在GL并没有得到所有主要公司(nVidia、ATI、Intel)的良好支持,这是一个大问题。

个人而言,我会使用中间件,但主要依赖于测试/开发D3D。


0

我会选择DirectX。它正在快速改进和发展-比OGL委员会移动得快得多。延伸地狱,有人吗?


公平地说,OpenGL的发展在过去两年左右加速了很多。今天它们比过去十年可能更具竞争力。 - jalf
1
@Jalf:他们已经弥补了3.0版本的沉痛失望吗? - Kylotan

-4

我曾经使用过OpenGL,但现在我对探索DirectX的世界感兴趣。原因是DX11的发布结束了Windows上漫长而拖延的战争。

Khronos Group很快发布了OpenGL 4来反击;可惜的是,OGL4仍然缺少一半左右的新功能,并且有些功能对于创建灵活的3D框架至关重要,但还没有跟上。


值得思考的是:OpenGL 3.3/3.2 允许你在 WinXP 上使用几何着色器。DirectX 不允许,因为几何着色器仅支持 DX10/11,这是 Vista 或 Windows7 才有的。"其中一些对于创建灵活的 3D 框架至关重要。" 我不同意这部分。创建灵活框架的能力只取决于编程技能。API 并不重要,好的程序员应该能够创建灵活的框架,而不受 API 的限制。看看 "暗黑之刃" - 他们在 DX7 硬件上创建了实时阴影、肢解和相对不错的水效果... - SigTerm
那么,为什么GPU不能像CPU一样实现高质量渲染呢?只是因为性能原因吗?当然不是。他们创建了一个灵活的游戏引擎框架而不是通用的渲染框架。你难道看不到只有当GPGPU编程技术进步时,rt光线追踪才成为可能吗?我并不争论如何适应不同的平台,但渲染能力很重要。这有两个方面:1.能够允许各种算法;2.良好的工程设计。(某些编码结构严重依赖于硬件特定功能。理论上,您可以使用无数的代码来实现任何东西,但不切实际) - Defd

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