我见过许多主要支持OpenGL的图形应用程序。我还注意到,这些应用程序中的许多应用程序都有一个-d3d
标志,这将强制它们使用DirectX API。
一个图形应用程序如何使用两个不同的API却呈现完全相同的结果?他们肯定需要为这两个API添加代码,这既耗时又有点浪费?
OpenGL与DirectX的主题对许多人来说都很敏感,所以让我首先说,我的意图是不激化"API战争"的任何一方
如果你谈论的是像CAD这样的通用图形软件,它们往往需要支持大量的跨平台目标。在这些情况下,他们将OpenGL用于MAC和*NIX等系统以及Windows。
虽然开发人员可以在Windows上使用OpenGL,但在Windows上对OpenGL的"默认"支持非常少——仅限OpenGL v1.x软件。如果您想使用功能更全面的OpenGL版本,您需要让用户安装OpenGL ICD。这些OpenGL ICDs的质量在很大程度上取决于每个硬件供应商是否符合标准,过去,针对特定应用程序的非常特定的调用模式(读作"Doom"),对Windows的OpenGL IC进行了调整。如果您的应用程序与这些模式不匹配,有时会出现奇怪的性能问题或遇到其他错误。
视频硬件行业也有一种趋势,即"消费级"硬件上的OpenGL在Windows上的支持对于一些游戏来说是相当小的工作量,而"工作站级"硬件的大量开发人员资源集中在编写高质量的OpenGL ICD上。在这种情况下,针对工作站的软件(再次读取CAD)倾向于提供这两种API,以满足用户在更便宜和更昂贵的系统上的需求。相反,对于游戏来说,需要2000美元以上的视频卡才能玩是不现实的——使用DirectX通常更容易、更健壮——除非你碰巧遇到市场上只有OpenGL的"必备"游戏,"消费级"驱动程序实际上可以很好地使用它。
使用DirectX,尤其是Windows 7+上的DirectX 11,对于来自不同供应商的各种设备的大多数系统来说,都可以"开箱即用"。一些软件开发人员发现,它在不同的设备上更加一致,并在同时提供OpenGL和DirectX时将其用作默认值。这就是为什么许多电脑游戏只在Windows上使用DirectX的原因。然而,如果他们已经在进行抽象以支持OpenGL for MAC,那么他们很可能也会将其作为Windows用户的一个选项。
对于游戏,抽象在渲染引擎中是典型的。为了获得AAA头衔的良好表现,并在所有对他们重要的不同平台上获得成功,他们通常无论如何都必须实现其渲染器的多个版本(适用于Windows Vista+的Direct3D 11,适用于Windows XP的Direct3D 9,特别是适用于新兴市场的Direct3D9,适用于Xbox 360的Direct3D11的变体,适用于XboxOne的Direct3D11.适用于MAC的OpenGL,适用于PlayStation 3和/或4的特定渲染器,以及适用于移动游戏OpenGL ES)。这通常是通过一个抽象层来实现的,然后每个平台的专用编码器利用硬件特定的功能将游戏编排到发货。这不是一个廉价的解决方案,但许多大型出版商试图通过在许多不同的平台上提供其内容的版本来套利项目风险,并认为这值得额外的成本。
对于独立和小型开发人员来说,尝试同时支持OpenGL和DirectX可能是一个相当大的挑战。对于他们来说,最好专注于在一个平台上使用一个支持良好的API为该平台制作一款出色的游戏。然后,如果他们成功了,他们可以通过实现多个呈现API所需的工作将其移植到更多的平台上,并创建自定义内容处理来针对每个平台进行定制。也就是说,独立游戏通常不注重图形的差异化,因此功能&使用抽象层的性能权衡问题不大。然而,在许多不同的设备上测试游戏并进行两次以覆盖OpenGL和DirectX是非常昂贵的。