由于微软对Direct3D有一定的偏向,所以在使用VBO时,Direct3D中的场景是否比OpenGL中使用VBO的同一场景更快,或者它们是相同的,因为这取决于显卡驱动程序。
就性能而言,并假设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驱动程序通常落后于质量和支持的功能。
查看一些相关问题 -
新的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。
一般来说,它们差不多。曾经有一段时间,DirectX在速度上比OpenGL更具优势,但对于大多数实际用途而言,这已成为历史。
实际上,这取决于您正在进行的项目类型。
如果您想将其移植到不同的平台,请不要使用DirectX。如果您想在Windows上拥有完全控制和快速开发库,则DirectX是最好的选择。如果您找到了一个具有所有所需功能的图形引擎,请使用它。与使用纯DX或OpenGL相比,特别是如果它支持工具链(级别编辑器,从3D建模器导入模型等),这样做更容易。
如果您想学习DX,请选择DX或SlimDX。如果您想学习OpenGL,请选择OpenGL。
请注意,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)的驱动程序作斗争。
使用中间件。如果您想要具有许多功能(加载3D模型和动画等)的东西,则Ogre很好。如果您只想要一个简单的包装器,则SDL很好。
回答您实际的问题,这完全取决于驱动程序。这在制造商之间有所不同。我的理解是,现在GL并没有得到所有主要公司(nVidia、ATI、Intel)的良好支持,这是一个大问题。
个人而言,我会使用中间件,但主要依赖于测试/开发D3D。
我会选择DirectX。它正在快速改进和发展-比OGL委员会移动得快得多。延伸地狱,有人吗?
我曾经使用过OpenGL,但现在我对探索DirectX的世界感兴趣。原因是DX11的发布结束了Windows上漫长而拖延的战争。
Khronos Group很快发布了OpenGL 4来反击;可惜的是,OGL4仍然缺少一半左右的新功能,并且有些功能对于创建灵活的3D框架至关重要,但还没有跟上。