我的OpenGL学习进阶之旅OpenGL ES 3.0和向后兼容性

Posted 欧阳鹏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的OpenGL学习进阶之旅OpenGL ES 3.0和向后兼容性相关的知识,希望对你有一定的参考价值。

一、OpenGL ES 3.0和向后兼容性

1.1 OpenGL ES 3.0 是向后兼容 OpenGL ES 2.0

OpenGL ES 3.0 是向后兼容 OpenGL ES 2.0 的。也就是说使用 2.0 编写的应用程序是可以在 3.0 中继续使用的。

后续版本的一些很小的修改可能会影响少数应用程序的向后兼容性。

  • 帧缓冲区对象不再在各个上下文之间共享,
  • 立方图总是使用无缝过滤,
  • 有符号定点数转换为符号数的方法也有小修改。

1.2 OpenGL ES 2.0 不能向后兼容OpenGL ES 1.x 。

OpenGL ES 3.0 是向后兼容 OpenGL ES 2.0 这一事实不同于OpenGL ES 2.0 和以前的OpenGL ES 版本之间的向后兼容性。

OpenGL ES 2.0 不能向后兼容OpenGL ES 1.x

  • OpenGL ES 2.0/3.0 不支持OpenGL ES 1.x 支持的固定功能管线
  • OpenGL ES 2.0/3.0 可编程定点着色器代替了OpenGL ES 1.x中实现的固定功能定点单元。固定功能定点单元实现了一个特殊的顶点转换和照明方程式,可以用它们变换顶点位置、变换或者生成纹理坐标、计算顶点颜色。
  • 相类似,可编程片段着色器替代了OpenGL ES 1.x中实现的固定功能纹理组合单元。固定功能纹理组合单元实现了每个纹理单元的纹理组合阶段。纹理颜色使用一组固定操作(如加、求模、减和点乘)与扩散颜色及前一个纹理组合阶段的输出组合。

1.3 不再提供OpenGL ES 2.0/3.0和OpenGL ES 1.x之间的向后兼容性

基于如下理由,OpenGL ES工作组决定不再提供OpenGL ES 2.0/3.0和OpenGL ES 1.x之间的向后兼容性:

  • 在OpenGL ES 2.0/3.0 中支持固定功能管线意味着该API将以不止一种方法实现相同功能,这违法了工作组采用的支持功能确定标准。 可编程管线使应用程序能够用着色器实现固定功能管线,所以向后兼容OpenGL ES 1.x没有具有说服力的理由。

  • ISV的反馈表明,大部分游戏并不混合使用可编程管线和固定功能管线。 也就是说,游戏要么使用固定功能管线,要么使用可编程管线。一旦有了可编程管线,就没有理由使用固定功能管线,因为可编程管线在可渲染特效上有更多的灵活性。

  • 如果OpenGL ES 2.0/3.0 必须同时支持固定功能管线和可编程管线,则其驱动程序的内存占用将会大得多。对于OpenGL ES所支持的设备,最小化内存占用是重要的设计原则。 将固定功能支持分隔到OpenGL ES 1.x API中,在OpenGL ES 2.0/3.0 API中放置可编程着色器支持,意味着不需要OpenGL ES 1.x支持的供应商不再需要包含该驱动程序。

  • OpenGL ES 1.x 固定功能管线 OpenGL Fixed Function Pipeline

  • OpenGL ES 2.0/3.0 可编程管线 Programmable PipleLine

  • OpenGL 和 OpenGL ES 关于 Fixed Pipline和Programmable Pipeline的时间轴

OpenGL ES 是完整 OpenGL 标准的子集,因此这两个 API 不直接兼容。下图显示了主要 OpenGL 版本和变体的关系。

OpenGL 1.0 具有固定的着色器和用于使用它们的固定功能 API。 OpenGL 2.0 添加了可编程着色器,但仍支持固定功能管道 API 以实现向后兼容性。

相比之下,OpenGL ES 1.1 基于 OpenGL 1.x,删除了一些 API 并添加了定点整数支持。 OpenGL ES 2.0 基于 OpenGL 2.0,删除了固定功能 API。

OpenGL 的所有版本和变体都不是直接兼容的,因此在将应用程序从一个变体移动到另一个变体时需要进行一定量的更改。下图总结了主要 OpenGL 版本的这些更改。

OpenGL 1.0 应用程序适用于 OpenGL 2.0,但反之则不然。 OpenGL 1.0 应用程序可以移植到 OpenGL ES 1.1,但如果它们使用某些已删除的 API,则需要进行更改。仅使用可编程着色器的 OpenGL 2.0 应用程序可以移植 OpenGL ES 2.0,但可能仍需要一些工作,例如,着色语言版本的差异。最后,将 OpenGL 1.0 或 OpenGL ES 1.1 应用程序移植到 OpenGL ES 2.0 需要重写,以使用可编程着色器替换固定功能 API 的使用。

大多数桌面 Linux OpenGL 应用程序是使用传统的 OpenGL 1.x 固定函数管道编写的(例如,使用 glBegin/glEnd 和矩阵堆栈)。 OpenGL 2.0 引入了可编程着色器,但它仍然支持传统的固定功能管道。由于在 OpenGL ES 2.0 中完全删除了固定功能管道,将应用程序从 OpenGL 2.0 移植到 OpenGL ES 可能需要对应用程序的图形代码进行重大重写。

以上是关于我的OpenGL学习进阶之旅OpenGL ES 3.0和向后兼容性的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅学习OpenGL ES 3.0 的实战 Awsome Demo (上)

我的OpenGL学习进阶之旅学习OpenGL ES 3.0 的实战 Awsome Demo (上)

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (上)

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (上)

我的OpenGL学习进阶之旅学习OpenGL ES 3.0 的实战 Awsome Demo (下)之 图片转场和轮播特效专场

我的OpenGL学习进阶之旅学习OpenGL ES 3.0 的实战 Awsome Demo (下)之 图片转场和轮播特效专场