在Windows上,OpenGL与DirectX有何不同?

时间:2011-09-10 14:42:39

标签: windows opengl directx

我没有掌握图形编程的经验。我在读图形编程时遇到了这个疑问。

据我所知,由于Windows不像直接硬件访问那样提供DOS,因此创建了DirectX。这意味着DirectX是实现直接(ish)硬件访问的唯一可靠方法。我错了吗?

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

那么这不意味着Windows OpenGL真的是DirectX吗?

请注意,我的疑问仅限于标题所说的内容,而且我不感兴趣为什么一个比另一个更好等。

4 个答案:

答案 0 :(得分:24)

  

据我所知,由于Windows不像直接硬件访问那样提供DOS,因此创建了Direct X.

Windows没有像直接硬件访问那样提供DOS。实际上没有带内存保护的操作系统。

是的,创建DirectX是为了提供一个 API,以便加速访问某些类型的硬件。 DirectX是用于加速硬件访问的 API,而非 THE (仅限一个)。

  

这意味着Direct X是实现直接(ish)硬件访问的唯一可靠方法。我错了吗?

错误,因为没有任何人阻止您为加速硬件访问实施其他跟踪。负责引导硬件访问的软件称为驱动程序。驱动程序以特权模式运行,这意味着地址空间保护不适用于它们。也就是说,因为驱动程序必须能够与硬件通信。

驱动程序通过API与常规程序(所谓的用户空间)进行通信。 API可以是标准化的,然后可以严格指定,也可以是完全有利的。

DirectX是指定的API,规范由Microsoft写下。

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 :(得分:3)

DirectX是一个使用图形卡硬件功能的层。从Windows Vista开始,默认的OpenGL实现(Microsoft提供的实现)使用DirectX,因此OpenGL非常慢。但是,显卡制造商使用图形卡直接使用OpenGL为驱动程序提供OpenGL,而不是通过directX,因此性能应该相同。如果你有一个驱动程序很差的集成显卡,OpenGL可能会使用DirectX。

答案 2 :(得分:2)

问题更多的是直接的硬件访问和没有方便的抽象层。软件供应商不希望花费所有时间为每张新卡写支持,以便推动Microsoft实现抽象。

选择是OpenGL或发明一个新层,各种原因导致后者。

Vista +可以将OpenGL转换为DirectX,相反Wine可以将DirectX转换为OpenGL。

答案 3 :(得分:2)

不,两种语言都通过卡制造商编写的驱动程序直接与显卡硬件通信,因此两者都提供相同级别的硬件访问。

Windows直接支持DirectX,它是显示效果所需的操作系统的一部分 - 它们对OpenGL的支持相当有限,它们只支持v1.1(我们现在使用的是版本4)所以要做任何有用的事情你需要使用一些额外的扩展(如glew)或显卡制造商OpenGL SDK。

在能力方面。 DirectX由MSFT精心控制 - 因此所有DirectX系统都应该具有相同的行为。 OpenGL允许显卡制造商添加他们自己的扩展,因此他们可以通过向硬件添加特定功能来产生更高的性能(至少在理论上)。 OpenGL也是跨平台的,因此您的Windows OpenGL代码将在任何地方(理论上)运行

在实践中,Windows上唯一没有完全无用的OpenGL驱动程序是NVidia - 因此Windows上的高性能OpenGl应用程序非常需要NVidia卡。这意味着在Windows上编写OpenGL很容易 - 您只需坚持使用NVidias文档。