一文了解 OpenGL ES

OpenGL ES是一种专为嵌入式和移动设备设计的3D图形API,简化了OpenGL以降低功耗。从1.x的固定渲染管线到2.x引入的可编程渲染管线,性能显著提升。在Android系统中,自API 4开始支持OpenGL ES 1.x,后续版本逐步引入对2.0、3.0、3.1、3.2的支持。本文探讨了OpenGL ES与OpenGL的关系、Android支持情况及基本渲染流程。
摘要由CSDN通过智能技术生成

OpenGL ES(OpenGL for Embedded Systems) 是一种免费的跨平台3D图形 API接口,其适用于低功耗设备,可用于嵌入式设备和移动设备(包括手机、车载大屏 和嵌入式电器终端设备)上渲染高效的 2D 、 3D 图形。
其由OpenGL(Open Graphics Library)针对嵌入式设备裁剪而来,去除了OpenGL中许多不是必须冗余特性,比如:GL_QUADS(四边形)、GL_POLYGONS(多边形)绘制模式、glBegin(开始)/glEnd(结束)等特性。

OpenGL ES API接口由 Khronos 组织定义并推广(Khronos 是一个图形软硬件行业协会,致力于为这些 API 建立免费的开发标准),对于OpenGL ES Khronos的官方的描述如下:
OpenGL® ES is a royalty-free, cross-platform API for rendering advanced 2D and 3D graphics on embedded and mobile systems - including consoles, phones, appliances and vehicles. It consists of a well-defined subset of desktop OpenGL suitable for low-power devices, and provides a flexible and powerful interface between software and graphics acceleration hardware.

经过多年的发展,目前OpenGL ES主要分为以下几个主要的版本:。

  • 采用固定渲染管线的 OpenGL ES 1.x (主要包括1.0与1.1):
    固定渲染管线,可以由硬件GPU支持或由软件模拟GPU进行图形渲染,其渲染能力有限。特别是在不包含GPU的终端设备上,由软件模拟GPU进行图形渲染,其渲染性能也较弱(早期的Android设备「2010年以前的Android设备」,部分设备中是不包含GPU硬件的,其图形渲染工作由软件模拟经CPU计算来完成)。
  • 采用可编程渲染管线OpenGL ES 2.x、3.x:
    从OpenGL ES 2.0开始,OpenGL ES引入了可编程渲染管线,渲染能力得到了很大的提升(同时可编程渲染管线,也对终端硬件设备提出了要求,终端硬件设备中必须有相应的GPU硬件单元)。
    OpenGL ES 3.0向后兼容OpenGL 2.0,也就是说 为OpenGL 2.0编写的应用程序在OpenGL ES 3.0中可以继续运行。

一、OpenGL ES与OpenGL对应关系

OpenGL ES由OpenGL裁剪而来,因此有必要了解一下两者的对应关系。关于OpenGL ES与OpenGL的各版本的对应关系,我做了如下表格。

OpenGL ES VersionOpenGL Version
OpenGL ES 1.0OpenGL 1.3
OpenGL ES 1.1OpenGL 1.5
OpenGL ES 2.0OpenGL 2.0
OpenGL ES 3.0OpenGL 3.3
OpenGL ES 3.xOpenGL 4.x
  • OpenGL ES 1.0 与 OpenGL ES 1.1(合称OpenGL ES 1.x)分别从OpenGL 1.3与OpenGL 1.5规范衍生而来。
    OpenGL ES 1.x采用固定渲染管线,渲染能力有限。
  • OpenGL ES 2.0 从 OpenGL 2.0 规范衍生而来。
    OpenGL ES 2.0开始采用可编程渲染管线,其渲染能力大大提高。
  • OpenGL ES 3.0 从 OpenGL 3.3 规范衍生而来。
    OpenGL ES 3.x 规范同样采用的可编程渲染管线,同时引入了阴影贴图、体渲染、基于GPU的粒子动画、纹理压缩、变化反馈等重要功能。
  • OpenGL ES 3.x 基于 OpenGL 4.x 规范衍生而来。
    OpenGL ES 3.x 向下兼容 OpenGL ES 3.0/2.0 规范。

二、Android中OpenGL ES的支持

目前khronos官方网站中,最新的OpenGL ES版本为 OpenGL ES3.2。而移动操作系统Android早在Android 7.0(API 24)已经完成OpenGL ES 3.2相关API的支持。

Khronos目前已经发布的OpenGL ES版本如下:
已发布的OpenGL ES版本

Android各版本对OpenGL ES的支持情况,我做了如下表格,供大家参考:

OpenGL ES VersionAndroid 引入版本引入大致时间
OpenGL ES 1.xAndroid 1.6(API 4)2009.09
OpenGL ES 2.0Android 2.2.3(API 8)2011.09
OpenGL ES 3.0Android 4.4(API 19)2013.10
OpenGL ES 3.1Android 5.0(API 21)2014.09
OpenGL ES 3.2Android 7.0(API 24)2016.17
  • Android 早在Android 1.6(API 4)已经支持OpenGL ES 1.x;
    Android 1.6(API 4)引入了OpenGL ES 1.x的API
  • Android 在Android 2.2.3(API 8)引入OpenGL ES 2.0支持;
    Android 2.2.3(API 8)引入了OpenGL ES 2.0的API
  • Android 在Android 4.4(API 19)引入了OpenGL ES 3.0支持;
    Android 4.4(API 19)引入了OpenGL ES 3.0的API
  • Android 在Android 5.0(API 21)引入了OpenGL ES 3.1支持;
    Android 在Android 5.0(API 21)引入了OpenGL ES 3.1API
  • Android 7.0(API 24)引入了OpenGL ES 3.2支持;
    Android 7.0(API 24)引入了OpenGL ES 3.2的API

三、OpenGL ES渲染初探

OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成
如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成。而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x、y、z 三个坐标分量来定义。
左侧为三维空间中的圆锥体,右侧为圆锥在三维空间中的构成方式
对于我们日常使用的移动手持设备,手机屏幕窗口由不连续的有限的二维像素小格子构成的,每一个像素格子有x、y两个分量来定义。

因此在OpenGL ES绘制流程中,其主要工作是将三维空间中的坐标点(x,y,z)构成的三维图形,转化为手机屏幕上的二维像素点
这个转化过程主要分为两个步骤:

  • 一个是顶点的变换;
    三维空间中的实体,经过各种变换(主要是通过矩阵相乘进行坐标系的变换),变为可投影在二维平面上的有限的像素点数据;
  • 二是渲染着色;
    根据传入的顶点颜色数据或图片纹理数据,将相应的颜色对应到响应的像素点。

在OpenGL ES中,其大概的绘制流程如下图所示:
OpenGL ES中 三角形的大概绘制流程

  • 数据分组
    这一阶段是OpenGL ES中数据基本处理阶段,对三维空间中物体的顶点坐标顶点对应的颜色数据进行一个基本处理,并且指定三维实体的绘制方式为三角形绘制。
  • 组装三角形
    这一阶段按上一步指定的绘制方式,将三维顶点数据组装成一个三角形实体图元。
  • 剪裁
    可以理解为将位于视野外的三角形部分排除掉,类似于人眼视角意外的部分排除掉,从而减少不比较的渲染绘制工作。经过剪裁后的三角形,可能会增加顶点数据。
  • 光栅化
    光栅化是将三维空间的三角形图形,栅格化为手机二维屏幕上的一个个像素点。将由三维顶点信息组成的三角形图元栅格化为由许多像素点构成的二维图像
  • 着色
    根据传入的顶点颜色数据或图片纹理数据,将相应的颜色对应到响应的像素点。
  • 颜色混合
    如若存在多个三维实体,每个三维实体的颜色各有不同,其重叠部分的颜色是两个或者多个颜色叠加而成。

注:
*对于以上OpenGL ES的绘制流程,这里仅是做一个初步的介绍。详细了解OpenGL ES绘制流程,可查看 *《一文读懂OpenGL ES 2.x 渲染流程》:
https://xiaxl.blog.csdn.net/article/details/119960657

三、参考

《OpenGL ES 3.0编程指南》
《OpenGL ES 3.x游戏开发》

khronos:
https://www.khronos.org

维基百科 OpenGL:
https://zh.wikipedia.org/wiki/OpenGL

learnopengl:
https://learnopengl-cn.github.io/01%20Getting%20started/01%20OpenGL/

gl_pipeline:
http://www.songho.ca/opengl/gl_pipeline.html

= THE END =

欢迎关注我的公众号

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.0(和1.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
发出的红包

打赏作者

bjxiaxueliang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值