我学习OpenGL还是Direct3D都重要吗?


11

这两个API之间的区别是否只是次要的实现细节,是否意味着一旦我学到了一个API,便可以将其用于所有内容?或者,如果我希望能够在将来使用它而不需要重新学习另一个API的情况下,有理由学习一个而不是另一个吗?是一般的还是其他的?

特别是我希望能够为任何图形卡编写代码,因此代码不仅限于仅在特定制造商的卡或特定型号上运行。我还希望能够编写在没有显卡的情况下仍然可以运行的代码(尽管速度较慢)。

可移植代码在不同平台(操作系统/体系结构)之间的可移植性是否有所不同?我对与之兼容的其他库的可用性以及是否在更广泛的环境中导致较少的许可限制感兴趣。任何可衡量的因素都会影响其中之一是否是我唯一学习而不限制我的知识。


2
棘轮怪胎的答案是一个很好的答案。如果您想学习Direct3D,可以阅读我的免费书籍“ Direct3D图形管道”。API的详细信息主要是Direct3D9,但是概念相同。事实是,自1960年代末以来,用于3D图形编程的概念并没有真正改变。用于表达这些概念的API变得更加智能。
2015年

Answers:


9

我认为这并不重要,在倾向于“程序图形”时要使用哪个API。要学习的更重要的事情是处理3D场景时使用的典型概念。例如,您想学习如何编写一个简单的(后来更复杂的)场景图。这些概念比您必须调用的特定API方法名称重要得多。

在学习如何编写程序时进行比较。如果您擅长使用Java编写程序,那么学习C ++,Objective-C,Swift或其他面向对象的语言就不会有太多麻烦。因为这是您学习的概念和思想

OpenGL,Direct3D和Metal之间的选择主要是您选择的目标操作系统。Direct3D主要在Windows,OS X和iOS的Metal上可用,并且OpenGL在包括OS X,iOS,Windows和Linux的大多数系统上受支持。

显卡可能对该决定几乎没有影响,因为我不知道仅支持一两个显卡的显卡。如果没有专用的图形卡,那么实时渲染很快就会成为问题。尽管Intel HD Graphics和AMD伴侣已经可以做很多事情。

因此,选择您的平台。


免责声明:到目前为止,我尚未使用Direct3D或Metal。


2
>“如果您非常擅长使用Java编写程序,那么学习C ++就不会有太多麻烦了” –这不是事实。每个人在学习和使用 C ++方面都会遇到很多麻烦。将其与Java或任何其他安全语言进行比较是完全不合适的。但是,对于您列出的其他语言(Objective-C,Swift或其他一些面向对象的语言),该语句基本上是正确的。
显示名称

9

我们目前正在过渡API范式。

在D3D11和OpenGL中,将缓冲区,制服,属性,布局和程序绑定为(隐式)全局状态和使用该状态进行调度绘制的传统方法很常见。但是,它有大量的开销(在验证状态并且直到最后一分钟才知道程序要做什么)。它们也不是线程安全的(大部分情况下)。

这就是为什么新的API出现(或即将推出)的原因,其中D3D12,vulkan和Metal是最主要的。这些API为程序提供了更多控制,并允许它使用命令缓冲区预先声明要执行的操作。它们还使您可以更直接地管理自己的资源(顶点数据,纹理等)。直接使用它们会更简单。

新旧之间的选择取决于您管理分配的视频内存和构建命令缓冲区的能力。

  • 如果您想要即使在较旧的硬件上也能“正常工作”的东西,那么较旧的API会更好。他们的知名度也很高,您将在线上获得更多帮助。

  • 另一方面,如果您可以处理调度命令的异步性质,并且不必介意跟踪分配的所有缓冲区。然后,新的API可能适合您。


6
新的显式图形API并不是真正为普通图形程序员设计的,它们更适合于在引擎中从事基础结构工作的人员,或真正需要性能的人员。他们为您提供更大的武器,并将其对准您的脚。
porglezomp

3

我个人认为这并不重要。只需选择一个适合您的项目。我过去曾经使用过D3D和OpenGL。重要的是概念。无论您抢哪个,都需要了解(例如):

  • 什么是纹理以及GPU如何使用它们。
  • 图形开发的基本概念(顶点,图元,片段等)
  • 摄像头系统如何工作(例如OpenGL中的MVP矩阵)。
  • 什么是着色器以及如何正确使用它们。
  • GPU与计算机上的CPU的不同之处。
  • GPU的内存模型和CPU的内存模型之间有何区别?
  • 应该在CPU上执行哪些操作,以及应该将哪些内容卸载到GPU进行处理。

就像其他人在这里提到的那样,我们正在过渡到一组新的API(Vulkan,Metal等),因此在这一点上,如果您是Graphics Development的新手,那么专​​注于GLSL是个好主意,因为Vulkan也将利用它。

关于可移植性,D3D仅是Windows(有传言说Wine项目正在试图使D3D在Linux下工作,但到目前为止还没有可行的方法)。OpenGL是跨平台的。如果要移动,则可以使用OpenGL ES。当然,OpenGL和OpenGL ES都有不同的版本,并非所有平台都支持。

归根结底,所有API都会在您的计算机上访问相同的硬件,这仅取决于它们如何“访问”。


如果您正在为任何Xbox控制台编程,则也会使用Direct3D。
合法化

“什么都不可行”是什么意思?Wine运行数百个基于D3D的程序没有问题,并且已经这样做了很多年。当然,这里有一些错误和未实现的部分,但这并没有使整个API无法使用。
罗斯兰

0

我会说几句关于不使用图形卡的渲染。

Niether OpenGL或DirectX确实需要图形卡。一个实现可以完全由软件加速。

对于Linux中的OpenGL,有Mesa软件光栅化器。以我的经验,只要您不要将怪异的功能(显示列表+索引顶点数组)组合在一起,就可以正常工作。我认为他们的实际错误清单高一英里。确保进行连续测试!

我在Windows中使用OpenGL的经验较少。如果您知道什么,请编辑答案!

DirectX SDK随称为“参考栅格化器”的软件栅格化器一起提供。在我看来,它主要用于调试,但是我知道至少有一个朋友在仅支持DX10的笔记本电脑上开发DX11时使用了参考光栅化器。如其他答案所述,DirectX仅适用于Microsoft。


以我的经验,对于Windows上的大多数OpenGL开发而言,使用集成显卡应该足够好,只需确保它支持最新的OpenGL版本即可。
阿卡塔尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.