【问题标题】:Why do many mobile GPUs support OpenGL ES, but not OpenGL? [closed]为什么很多移动 GPU 支持 OpenGL ES,但不支持 OpenGL? [关闭]
【发布时间】:2016-11-11 13:13:18
【问题描述】:

例如,在整个 ARM Mali 系列中,许多 GPU 支持 OpenGL ES 3+、Direct3D 9+(有些支持高达 11/12),有些支持 Vulkan,但没有一个支持 OpenGL,甚至更新版本的不推荐使用固定管道的 OpenGL。与 Adreno 相同。

是硬件无法支持完整的 GL(如果是,为什么?),还是驱动程序开发人员没有实现它?

【问题讨论】:

  • 因为 OpenGL ES 是为这些设备制造的
  • "已弃用固定管道" 已删除,未弃用。

标签: android opengl opengl-es gpu


【解决方案1】:

因为 OpenGL ES 正是针对“嵌入式”硬件而创建的。

另一方面,将 OpenGL ES 创建为一个单独的标准,而不仅仅是 OpenGL 的“子集”(如果您愿意,今天我们将其称为“配置文件”)的想法非常、非常、非常,非常,非常,非常,非常,非常,非常糟糕的主意。

您在这里面临的主要含义是,为了实现除 OpenGL ES 之外的 OpenGL 支持,供应商需要开发另一个相似但略有不同的 GL 库。这意味着额外的开发工作、测试和认证。因此,对他们来说,将这项工作推给开发人员并要求他们创建不同的渲染器,针对桌面上的 OpenGL 和嵌入式上的 OpenGL ES,要容易得多。

(幸运的是,如果你有 OpenGL,GL_ARB_ESx_compatibility 扩展以某种方式“简化”了这个混乱,它允许你拥有一些 OpenGL ES 数据类型/调用/功能,所以你可以重用更多代码.)

除此之外,您是对的——如果硬件支持 Vulkan,那么它将支持 OpenGL 4.5 / DX12。粗略地说,这条线的每一条都针对不同的硬件一代:

  • OpenGL 2.1 (+ FBO) | OpenGL ES 2 | Direct3D 9
  • OpenGL 3.3 | OpenGL ES 3.0/3.1 | Direct3D 10
  • OpenGL 4 | OpenGL ES 3.2 | Direct3D 11

加上一条看起来像“OpenGL 4.5 | Vulkan | Direct3D 12”的行。

(是的,OpenGL ES 版本号甚至没有意义,并且与 OpenGL 的版本号不匹配,我假设这样供应商就不必害怕跳过主要版本号,而是将它们视为“增量”更改,尽管 ES 3.2 比 3.0 需要更多的硅)

在实践中,魔鬼在细节中,所以你有 f.i.曲面细分在 OpenGL ES 3.2 但在 OpenGL 4.0 中,但计算着色器已经在 OpenGL ES 3.1 中,但在 OpenGL 中是后来引入的 - 4.3 - 以及其他级别的这种疯狂。

【讨论】:

  • "如果硬件支持 Vulkan,那么它将支持 OpenGL 4.5 / DX12。" 以下是 Vulkan 不要求 GL 4.5 执行的部分列表:原子计数器,变换反馈,通过动态统一索引索引界面块,通过动态统一索引索引不透明类型的数组,几何着色器,镶嵌着色器。我可以继续前进,但我的观点很明确。支持所有 Vulkan 可选部分的Vulkan 实现可能相当于4.5(TF 和计数器除外)。但是 Vulkan 使许多 GL 4.5 强制执行的事情成为可选的。
  • 啊,所以本质上,硬件能够支持 OpenGL,但是 ROI 太低,厂商懒得理会。​​span>
  • 另外,您的“粗略”硬件等效项无效。 Microsoft 有效地控制了台式机上的 IHV 市场,因此每一“代”主要基于 Microsoft 在所有 IHV 之间协商的功能。在移动领域,硬件世代从未像 ES 那样严格执行。
  • @NicolBolas:所以 Vulkan 唯一有效地需要的是命令缓冲区(在 ~GL4 中引入的一个概念)和一个基本上是 GL2 / GLES2 的管道?这只是理论上的事情还是在实践中存在这样的硬件(到目前为止,我所看到的一切实际上都是 GLES3.2/GL4.5)。关于对市场的控制:肯定微软做了当时最方便的事情,但这并不能说明这个比喻不成立(?)
  • @peppe:“命令缓冲区(~GL4 中引入的概念)”OpenGL 从来没有命令缓冲区。您会得到最接近的是 NV_command_list,它是一个专有扩展。 “基本上是 GL2 / GLES2 的管道”如果您忽略计算着色器、图像加载/存储、SSBO、输入附件、图像视图、数组纹理和整个渲染通道系统,那么可以, Vulkan 与 ES 2.0 基本相同。
【解决方案2】:

在桌面 OpenGL 抛弃 GL 3.1 的固定功能废话之前,IHV 实施它是不合理的。即使在这之后,还有一个更大的问题:他们无法处理。

例如,GL 3.1 需要对统一缓冲区对象的支持。那是在 2009 年初。在 2014 年的 ES 3.0 之前,没有任何版本的 ES 提供这样的东西;那时,桌面 GL 是 4.5 版。

您必须了解的是,移动和桌面硬件的发展速度和时间不同。 OpenGL 的版本旨在展示那个时代桌面 GPU 上可用的硬件功能。同样,OpenGL ES 版本暴露了那个时代移动硬件可以做的一些常见子集。 ES 2.0 的长期主导地位主要是因为对于主要硬件提供商实际支持的内容缺乏共识。

因此,每个 API 都旨在在一组特定的硬件上实现,因此对超出该关注领域的硬件需求视而不见。直到最近,任何移动 GPU 都可以支持桌面 GL 版本的所有功能。即便如此,它们仍然以非常不同的方式进化。

例如,GL 3.2 需要对几何着色器的支持。那是在 2009 年。直到 2015 年 ES 3.2 发布,OpenGL ES 才看到该功能成为一个要求。不仅如此,镶嵌着色器(以及更多功能)成为 ES 3.2 的核心,它在桌面 GL 中为 4.0。

相比之下,ES 3.1 需要计算着色器和图像加载/存储功能。这些仅分别在 4.3 和 4.2 的桌面 GL 中出现。

这意味着如果仅限于 ES 3.1 功能的移动硬件想要通过桌面 GL 公开其硬件......他们怎么能做到呢?他们不能使用任何桌面 GL 版本 3.2 或更高版本,因为那些需要 GS 而他们的 GPU 没有这些。但他们的 GPU 可以处理计算着色器和图像加载/存储,这只是更高 GL 版本中的核心。

它们将仅限于桌面 GL 3.1 + 扩展。

为了满足其特定平台的需求,这两个 API 发生了分歧。它们各自的硬件进化路线最近才开始融合为一个合理的公共子集。

这就是为什么现在我们发现两个 API 都被替换了(并且被设计为可以通过使用特性在两组硬件上运行的 API)为什么要打扰把精力花在很快就会变得无关紧要的事情上?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多