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

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

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

评论

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

#1 楼

我认为这并不重要,当倾向于“程序图形”时要使用哪个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。

评论


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

#2 楼

我们目前正在API范式的转换中。

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

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

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


如果您想要即使在较旧的硬件上也能“正常工作”的东西,那么较旧的API会更好;另外,它们还广为人知,您将在线上获得更多帮助。
另一方面,如果您可以处理调度命令的异步性质,并且不必介意跟踪所有分配的缓冲区。然后,新的API可能适合您。


评论


$ \ begingroup $
新的显式图形API并不是真正为普通图形程序员设计的,它们更适合于在引擎中进行基础结构工作的人,或真正需要性能的人。他们为您提供更大的武器,并将其对准您的脚。
$ \ endgroup $
–porglezomp
15年8月21日在16:07

#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都会访问您计算机上的相同硬件,这仅仅是“他们如何访问它。

评论


$ \ begingroup $
如果您正在为任何Xbox控制台编程,也将使用Direct3D。
$ \ endgroup $
–合法化
2015年11月3日23:37

$ \ begingroup $
“什么都不可行”是什么意思? Wine运行数百个基于D3D的程序没有问题,并且已经这样做了很多年。当然,这里有一些错误和未实现的部分,但这并没有使整个API无法使用。
$ \ endgroup $
–俄罗斯
18年5月4日在16:45



#4 楼

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

Niether OpenGL和DirectX确实需要图形卡。一个实现可能是完全由软件加速的。

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

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

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

评论


$ \ begingroup $
以我的经验,使用集成显卡对于Windows上的大多数OpenGL开发应该已经足够了,只需确保它支持最新的OpenGL版本即可。
$ \ endgroup $
– Akaltar
17-10-24在14:13