录制直播与虚拟现实的渲染,OpenGLES摄像渲染框架应用

那是一篇OpenGL ES的学习笔记,介绍图像绘制里面用到的概念,学习OpenGL
ES的基础知识备忘录。

渲染

教程

OpenGLES入门教程1-Tutorial01-GLKit
OpenGLES入门教程2-Tutorial02-shader入门
OpenGLES入门教程3-Tutorial03-三维变换
OpenGLES入门教程4-Tutorial04-GLKit进阶
OpenGLES进阶教程1-Tutorial05-地球月亮
OpenGLES进阶教程2-Tutorial06-光线
OpenGLES进阶教程3-Tutorial07-粒子效果
OpenGLES进阶教程4-Tutorial08-帧缓存

用3D数据变动三个2D图像的进程。

渲染

用3D数据变动3个2D图像的长河。

数据饥饿

数码饥饿

CPU擅长运算,读写内存较慢,当CPU的习性因为等待内部存款和储蓄器读写而处在次优状态时,那种次优状态就叫做数据饥饿。

CPU擅长运算,读写内存较慢,当CPU的特性因为等待内部存款和储蓄器读写而地处次优状态时,那种次优状态就叫做数据饥饿。

为缓存提供数据

① 、生成(Generate),为缓存生成独一无二的标识符。
② 、绑定(Bind),明确接下去运算使用的缓存。
③ 、缓存数据(Buffer
Data),为绑定的内部存款和储蓄器分配并出示充裕的内部存款和储蓄器,把CPU控制的内部存款和储蓄器数据复制到分配的内部存款和储蓄器。
④ 、启用恐怕禁止(Enable、Disable),鲜明在接下去的渲染是或不是选取缓存。
五 、设置指针(Set Pointer),分明缓存中多少的品类和数量的偏移值。
六 、绘图(Draw),绘制部分只怕全部场景。
⑦ 、删除(Delete),删除生产的缓存并且释放财富。

缓存的转移、初步化和删除,需求消耗费时间间来共同图形处理器和CPU。
GPU在剔除多个缓存在此以前务必等待缓存相关的运算甘休,要是频仍转移和删除缓存,GPU没有丰裕时间开始展览渲染。

为缓存提供数据

数据类型

OpenGL ES
坐标是以浮点数来储存,GPU对浮点运算做了特别的优化,尽管使用任何数据类型的巅峰也会被转换成浮点型。
图表处理器本质上便是普遍并行矢量处理器。

壹 、生成(Generate),为缓存生成独一无二的标识符。

帧缓存

吸收渲染结果的缓冲区叫做帧缓存。
有七个专门的帧缓存,前帧缓存和后帧缓存,控制着显示器像素的最终颜色。
OpenGL ES的上下文物保护存了OpenGL
ES的情景音讯,包涵用于渲染数据的缓存地址和收取渲染结果的缓存地址。

② 、绑定(Bind),分明接下去运算使用的缓存。

软件架构

每3个iOS原生控件都有二个对应的CoreAnimation层。
CoreAnimation合成器使用OpenGL
ES来狠命快速地操纵GPU、混合层和切换帧缓存。
OpenGL
ES会有连日到层,与层分享数据的帧缓存,至少包括三个像素颜色渲染缓存。

③ 、缓存数据(Buffer
Data),为绑定的内部存储器分配并出示充裕的内部存款和储蓄器,把CPU控制的内部存款和储蓄器数据复制到分配的内部存款和储蓄器。

OpenGL ES函数

  • EAGLContext:封装1个特定于有些平台的OpenGL ES上下文 实例。
    EAGL 可能是 Embedded Apple GL

  • PAJEROGBA颜色:红铁锈棕和折射率。(Red、格林、Blue、Alpha)

  • glBufferData方法中,GL_STATIC_DRAW告诉上下文,缓存中的内容符合复制到GPU控制的内部存款和储蓄器,因为很少对其展开改动;GL_DYNAMIC_DRAW则意味着数据会频仍修改,以不相同的艺术来拍卖。

  • 帧缓存或许有除了像素颜色渲染缓存之外的任何叠加缓存(比如说深度测试),他们能够经过在glClear()函数中制定差异的参数来祛除。

  • glVertextAttribPointer()第伍个参数表示小数点定位数据是不是能够被改动。

  • viewDidUnload在视图被卸载时候调用,能够在此删除OpenGL
    ES缓存。(和dealloc不一致)

  • CAEAGLLyaer是CoreAnimation提供的正统层类之一,与OpenGL
    ES的帧缓存共享它的像素颜色仓库。

  • context presentRenderbuffer:GL_RENDERBUFFE福特Explorer让上下文调整外观并行使CoreAnimation合成器把帧缓存的像素颜色渲染缓存与其它相关层混合起来。

  • glViewport()
    函数用来决定渲染至帧缓存的子集。(设置视口变换的视口大小)

  • 视图重新调整大小的时候,layoutSubviews会被调用。

  • CADisplayLink的音信为重复渲染四个场景提供了可观的触发器,渲染速度大于呈现刷新速度是荒废。

  • GLKBaseEffect会扭转直接在GPU上运转的GLSL。

肆 、启用或然禁止(Enable、Disable),鲜明在接下去的渲染是还是不是选取缓存。

纹理

二个用以保存图像颜色的OpenGL ES缓存。
渲染进度中的取样恐怕会导致纹理被拉伸、压缩、翻转等。

五 、设置指针(Set Pointer),显然缓存中多少的花色和数据的偏移值。

视口坐标

帧缓存中的像素地点叫做视口坐标。视口转换的结果是兼具绘制的几何图形都被拉伸以适应显示器尺寸。

⑥ 、绘图(Draw),绘制部分要么全部场景。

光栅化

转换几何样子数据为帧缓存中的颜色像素,叫做点阵化(rasterizing),也叫光栅化。
每种颜色像素叫做片元(fragment)。

七 、删除(Delete),删除生产的缓存并且释放能源。

纹理坐标系

纹理坐标系

  • glTexParameteri参数
    GL_TEXTURE_MIN_FILTESportage表示较多纹素对应较少片元
    GL_TEXTURE_MAG_FILFEPAJERO表示较多片元对应较少纹素
    GL_LINEA奥迪Q5 代表线性插值
    GL_NEAWranglerSET 表示就近选取

  • 当UV坐标超过ST坐标时候
    GL_TEXTURE_WRAP_S表示U坐标当先了S坐标
    GL_TEXTURE_WRAP_T表示V坐标超过了T坐标
    GL_REPEAT 重复纹理以填满UV区域
    GL_CLAMP_TO_EDGE 取样纹理边缘的纹素

缓存的变迁、初叶化和删除,须求消耗费时间间来一起图形处理器和CPU。

MIP贴图

高细节的纹路,沿着S、T轴存款和储蓄越来越多的纹素,减少GPU取样的多寡增加渲染品质,但会追加内部存款和储蓄器。

GPU在剔除2个缓存在此以前务必等待缓存相关的运算结束,借使反复变更和删除缓存,GPU没有丰盛时间展开渲染。

glTexImage2D

  • 第二个参数是GL_TEXTURE_2D
  • 其次个参数用于钦点MIP贴图的开始细节级别,若是没有选用MIP必须假若0
  • 其七个参数是点名纹理缓存每种纹素必要保留的音信数据,对于iOS设备,有GL_RGB和RL_RGBA
  • 第4 、七个参数内定图像的大幅和冲天,必须是2的幂
  • 第多少个 分明纹理纹素的界限大小,OpenGL ES中总是被安装为0
  • 第二个钦赐伊始化缓存所用的图像数据中的各类像素要保存的音讯,在OpenGL
    ES中与inernalFormat
  • 第陆个 纹素的位编码类型
  • 第7个 像素颜色数据的指针

数据类型

多重纹理

多重纹理可以免止多通道渲染导致的内部存款和储蓄器访问限制质量处境
self.baseEffect.texture2d1.envMode = GLKTextureEnvModeDecal;
能够打开多重纹理

OpenGL ES
坐标是以浮点数来存款和储蓄,GPU对浮点运算做了专门的优化,就算使用其他数据类型的顶峰也会被转换来浮点型。

光线

  • GPU首先为各种三角形的终极进行光线计算,再把结果开始展览插值,得出每种片元的终极颜色。
  • OpenGL ES的灯光模拟包蕴:环境光、漫反射光、镜面反射光。
  • 唯有各样光源的环境光部分才会照射到三角形的后面。

光明与几何图形互相成效的重中之重:总计出各种几何物体照射和疏散出来多少光线。通过计算各类三角形与光的取向的垂直角度。

  • 矢量积:右手腕则。
    VectorA × VectorB 的矢量积 和 B × A 是可行性相反的。
  • 光线计算正视于表面法向量。法向量也是单位向量。

在GLKBaseEffect的灯光开启后,灯光决定了渲染的颜色;常量的水彩和极端的水彩将被忽视。(constantColor属性仅适用于渲染单调不发光的实体)

  • 对此立体表面而言,法线是有方向的:一般的话,由立体的里边针对外部的是法线正方向,反过来的是法线负方向。
  • 缩放对灯光有潜在的熏陶:二个法向量被缩放后,就恐怕不再是二个单位向量。
    GLKit的GLKBaseEffect类生产的GLSL会按需正规法向量。

图片处理器本质上正是广大并行矢量处理器。

深度测试

  • 老是渲染一个片元,片元的深度(片元与视点之间的距离)被总括出来并与深度缓存中为片元地方保存的值举办自己检查自纠:选拔深度值更小(更类似视点)的片元来,替换在像素颜色渲染缓存中对应位置的颜色和纵深缓存的相应深度值。

  • 纵深缓存为GPU提供了3个存放总括出来深度值的缓存,并且用来决定像素颜色渲染缓存中片元的置换。
    GLKit别支部持18位和二十三人来保存深度值的纵深渲染缓存。

  • 纵深争论(Z-fighting),五个片元的深度十三分接近,深度缓存没有要是的进程来分别,最后的片元颜色平日在恐怕之间来回闪烁,创制一个凸现的干扰。

  • 不行使GLKit协理,管理1个OpenGL ES深度缓存要求的手续:
    壹 、Generate(生成)—— 生成独一无二的标识符
    ② 、Bind(绑定)—— 明确使用的缓存
    ③ 、Configure Storage (配置存储) —— 钦定大小
    肆 、 Attach(附加) —— 附加到1个帧缓存

与1个Core
Animation共享内存的像素颜色渲染缓存在层调整大小时会活动调整大小。其余缓存,例如深度缓存,不会自行调整大小
可以在layoutSubviews方法里面删除现存的深度缓存,并创造三个新的与像素颜色渲染缓存的新尺寸相匹配的深浅缓存。

帧缓存

变换

三个坐标系之间变换顶点坐标。

  • 主导转移
    七个着力转移
    平移(translation)
    旋转(rotation)
    缩放(scale)
    透视(perspective)

接受渲染结果的缓冲区叫做帧缓存。

投影变换

视锥体的近平面不可能用z地方小于0,就算是一点都不大的z的值也会有标题。
从近平面到远平面包车型大巴离开限制会炫耀为深度缓存中的深度范围,当GPU计算保存在深度缓存中的值时,大幅也许过小的近平面距离会时有产生数学舍入误差
OpenGL
ES使用3个誉为视域的几何图形来控制四个场景生成的片元是还是不是会突显在结尾的渲染结果中。
OpenGL ES暗许为指入显示器的负的Z坐标轴,GLKMatrixMakeFrustum()
产生四个指入显示屏的含有正的Z坐标轴的视域(view volume)。

有多个特其余帧缓存,前帧缓存和后帧缓存,控制着显示器像素的最终颜色。

OpenGL ES的上下文物保护存了OpenGL
ES的处境音讯,蕴含用于渲染数据的缓存地址和收受渲染结果的缓存地址。

软件架构

图片 1

每3个iOS原生控件都有3个相应的CoreAnimation层。

CoreAnimation合成器使用OpenGL
ES来狠命火速地控制GPU、混合层和切换帧缓存。

OpenGL
ES会有连日到层,与层分享数据的帧缓存,至少包蕴三个像素颜色渲染缓存。

OpenGL ES函数

EAGLContext:封装3个一定于有个别平台的OpenGL ES上下文 实例。

EAGL 可能是 Embedded Apple GL

EvoqueGBA颜色:红鲜红和折射率。(Red、格林、Blue、Alpha)

glBufferData方法中,GL_STATIC_DRAW告诉上下文,缓存中的内容符合复制到GPU控制的内部存款和储蓄器,因为很少对其开始展览修改;GL_DYNAMIC_DRAW则表示数据会频仍修改,以区别的法门来处理。

帧缓存大概有除了像素颜色渲染缓存之外的其它叠加缓存(比如说深度测试),他们可以通过在glClear()函数中制定分歧的参数来扫除。

glVertextAttribPointer()第多个参数表示小数点定位数据是还是不是足以被改变。

viewDidUnload在视图被卸载时候调用,能够在此删除OpenGL
ES缓存。(和dealloc不一致)

CAEAGLLyaer是CoreAnimation提供的专业层类之一,与OpenGL
ES的帧缓存共享它的像素颜色仓库。

context presentRenderbuffer:GL_RENDERBUFFE汉兰达让上下文调整外观并动用CoreAnimation合成器把帧缓存的像素颜色渲染缓存与别的有关层混合起来。

glViewport() 函数用来控制渲染至帧缓存的子集。(设置视口变换的视口大小)

视图重新调整大小的时候,layoutSubviews会被调用。

CADisplayLink的新闻为再次渲染3个现象提供了不错的触发器,渲染速度高于展现刷新速度是浪费。

GLKBaseEffect会生成直接在GPU上运营的GLSL。

纹理

多少个用以保存图像颜色的OpenGL ES缓存。

渲染进度中的取样恐怕会招致纹理被拉伸、压缩、翻转等。

视口坐标

帧缓存中的像素地方叫做视口坐标。视口转换的结果是有所绘制的几何图形都被拉伸以适应显示屏尺寸。

光栅化

转移几何样子数据为帧缓存中的颜色像素,叫做点阵化(rasterizing),也叫光栅化。

各个颜色像素叫做片元(fragment)。

纹理坐标系

图片 2

纹理坐标系

glTexParameteri参数

GL_TEXTURE_MIN_FILTERubicon表示较多纹素对应较少片元

GL_TEXTURE_MAG_FILFE大切诺基表示较多片元对应较少纹素

GL_LINEALX570 表示线性插值

GL_NEA福特ExplorerSET 表示就近选用

当UV坐标抢先ST坐标时候

GL_TEXTURE_WRAP_S表示U坐标超过了S坐标

GL_TEXTURE_WRAP_T表示V坐标超越了T坐标

GL_REPEAT 重复纹理以填满UV区域

GL_CLAMP_TO_EDGE 取样纹理边缘的纹素

MIP贴图

高细节的纹路,沿着S、T轴存储越多的纹素,收缩GPU取样的数据进步渲染质量,但会增多内部存储器。

glTexImage2D

先是个参数是GL_TEXTURE_2D

其次个参数用于钦点MIP贴图的发端细节级别,假若没有动用MIP必须假使0

其多个参数是内定纹理缓存各种纹素供给保留的音讯数量,对于iOS设备,有GL_RGB和RL_RGBA

第④ 、多个参数钦赐图像的宽度和可观,必须是2的幂

第5个 分明纹理纹素的界限大小,OpenGL ES中年老年是被安装为0

第⑤个 钦定初始化缓存所用的图像数据中的每一个像素要保存的音讯,在OpenGL
ES中与inernalFormat

第多个 纹素的位编码类型

第玖个 像素颜色数据的指针

多重纹理

多重纹理能够制止多通道渲染导致的内部存款和储蓄器访问限制品质意况

self.baseEffect.texture2d1.envMode =
GLKTextureEnvModeDecal;能够拉开多重纹理

光线

GPU首先为每一种三角形的终点举行光线总结,再把结果进行插值,得出各样片元的末段颜色。

OpenGL ES的灯光模拟包涵:环境光、漫反射光、镜面反射光。

唯有各类光源的环境光部分才会照射到三角形的后面。

光线与几何图形彼此功效的重点:总括出各类几何物体照射和疏散出来多少光线。通过测算每种三角形与光的可行性的垂直角度。

矢量积:右手腕则。

VectorA × VectorB 的矢量积 和 B × A 是趋势相反的。

光明总计重视于表面法向量。法向量也是单位向量。

在GLKBaseEffect的灯光开启后,灯光决定了渲染的颜色;常量的颜色和顶峰的水彩将被忽略。(constantColor属性仅适用于渲染单调不发光的物体)

对于立体表面而言,法线是有来头的:一般的话,由立体的内部针对外部的是法线正方向,反过来的是法线负方向。

缩放对灯光有私人住房的熏陶:三个法向量被缩放后,就恐怕不再是3个单位向量。

GLKit的GLKBaseEffect类生产的GLSL会按需正规法向量。

深度测试

老是渲染多少个片元,片元的深浅(片元与视点之间的偏离)被总括出来并与深度缓存中为片元地点保存的值举办自己检查自纠:选用深度值更小(更就好像视点)的片元来,替换在像素颜色渲染缓存中对应地方的颜色和纵深缓存的相应深度值。

深度缓存为GPU提供了贰个存放总结出来深度值的缓存,并且用来决定像素颜色渲染缓存中片元的调换。

GLKit别支部持1玖人和2三位来保存深度值的吃水渲染缓存。

纵深龃龉(Z-fighting),多个片元的深度非凡类似,深度缓存没有借使的速度来区分,最后的片元颜色平时在恐怕之间来回闪烁,创建3个凸现的搅和。

不利用GLKit援助,管理二个OpenGL ES深度缓存必要的手续:

壹 、Generate(生成)—— 生成独一无二的标识符

② 、Bind(绑定)—— 分明使用的缓存

三 、Configure Storage (配置存款和储蓄) —— 内定大小

肆 、 Attach(附加) —— 附加到三个帧缓存

与二个Core
Animation共享内部存款和储蓄器的像素颜色渲染缓存在层调整大时辰会自动调整大小。别的缓存,例如深度缓存,不会活动调整大小

能够在layoutSubviews方法里面删除现存的深浅缓存,并创设3个新的与像素颜色渲染缓存的新尺寸相匹配的深度缓存。

变换

两个坐标系之间转换顶点坐标。

骨干转移

八个着力转移

平移(translation)

旋转(rotation)

缩放(scale)

透视(perspective)

投影变换

视锥体的近平面不能够用z地点小于0,即便是不大的z的值也会非凡。

从近平面到远平面包车型的士离开限制会炫耀为深度缓存中的深度范围,当GPU计算保存在深度缓存中的值时,大幅或然过小的近平面距离会发出数学舍入误差

OpenGL
ES使用二个名叫视域的几何图形来决定1个现象生成的片元是还是不是会显得在最终的渲染结果中。

OpenGL ES默许为指入显示器的负的Z坐标轴,GLKMatrixMakeFrustum()
发生1个指入显示屏的蕴藏正的Z坐标轴的视域(view volume)。