【问题标题】:On Windows, how does OpenGL differ from DirectX?在 Windows 上,OpenGL 与 DirectX 有何不同?
【发布时间】:2021-08-08 16:15:56
【问题描述】:

我没有任何图形编程方面的实践经验。当我阅读图形编程时,我有这个疑问。

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

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

难道不是说在 Windows 上 OpenGL 真的是 DirectX 吗?

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

【问题讨论】:

    标签: windows opengl directx


    【解决方案1】:

    据我了解,由于 Windows 没有像直接硬件访问那样提供 DOS,因此创建了 Direct X。

    你说得对,Windows 没有像直接硬件访问那样提供 DOS。事实上,没有任何操作系统具有内存保护功能。

    是的,DirectX 的创建是为了提供 a API 以加速访问某些类型的硬件。 DirectX 是用于加速硬件访问的一个 API,而不是THE(一个且唯一的)一个。

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

    错了,因为没有人阻止你实施另一个轨道来加速硬件访问。负责引导访问硬件的软件称为驱动程序。驱动程序以特权模式运行,这意味着地址空间保护不适用于它们。也就是说,因为驱动程序必须能够与硬件通信。

    驱动程序通过 API 与常规程序进行通信,即所谓的 用户空间。 API 可能是标准化的,然后可能是严格指定的,或者它们可能是完全专有的。

    DirectX 是一个指定的 API,规范是由微软编写的。

    OpenGL 以类似的方式是一种 API,但它不是由单个实体指定,而是以某种形式在多个贡献者的协作下标准化。

    专有 API 的一个例子是 3Dfx 的 Glide,它在很大程度上受到了 OpenGL 的启发。事实上,有一个名为“minigl”的兼容性包装器实现了半条命 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 用于提供准确的答案以及其他不一定不正确但不完整的答案。
    • @Goz:实际上 HL1 使用了经过大量修改的 Quake-1 引擎版本。主要变化包括从索引颜色切换到 RGB 颜色模式以支持动态照明、通过单个地图支持具有不同调色板引用的多个 WAD 纹理容器、声音系统的全面检修、新的 AI 系统(与声音和照明系统集成- 进入一个有蟑螂的黑暗房间并打开灯,蟑螂会躲在黑暗的角落里)和一个关键帧插值角色动画系统,可以作用于单个身体部位。
    • 这是否意味着安装了 DirectX 驱动程序后,我可以在没有明确支持 OpenGL 的 GPU 驱动程序的情况下调用 OpenGL 函数?
    • @TurkhanBadalov:不。这意味着您可以进行 DirectX 调用。为了支持 OpenGL,驱动程序当然必须附带 OpenGL 实现。然而,关于 API(即 DirectX、OpenGL、Vulkan、Metal 等)的话题,它总是归结为软件。硬件本身与 API 无关。
    【解决方案2】:

    DirectX 是使用显卡硬件功能的层。由于 Windows Vista,默认的 OpenGL 实现(微软提供的那个)使用 DirectX,所以 OpenGL 真的很慢。

    但是显卡厂商提供OpenGL驱动,直接使用显卡,不经过DirectX;性能应该是一样的。如果你的集成显卡驱动不好,OpenGL 可能会使用 DirectX。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • "GLEW" 不是 OpenGL 扩展。它是一个库,可以更轻松地使用 GPU 制造商提供的 OpenGL 扩展。最后一段完全有偏见,也是胡扯。
      • GLEW 不是 openGL ARB_EXT 扩展,而是对 windows 上 openGL 功能的扩展。 ps 只需尝试在英特尔嵌入式图形芯片组上运行任何复杂的 OpenGL 程序
      【解决方案4】:

      问题更多的是有直接的硬件访问,没有方便的抽象层。软件供应商不希望将所有时间都花在为每张新卡编写支持上,因此他们推动 Microsoft 实施抽象。

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

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

      【讨论】:

      • 第一句话没看懂。通过 16 位仿真模式如何访问?
      • @Ken DirectX 出现在 Windows 95 中,即内存保护有限时。你经常有小型驱动程序,例如MiniGLX
      猜你喜欢
      • 2017-07-12
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      相关资源
      最近更新 更多