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

本文概述了OpenGLES 3.0如何向后兼容OpenGLES 2.0,并揭示了OpenGLES 2.0与1.x不兼容的原因。讨论了固定功能管线与可编程管线的区别,以及OpenGLES工作组为何终止对1.x版本的支持。了解OpenGL ES版本升级的关键点和迁移挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

一、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 ES 3.0 英文版 第1章——OpenGL ES 3.0简介   第1章简单介绍OpenGL ES,概述了OpenGL ES 3.0图形管线,讨论了OpenGL ES 3.0的设计理念限制,最后介绍了OpenGL ES 3.0中使用的一些约定类型。   第2章——你好,三角形:一个OpenGL ES 3.0示例   第2章介绍绘制三角形的一个简单OpenGL ES 3.0示例。我们的目的是说明OpenGL ES 3.0程序的样子,向读者介绍一些API概念,并说明如何构建运行OpenGL ES 3.0示例程序。   第3章——EGL简介   第3章介绍EGL——为OpenGL ES 3.0创建表面渲染上下文的API。我们说明与原生窗口系统通信、选择配置创建EGL渲染上下文及表面的方法,传授足够多的EGL知识,你可以了解到启动OpenGL ES 3.0进行渲染所需的所有知识。   第4章——着色器程序   着色器对象程序对象是OpenGL ES 3.0中最基本的对象。第4章介绍创建着色器对象、编译着色器检查编译错误的方法。这一章还说明如何创建程序对象、将着色器对象连接到程序对象以及链接最终程序对象的方法。我们讨论如何查询程序对象的信息以及加载统一变量(uniform)的方法。此外,你将学习有关源着色器程序二进制代码之间的差别以及它们的使用方法。   第5章——OpenGL ES着色语言   第5章介绍编写着色器所需的着色语言的基础知识。这些着色语言基础知识包括变量类型、构造器、结构、数组、统一变量、统一变量块(uniform block)输入/输出变量。该章还描述着色语言的某些更细微的部分,例如精度限定符不变性。   第6章——顶点属性、顶点数组缓冲区对象   从第6章开始(到第11章为止),我们将详细介绍管线,教授设置编程图形管线各个部分的方法。这一旅程从介绍几何形状输入图形管线的方法开始,包含了对顶点属性、顶点数组缓冲区对象的讨论。   第7章——图元装配光栅化   在前一章讨论几何形状输入图形管线的方法之后,第7章将讨论几何形状如何装配成图元,介绍OpenGL ES 3.0中所有可用的图元类型,包括点精灵、直线、三角形、三角形条带三角扇形。此外,我们还说明了在顶点上进行坐标变换的方法,并简单介绍了OpenGL ES 3.0管线的光栅化阶段。   第8章——顶点着色器   我们所介绍的管线的下一部分是顶点着色器。第8章概述了顶点着色器如何融入管线以及OpenGL ES 着色语言中可用于顶点着色器的特殊变量,介绍了多个顶点着色器的示例,包括逐像素照明蒙皮(skinning)。我们还给出了用顶点着色器实现OpenGL ES 1.01.1)固定功能管线的示例。   第9章——纹理   第9章开始介绍片段着色器,描述OpenGL ES 3.0中所有可用的纹理功能。该章提供了创建纹理、加载纹理数据以及纹理渲染的细节,描述了纹理包装模式、纹理过滤、纹理格式、压缩纹理、采样器对象、不可变纹理、像素解包缓冲区对象Mip贴图。该章介绍了OpenGL ES 3.0支持的所有纹理类型:2D纹理、立方图、2D纹理数组3D纹理。   第10章——片段着色器   第9章的重点是如何在片段着色器中使用纹理,第10章介绍编写片段着色器所需知道的其他知识。该章概述了片段着色器所有可用的特殊内建变量,还演示了用片段着色器实现OpenGL ES 1.1中所有固定功能技术的方法。多重纹理、雾化、Alpha测试用户裁剪平面的例子都使用片段着色器实现。   第11章——片段操作   第11章讨论可以适用于整个帧缓冲区或者在OpenGL ES 3.0片段管线中执行片段着色器后适用于单个片段的操作。这些操作包括剪裁测试、模板测试、深度测试、多重采样、混合抖动。本章介绍OpenGL ES 3.0图形管线的最后阶段。   第12章——帧缓冲区对象   第12章讨论使用帧缓冲区对象渲染屏幕外表面。帧缓冲区对象有多种用法,最常见的是渲染到一个纹理。本章提供API帧缓冲区对象部分的完整概述。理解帧缓冲区对象对于实现许多高级特效(如反射、阴影贴图后处理)至关重要。   第13章——同步对象栅栏   第13章概述同步对象栅栏,它们是在OpenGL ES 3.0主机应用GPU执行中同步的有效图元。我们讨论同步对象栅栏的使用方法,并以一个示例作为结束。   第14章——OpenGL ES 3.0高级编程   第14章是核心章节,将本书介绍的许多主题串联在一起。我们已经选择了高级渲染技术的一个样本,并展示了实现这些功能的示例。该章包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节卷动

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值