Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 应用程序如何支持多个图形API?_Opengl_Graphics_Directx_Rendering - Fatal编程技术网

Opengl 应用程序如何支持多个图形API?

Opengl 应用程序如何支持多个图形API?,opengl,graphics,directx,rendering,Opengl,Graphics,Directx,Rendering,我见过许多主要支持OpenGL的图形应用程序。我还注意到,许多应用程序都有一个-d3d标志,这将迫使它们改用directxapi 一个图形应用程序如何使用两个不同的API,但呈现完全相同的结果?当然,他们需要为这两种API添加代码,这既费时又有点浪费?OpenGL与DirectX的话题对许多人来说都很敏感,所以让我先说一句,我的目的是不煽动“API战争”的任何一方。 如果您谈论的是像CAD这样的通用图形软件,那么它们往往需要支持大量的跨平台目标。在这些情况下,他们将OpenGL用于MAC和*NI

我见过许多主要支持OpenGL的图形应用程序。我还注意到,许多应用程序都有一个
-d3d
标志,这将迫使它们改用directxapi


一个图形应用程序如何使用两个不同的API,但呈现完全相同的结果?当然,他们需要为这两种API添加代码,这既费时又有点浪费?

OpenGL与DirectX的话题对许多人来说都很敏感,所以让我先说一句,我的目的是不煽动“API战争”的任何一方。

如果您谈论的是像CAD这样的通用图形软件,那么它们往往需要支持大量的跨平台目标。在这些情况下,他们将OpenGL用于MAC和*NIX等系统以及Windows

虽然开发人员可以在Windows上使用OpenGL,但Windows上对OpenGL的“默认”支持非常少——只支持OpenGL v1.x软件。如果您想使用功能更全面的OpenGL版本,则需要让用户安装OpenGL ICD。这些OpenGL ICD的质量在很大程度上取决于每个硬件供应商是否能跟上标准,而且在过去,针对Windows的OpenGL ICD已经针对特定应用程序的非常特定的调用模式进行了调整(读“Doom”)。如果您的应用程序与这些模式不匹配,您有时会遇到奇怪的性能问题或遇到其他错误

视频硬件行业也出现了一种趋势,即在Windows上对“消费者级”硬件的OpenGL支持对于一些游戏来说是相当简单的,而“工作站级”硬件则获得了大量开发人员资源,专注于编写高质量的OpenGL ICD。在这种情况下,针对工作站的软件(同样,阅读CAD)倾向于提供两种API,以满足用户在更便宜和更昂贵系统上的需求。相反地,对于游戏来说,要求一张2000美元以上的视频卡来玩是不现实的——使用DirectX通常更容易、更健壮——除非你碰巧遇到了市场上唯一一款“必备”的OpenGL游戏,而“消费者级”驱动程序实际上可以很好地使用它

使用DirectX,特别是Windows 7+上的DirectX 11,对于来自不同供应商的各种设备的大多数系统来说都是“开箱即用”的。一些软件开发人员发现,它在不同的设备上更加一致,并在提供OpenGL和DirectX时将其作为默认设置。这就是为什么许多PC游戏仅在Windows上使用DirectX。然而,如果他们已经在做一个抽象来支持OpenGL for MAC,那么他们也可以将其作为Windows用户的一个选项

对于游戏,抽象在渲染引擎中是典型的。为了获得AAA标题的良好性能并满足所有对他们来说重要的不同平台,他们通常必须实现多个版本的渲染器(Direct3D 11适用于Windows Vista+,Direct3D 9适用于Windows XP特别是新兴市场,Direct3D 9适用于Xbox 360,Direct3D 11适用于Xbox One,OpenGL适用于MAC,PlayStation 3和/或4以及移动游戏OpenGL ES的特定渲染器)。这通常是通过一个抽象层来实现的,然后每个平台都有专门的编码人员来整理游戏,并利用硬件特定的功能来发布。这不是一个便宜的解决方案,但许多大型出版商试图通过跨多个dif提供内容版本来套利项目风险其他平台,并认为它值得额外的成本。
对于独立开发者和小型开发者来说,尝试同时支持OpenGL和DirectX可能是一个相当大的挑战。对于他们来说,通常最好专注于在一个平台上使用一个单一的、支持良好的API为该平台制作一个伟大的游戏。然后,如果他们成功了,他们可以通过完成实现mul所需的工作,将其移植到更多的平台上tiple rendering API-并创建自定义内容处理,以根据每个平台进行定制。也就是说,独立游戏通常不关注图形上的差异,因此使用抽象层的功能和性能权衡问题不大。但是,跨多个不同设备测试游戏并两次测试游戏的成本很高涵盖OpenGL和DirectX。

“计算机科学中的每个问题都可以通过另一层抽象来解决。”我怀疑这一点在这里适用。处理渲染API的实际代码通常只占整个应用程序的一小部分。拥有不同的渲染后端并不难。通常,您会有一些部分管理图形对象和“场景”(这当然在很大程度上取决于应用程序的类型)。在以前,游戏甚至有自己的软件光栅化器,后来还可以选择支持不同的3D加速API。现在,许多游戏和图形应用程序使用通用的3D引擎,这些引擎支持不同的渲染API,主要是为了支持不同的平台。@JonathonReinhart我想类似包装器的东西可能会使用哪种方法才能调用正确的函数?@JonathonReinhart“计算机科学中的每一个问题都可以通过另一个间接层次来解决”+“除了间接层次太多的问题”;@Mhmk这是正确的。您可以轻松下载任何免费跨平台渲染引擎的源代码,并亲自查看。