OpenGL|OpenGL ES之旅(二)-- OpenGL ES 了解GLKit框架
在介绍GLKit框架之前,我们先来了解一下EGL的概念,以便于我们了解App的管理资源模型。
EGL
EGL(Embedded Graphics Library),由于OpenGL ES是基于C的API,因此它?常便携且受到?广泛?支持。作为C API,它与Objective-C Cocoa Touch应?用程序?无缝集成。OpenGL ES规范没有定义窗?口层;
相反,托管操作系统必须提供函数来创建?一个接受命令的OpenGL ES 渲染上下?文和?一个帧缓冲区,其中写入任何绘图命令的结果。在iOS上使?用OpenGL ES需要使?用iOS类来设置和呈现绘图表?面,并使?平台中立的API来呈现其内容。
GLKit 框架概述
- OpenGL ES 命令需要渲染上下?和绘制表?才能完成图形图像的绘制
- 渲染上下文: 存储相关OpenGL ES 状态
- 绘制表面: 是?用于绘制图元的表?,它指定渲染所需要的缓存区类型,例例如颜?缓存 区,深度缓冲区和模板缓存区.
- OpenGL ES API 并没有提供如何创建渲染上下?或者上下?如何连接到原生窗?系统. EGL 是Khronos 渲染API(如OpenGL ES) 和原?生窗?系统之间的接口. 唯??持 OpenGL ES 却不?持EGL 的平台是iOS. Apple 提供??的EGL API的iOS实现,称为EAGL
- 因为每个窗?系统都有不同的定义,所以EGL提供基本的不透明类型—EGLDisplay, 这 个类型封装了所有系统相关性,?于和原生窗?系统接?
GLKit 框架的设计目标是为了简化基于OpenGL / OpenGL ES 的应?用开发。它的出现加快OpenGL ES或OpenGL应?用程序开发。 使?数学库,背景纹理加载,预先创建的着色?效果,以及标准视图和视图控制器来实现渲染循环。
GLKit框架提供了功能和类,可以减少创建新的基于着??的应?程序所需的?作量,或者支持依赖早期版本的OpenGL ES或者OpenGL提供的固定函数顶点或者片段处理的现有应用程序。
GLKView:提供绘制场所(View)
GLKViewController:扩展于标准的UIKit设计模式,用于绘制视图内容的管理与呈现
注意:虽然苹果弃用了OpenGL ES,但是iOS开发者可以继续使用相关的API进行编程。
GLKit框架的API介绍
GLKit的功能
GLKit纹理加载
- 加载纹理
- 提供高性能的数学运算
- 提供常见的着色器
- 提供视图以及视图控制器
GLKTextureInfo创建OpenGL纹理信息GLKit中OpenGL ES 的视图渲染
GLKTextureLoader简化从各种资源文件中加载纹理
- name:OpenGL上下文中纹理名称
- target:纹理绑定的目标
- height:加载纹理的高度
- width:加载纹理的宽度
- textureOrigin:加载纹理中的原点位置
- alphaState:加载纹理中alpha分量状态
- containsMipmaps:布尔值,加载的纹理中是否包含mip贴图
- 初始化
-initWithSharegroup: 初始化?个新的纹理加载到对象中 -initWithShareContext: 初始化?个新的纹理加载对象
- 从文件中加载处理
+textureWithContentsOfFile:options:errer: 从文件加载2D纹理图像并从数据中创建新的纹理 -textureWithContentsOfFile:options:queue:completionHandler: 从?件中异步加载2D纹理图像,并根据数据创建新纹理
- 从URL加载纹理
-textureWithContentsOfURL:options:error: 从URL加载2D纹理图像并从数据创建新纹理 -textureWithContentsOfURL:options:queue:completionHandler: 从URL异步加载2D纹理图像,并根据数据创建新纹理
- 从内存中表示创建纹理
+textureWithContentsOfData:options:errer: 从内存空间加载2D纹理图像,并根据数据创建新纹理 -textureWithContentsOfData:options:queue:completionHandler:从内存空间异步加载2D纹理图像,并从数据中创建新纹理
- 从CGImages创建纹理
-textureWithCGImage:options:error: 从Quartz图像加载2D纹理图像并从数据创建新纹理 -textureWithCGImage:options:queue:completionHandler: 从Quartz图像异步加载2D纹理图像,并根据数据创建新纹理
- 从URL加载多维创建纹理
+cabeMapWithContentsOfURL:options:errer: 从单个URL加载??体贴图纹理图像,并根据数据创建新纹理 -cabeMapWithContentsOfURL:options:queue:completionHandler:从单个URL异步加载?方体贴图纹理图像,并根据数据创建新纹理
- 从?件加载多维数据创建纹理
+cubeMapWithContentsOfFile:options:errer: 从单个文件加载立方体贴图纹理对象,并从数据中创建新纹理 -cubeMapWithContentsOfFile:options:queue:completionHandler:从单个文件异步加载?方体贴图纹理对象,并从数据中创建新纹理 +cubeMapWithContentsOfFiles:options:errer:从?系列?件中加载立方体贴图纹理图像,并从数据总创建新纹理 -cubeMapWithContentsOfFiles:options:options:queue:completionHandler:从?系列?件异步加载立?体贴图纹理图像,并从数据中创建新纹理
GLKView使用OpenGL ES 绘制内容的视图默认实现--
- 初始化视图
- initWithFrame:context: 初始化新视图
- 代理
delegate 视图的代理
- 配置帧缓存区对象
drawableColorFormat 颜色渲染缓存区格式 drawableDepthFormat 深度渲染缓存区格式 drawableStencilFormat 模板渲染缓存区的格式 drawableMultisample 多重采样缓存区的格式
- 帧缓存区属性
drawableHeight 底层缓存区对象的?度(以像素为单位) drawableWidth 底层缓存区对象的宽度(以像素为单位)
- 绘制视图的内容
context 绘制视图内容时使?的OpenGL ES 上下? -bindDrawable 将底层FrameBuffer 对象绑定到OpenGL ES enableSetNeedsDisplay 布尔值,指定视图是否响应使得视图内容无效的消息 -display 立即重绘视图内容 snapshot 绘制视图内容并将其作为新图像对象返回
- 删除视图FrameBuffer对象
- deleteDrawable 删除与视图关联的可绘制对象
GLKViewDelegate 用于GLKView 对象回调方法
- 绘制视图的内容
- glkView:drawInRect: 绘制视图内容 (必须实现代理)
GLKViewController 管理理OpenGL ES 渲染循环的视图控制器
- 更新
- (void)update 更新视图内容 - (void)glkViewControllerUpdate:
- 配置帧速率
preferredFramesPerSecond 视图控制?调用视图以及更新视图内容的速率 framesPerSencond 视图控制器调用视图以及更新其内容的实际速率
- 配置GLKViewController 代理
delegate 视图控制?的代理
- 控制帧更更新
paused 布尔值,渲染循环是否已暂停 pausedOnWillResignActive 布尔值,当前程序重新激活动状态时视图控制器是否?动暂停渲染循环 resumeOnDidBecomeActive 布尔值,当前程序变为活动状态时视图控制是否?动恢复呈现循环
- 获取有关View更新信息
frameDisplayed 视图控制?自创建以来发送的帧更新数 timeSinceFirstResume ?视图控制器第?次恢复发送更新事件以来经过的时间量 timeSinceLastResume ?上次视图控制?恢复发送更新事件以来更新的时间量 timeSinceLastUpdate ?上次视图控制?调?委托?法以及经过的时间量 timeSinceLastDraw ?上次视图控制?调?视图display?法以来经过的时间量
GLKViewControllerDelegate 渲染循环回调?法
- 处理更新事件
- glkViewControllerUpdate: 在显示每个帧之前调?
- 暂停/恢复通知
- glkViewController:willPause: 在渲染循环暂停或恢复之前调?
【OpenGL|OpenGL ES之旅(二)-- OpenGL ES 了解GLKit框架】GLKBaseEffect 一种简单光照/着色系统,?于基于着?器OpenGL渲染
- 命名Effect
label 给Effect(效果)命名
- 配置模型视图转换
transform 绑定效果时应?于顶点数据的模型视图,投影和纹理理变换
- 配置光照效果
ightingType 用于计算每个?段的光照策略,GLKLightingType - GLKLightingTypePerVertex 表示在三?形中每个顶点执?光照计算,然后在三?形进行插值 - GLKLightingTypePerPixel 表示光照计算的输?在三?形内插入,并且在每个?段执?光照计算
- 配置光照
lightModelTwoSided 布尔值,表示为基元的两侧计算光照 material 计算渲染图元光照使?的材质属性 lightModelAmbientColor 环境颜色,应?效果渲染的所有图元 light0 场景中第?个光照属性 light1 场景中第?个光照属性 light2 场景中第三个光照属性
- 配置纹理
texture2d0 第?个纹理属性 texture2d1 第?个纹理属性 textureOrder 纹理应?于渲染图元的顺序
- 配置雾化
fog 应?于场景的雾属性
- 配置颜?信息
colorMaterialEnable 布尔值,表示计算光照与材质交互时是否使?颜?顶点属性 useConstantColor 布尔值,指示是否使用常量颜? constantColor 不提供每个顶点颜?数据时使?常量颜?
- 准备绘制效果
- prepareToDraw 准备渲染效果
总结:到这儿,GLKit中的常用API基本就是这些,后续还会继续补充进来。如有书写错误,注释错误,方法使用错误还请指出,非常感谢!
--
系列文章:
- OpenGL ES之旅(一)-- OpenGL ES 着色器渲染流程解析
- OpenGL ES之旅(二)-- OpenGL ES 了解GLKit框架
- OpenGL ES之旅(三)-- OpenGL ES 纹理翻转解决策略
- OpenGL ES之旅(四)-- OpenGL ES 光照计算
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 赢在人生六项精进二阶Day3复盘
- 2019年12月24日
- 陇上秋二|陇上秋二 罗敷媚
- 一百二十三夜,请嫁给我
- 迷失的世界(二十七)
- 感恩之旅第75天
- 我要我们在一起(二)
- 基于|基于 antd 风格的 element-table + pagination 的二次封装