• 一文了解 OpenGL ES


    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 Version OpenGL Version
    OpenGL ES 1.0 OpenGL 1.3
    OpenGL ES 1.1 OpenGL 1.5
    OpenGL ES 2.0 OpenGL 2.0
    OpenGL ES 3.0 OpenGL 3.3
    OpenGL ES 3.x OpenGL 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 Version Android 引入版本 引入大致时间
    OpenGL ES 1.x Android 1.6(API 4) 2009.09
    OpenGL ES 2.0 Android 2.2.3(API 8) 2011.09
    OpenGL ES 3.0 Android 4.4(API 19) 2013.10
    OpenGL ES 3.1 Android 5.0(API 21) 2014.09
    OpenGL ES 3.2 Android 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 =

    欢迎关注我的公众号

  • 相关阅读:
    作业七随笔。。
    Jquery 图片走马灯效果原理
    参与招聘面试工作之简历与仪容篇
    无聊系列 C#中一些常用类型与java的类型对应关系
    关于ASP.NET MVC 中JsonResult返回的日期值问题
    最近参与招聘面试的工作总结
    Unix时间戳转日期时间格式,C#、Java、Python各语言实现!
    MVC 拦截器
    Python参考书籍(转载)
    PEP 8风格指南(转载)
  • 原文地址:https://www.cnblogs.com/xiaxveliang/p/15568827.html
Copyright © 2020-2023  润新知