在Windows系统中,OpenGL和DirectX有何区别?

13

我没有任何图形编程的实际经验。我在阅读有关图形编程的内容时产生了这个疑问。

据我所了解,因为Windows没有像DOS那样提供直接硬件访问,所以创建了DirectX。这意味着DirectX是实现直接(近似)硬件访问的唯一可靠方法。我错了吗?

如果我没错的话,那么OpenGL必须使用DirectX本身或在DirectX之上实现。

那么这是否意味着在Windows上,OpenGL实际上就是DirectX?

请注意,我的疑问仅限于标题所说的内容,我不想知道其中一个比另一个更好等等。

4个回答

27
据我所了解,因为Windows没有提供类似DOS的直接硬件访问,所以才创建了DirectX。
事实上,任何具有内存保护的操作系统都不会提供DOS式的直接硬件访问。
而且,DirectX是为了提供加速访问某些硬件类型的API而创建的。DirectX是用于加速硬件访问的API之一,而不是唯一的方法。
这意味着DirectX并不是实现直接(近似)硬件访问的唯一可靠方法。因为负责通道硬件访问的软件部分称为驱动程序,驱动程序在特权模式下运行,这意味着地址空间保护不适用于它们。也就是说,因为驱动程序必须能够与硬件通信。
驱动程序通过API与常规程序(称为用户空间)通信。API可以标准化,可以严格规定,也可以完全专有。
DirectX是一个已经被Microsoft规范化的API。
OpenGL也是一种API,但是它不是由单一实体规范化的,而是在多个贡献者的协作下某种形式的标准化。
另外一个专有API的例子是3Dfx的Glide,它在很大程度上受到OpenGL的启发。实际上,有一个兼容性包装器称为“minigl”,实现了Half-Life 1引擎在3Dfx/Glide系统中所需的OpenGL子集。
GPU供应商的驱动程序开发人员遵循API的规范,为DirectX、OpenGL或某个专有接口编写驱动程序。这些API中的每一个都可以访问驱动程序,从而访问硬件资源。而且,单个资源可能有多个API。驱动程序可以并行地实现DirectX 3D、OpenGL和其他任何内容,并将它们全部提供给用户空间。所以,如果随附GPU驱动程序,则OpenGL不是建立在DirectX之上的。Windows Vista及以上版本内置了基于DirectX的OpenGL-1.4仿真,但不支持着色器、顶点缓存对象和其他所有功能。一旦安装了支持OpenGL的GPU驱动程序,这将完全替换OpenGL-1.4仿真,并提供一个实际的低级实现。

+1 针对其他不完全正确的答案,提供了准确的回答。 - Christian Rau
@Goz:实际上HL1使用了一个经过大幅修改的Quake-1引擎版本。主要变化包括从索引颜色到RGB颜色模式的转换以支持动态照明,支持多个WAD纹理容器,其中一个地图引用不同的调色板,声音系统完全改版,新的AI系统(与声音和照明系统集成 - 进入一个黑暗的房间有蟑螂并打开灯,蟑螂会躲在黑暗的角落里)和关键帧插值字符动画系统,可以作用于单个身体部位。 - datenwolf
这是否意味着安装了DirectX驱动程序后,我可以调用OpenGL函数而无需显式支持OpenGL的GPU驱动程序? - Turkhan Badalov
@TurkhanBadalov:不是这样的。它意味着你可以进行DirectX调用。为了支持OpenGL,驱动程序当然必须搭载OpenGL实现。但是在API(即DirectX、OpenGL、Vulkan、Metal等)方面,它总是涉及到软件。硬件本身对API是不可知的。 - datenwolf

5

DirectX是一个使用图形卡硬件功能的层。自Windows Vista以来,缺省的OpenGL实现(由Microsoft提供)使用DirectX,因此OpenGL非常慢。

然而,图形卡制造商提供了带有OpenGL的驱动程序,直接使用图形卡而不经过DirectX;性能应该相同。如果您拥有一个集成的图形卡和一个较差的驱动程序,OpenGL可能会使用DirectX。


2
问题在于存在直接硬件访问,没有方便的抽象层。软件供应商不想花费大量时间为每个新卡编写支持程序,因此他们要求微软实现抽象化。选择是OpenGL还是发明一个新的层。各种原因导致了后者的出现。Vista+可以将OpenGL转换为DirectX,反之Wine可以将DirectX转换为OpenGL。

我不理解第一句话。访问是如何通过16位仿真模式实现的? - Ken
@Ken DirectX是在Windows 95推出时出现的,也就是在内存保护有限的情况下。通常会有一些迷你驱动程序,例如MiniGLX。 - Steve-o

2

不,这两种语言都通过由显卡制造商编写的驱动程序直接与图形卡硬件进行通信,因此它们提供相同水平的硬件访问。

Windows直接支持DirectX,它是用于漂亮的显示效果所需的操作系统的一部分。他们对OpenGL的支持相对更加有限,他们只支持v1.1(我们现在使用的版本为4),因此要做任何有用的事情,您需要使用一些额外的库(例如glew)或者图形卡制造商的OpenGL SDK。

在功能方面,DirectX受到微软的严密控制-因此所有DirectX系统应该表现相同。 OpenGL允许图形卡制造商添加自己的扩展,因此他们可以通过向硬件添加特定功能来提高性能(至少在理论上)。 OpenGL也是跨平台的,因此您的Windows OpenGL代码将在任何地方(理论上)运行。


"GLEW" 不是OpenGL扩展,而是一个库,可以使得使用GPU制造商提供的OpenGL扩展更加容易。最后一段完全有偏见并且也是胡说八道。 - Ben Voigt
GLEW不是OpenGL ARB_EXT扩展,而是Windows上扩展OpenGL功能的扩展。顺便说一句,在Intel嵌入式图形芯片组上运行任何复杂度的OpenGL程序吧。 - Martin Beckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接