移动端图形标准中,目前 OpenGL ES 仍然是比较通用的标准(Vulkan 则是新一代),这里新开一个系列用于记录学习 OpenGL ES 的历程,以便查阅理解。

OverView

OpenGL ES

OpenGL ES 是移动设备中主流图形API,由Khronos 组织创立。其支持平台包括 iOS、Android、BlackBerry、bada、Linux和Windows,同时,它还是浏览器中 3D 图形 WebGL 标准的基础。

目前,Khronos 已经发布了一下几个版本:

  • OpenGL ES 1.0 and 1.1: 固定功能管线
  • OpenGL ES 2.0: 可编程图形管线
  • OpenGL ES 3.0: 图形革命性更新
  • OpenGL ES 3.1: 引入图形计算
  • OpenGL ES 3.2: 进一步完善功能

下面我们来看一下 OpenGL ES 3.0 的图形管线:

后续部分则会围绕Pipeline的各个部分展开,首先我们顺着Pipeline 走一遍:

  • 顶点缓冲区/数组对象

    用于存放顶点信息及变换矩阵等输入变量

  • 顶点着色器

    顶点信息处理,如通过矩阵变换顶点位置、计算照明公式来生成逐顶点颜色以及生成或变换纹理坐标等顶点操作,此外,还可通过着色器代码执行自定义计算等操作。

  • 图元装配

    顶点着色器下一阶段,图元(Primitive)作为 OpenGL ES 中基本图形单元,是三角形、直线或者点精灵等简单几何对象,图元的每个顶点都会被发送到顶点着色器的不同copy。对于每个图元,在进行下一阶段前会根据视锥体范围进行裁剪,视锥体范围内的图元会被传送到下一光栅化阶段。

  • 光栅化

    光栅化是讲图元转化为一组二维片段的过程,在此阶段之前,图元处于三维坐标系中,光栅化则将处于视锥体的部分二维化到屏幕坐标系中的一组组片段。然后,将这些片段交由片段着色器进行处理。每个片段的输出包括屏幕坐标(x, y)、颜色等属性以及纹理坐标等。

  • 片段着色器

    片段着色器将光栅化后的片段进行处理,并抛弃片段或者生成一个或者多个颜色值作为输出。 出了渲染到多重渲染目标之外,片段着色器只输出一个颜色吃。其输入信息为光栅化阶段生成的颜色、深度、模板和屏幕坐标(x, y)。

  • 逐片段操作

    逐片段操作阶段,对每个片段执行如下功能:

    • 像素归属测试 – 确定帧缓冲区位置 (x, y) 的像素是否归 OpenGL ES 所有,即是否属于当前 OpenGL ES 上下文。
    • 裁剪测试 – 确定 (x, y) 是否处于裁剪矩形范围内,若否,则被抛弃。
    • 模板和深度测试 – 在片段的模板和深度值上测试,以确定片段是否应该丢弃。
    • 混合 – 将新生成的片段颜色值于保存在帧缓冲区 (x, y) 位置的颜色组合起来(雾化、透明效果等)。
    • 抖动 – 图像算法,用于最小化因帧缓冲区颜色值精度有限而产生的伪像。
  • 帧缓冲区

    用于显示生成的图像的缓冲区,通常系统中存在多个帧缓冲区以达到更好的显示效果。

EGL

OpenGL ES 进行渲 大专栏  OpenGL ES 学习笔记 - Overview - 小旋的博客染所需要的上下文以及绘制表面等在 OpenGL ES 中并没有定义,这部分内容,Khronos 指定了另外一套 API 标准,即 EGL 来作为 渲染API(如OpenGL ES)和原生窗口系统之间的接口;虽然 OpenGL ES 并没有对 EGL 提供的硬性要求,但在跟系统的交互中,大多采用 EGL 作为系统接口。 目前,唯一支持 OpenGL ES 而不支持 EGL 的平台是iOS.

使用 OpenGL ES 进行渲染,需 EGL 提供以下服务:

  • 查询并初始化可用显示器(Display)
  • 创建渲染表面(Surface)
  • 创建渲染上下文(Context)

API 命令语法

OpenGL ES

OpenGL ES 命令以 gl 前缀开始,API 命名采用首字母大写的小驼峰式命名规则(例如 glGetError)。数据类型规则类似,以 GL 开头。

此外,参数也可带有类型标识以指定参数类型,下面是 OpenGL ES 参数类型的例子:

glUniform2f(location, 1.0f, 0.0f); // float arg2 and arg3
glUniform2f(location, 1, 0); // int arg2 and arg3
后缀 数据类型 C 语言类型 GL 类型
b 8 位整型 signed char GLbyte
ub 8 位无符号整型 unsigned char GLubyte, GLboolean
s 16 位整型 short GLshort
us 16 位无符号整型 unsigned short GLushort
i 32 位整型 int Glint
ui 32 位无符号整型 unsigned int GLuint, GLbitfield, GLenum
x 16.16 定点数 int GLfixed
f 32 位浮点数 float GLfloat, GLclampf
i64 64 位整型 khronos_int64_t (取决于平台) GLint64
ui64 64 位无符号整型 khronos_int64_t(取决于平台) GLuint64
  用于指针类型 void GLvoid

EGL

EGL 命令都以 egl 前缀开头、API 命名采用首字母大写的小驼峰式命名规则(例如 eglCreateContext)。类似地,EGL 数据类型也以 EGL 前缀开头,类型名命名采用首字母大写的方式来命名(EGLint 和 EGLenum 除外)。

数据类型 C 语言类型 EGL 类型
32 位整数 int EGLint
32 位无符号整数 unsigned int EGLBoolean、EGLenum
指针 void* EGLConfig、EGLContext、EGLDisplay、EGLSurface、EGLClientBuffer

好了,概览就到此为止,后续部分等学习相关章节后继续。

Reference:
《OpenGL ES 3.0 编程指南》


OpenGL ES 学习笔记 - Overview - 小旋的博客的更多相关文章

  1. OpenGL ES学习笔记(三)——纹理

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <OpenGL ES学习笔记( ...

  2. ibatis 学习笔记 3 - pfpfpfpfpf的专栏 - 博客频道 - CSDN.NET

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  3. OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...

  4. OpenGL ES学习笔记(一)——基本用法、绘制流程与着色器编译

    首先声明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. 在Android.iOS等移动平台上 ...

  5. Python入门学习笔记4:他人的博客及他人的学习思路

    看其他人的学习笔记,可以保证自己不走弯路.并且一举两得,即学知识又学方法! 廖雪峰:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958 ...

  6. jquery Select2 学习笔记之中文提示 - CSDN博客

    首先学习这个东西呢,还是看官网比较全面 select2官网例子 要select2中文显示:必须要引入中文包,且一定要放在select2.js之后 [javascript] view plain cop ...

  7. canvas学习笔记、小函数整理

    http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...

  8. Android应用开发-小巫CSDN博客clientJsoup篇

    Android应用开发-小巫CSDN博客clientJsoup篇 距上一篇博客已经过去了两个星期,小巫也认为很抱歉,由于在忙着做另外一个项目,差点儿抽不出空来,这不小巫会把剩下的博文全部在国庆补上.本 ...

  9. 想学习找不到好的博客?看这里>>

    想学习找不到好的博客?看这里>> (ps:内容 + 作者) 基础数论知识整理--gyh 进阶数论知识整理--又是gyh 关于SPFA--lyj(终于不是gyh) 证明二次探测定理-Line ...

随机推荐

  1. \_\_slots\_\_

    __slots__ 一.什么是__slots__ __slots__是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性) 使用点来访问属性本质就是 ...

  2. grub.cfg文件编辑

    grub2启动项里面找不到Windows的情况,这时候就需要自己去配置grub.cfg 在grub.cfg中加入如下代码: menuentry 'Windows Boot Manager (on /d ...

  3. Mac环境下 Python3安装及配置

    1.mac 环境下安装 python3 .查看 mac 自带系统版本 #查看系统自带的python open /System/Library/Frameworks/Python.framework/V ...

  4. [ZJOI2019]Minimax搜索(线段树+动态DP+树剖)

    为什么我怎么看都只会10pts?再看还是只会50~70?只会O(n2(R-L+1))/O(nlogn(R-L+1))……一眼看动态DP可还是不会做…… 根节点的答案是叶子传上来的,所以对于L=R的数据 ...

  5. vue项目打包部署elementUI的字体图标丢失问题

    自己搭建的Vue项目,没有使用vue-cli,引入elementUI时,使用的是webpack直接打包工具,发现字体图标丢失你 记录一下解决办法: webpack module配置:(build目录下 ...

  6. python,PyAutoGUI,设置鼠标键盘自动操作

    三个文件需在同一个文件夹下面,文件夹的位置无要求. 1.第一个文件,trial.py.python代码调用PyAutoGUI操作鼠标键盘,可以通过修改start_time和end_time来确定程序自 ...

  7. [LC] 350. Intersection of Two Arrays II

    Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...

  8. 主效应|处理误差 |组间误差|处理效应|随机误差|组内误差|误差|效应分析|方差齐性检验|SSE|SSA|SST|MSE|MSA|F检验|关系系数|完全随机化设计|区组设计|析因分析

    8 什么是只考虑主效应的方差分析? 就是不考虑交互效应的方差分析,即认为因素之间是不相互影响的,就是无重复的方差分析.   什么是处理误差 (treatment error).组间误差(between ...

  9. listening-conversation|信息简写|Generally|回答|矛盾

    听力可以刷分,但是要求高.听力流程是听.笔记.读题和确定答案,不能回看.Conversation快速且不完整.素材内容主要是生命科学,社科(人类学:考古学),艺术,自然科学(地质). 难点分析: 词汇 ...

  10. replace|同时替换

    a= 'eeekkksksksk' print a.replace('e','s').replace('s','k') #kkkkkkkkkkkk change={"e":&quo ...