1. GLKit是什么?

GLKit是苹果在iOS 5以后引入的一个为简化OpenGL ES使用的框架,它为OpenGL ES的使用提供了相关的类和函数,GLKit是Cocoa Touch以及多个其他的框架(包含UIKit)的一部分。而GLKViewGLKViewController类名字中的GLK前缀表明这些类是GLKit框架的一部分。

GLKViewController类是支持OpenGL ES特有的行为和动画时的UIViewController的内建子类。

GLKViewCocoa Touch UIView类的内建子类。GLKView简化了通过用Core Animation层来自动创建并管理帧缓存和渲染缓存共享内存所需要做的工作。GLKView相关的GLKViewController实例是视图的委托并接收当视图需要重绘时的消息。

2. OpenGL ES怎样为图形处理器提供数据?

程序会保存3D场景数据到硬件随机存储器在(RAM)中。嵌入式中央处理单元有专门为其分配的RAM

OpenGL ES是一种软件技术。OpenGL ES部分运行在CPU上,部分运行在GPU上。OPenGL ES横跨在两个处理器之间,协调两个内存区域之间的数据交换。

缓存,提供数据的最好方式。OpenGL ES为两个内存区域间的数据交换定义了缓存的概念。缓存的概念是指 GPU 图形处理器能够控制和管理的连续的 RAM。通过控制独立的缓存,GPU 就能尽可能以最有效的方式读写内存。图形处理器把它处理大量数据的能力异步同时地应用到缓存上,这意味着在 GPU 使用缓存中的数据工作的同时,运行在 CPU 上的程序可以继续执行。

几乎所有程序提供给 GPU 的数据都应该放入缓存中。缓存存储的到底是几何数据、颜色,灯光效果,还是其他的信息并不重要。为缓存提供数据有以下7个步骤:

  1. 1. glGenBuffers(); // 生成(Generate)-请求OpenGL ES为图形处理器控制的缓存生成一个人独一无二的额标识符。
  2. 2. glBindBuffer(); // 绑定(Bind)-告诉OPenGL ES为接下来的运算使用一个缓存。
  3. 3. glBufferData() 或者 glBufferSubData(); // 缓存数据(Buffer Data)-让OpenGL ES为当前绑定的缓存分配并初始化足够的连续内存(通常是从CPU控制的内存复制数据到分配的内存)。
  4. 4. glEnableVertexAttribArray() 或者 glDisableVertexAttribArray(); // 启用(Enable)或者禁止(Disable)-告诉OpenGL ES在接下来的渲染中是否使用缓存中的数据。
  5. 5. glVertexAttribPointer(); // 设置指针(Set Pointers)-告诉OpenGL ES在缓存中的数据的类型和所有需要访问的数据的内存偏移值。
  6. 6. glDrawArrays() 或者 glDrawElements(); // 绘图(Draw)-告诉OpenGL ES使用当前绑定并启用的缓存中的数据渲染整个场景或者某个场景中的一部分。
  7. 7. glDeleteBuffers(); // 删除(Delete)-告诉OpenGL ES删除以前生成的缓存并释放相关的资源。

3. GLKit的功能

  • 加载纹理
  • 提供高性能的数学运算
  • 提供常见的着色器
  • 提供视图以及视图控制器

4. GLKit纹理加载

4.1 GLKTextureInfo创建OpenGL纹理信息

  1. name // OpenGL 上下⽂文中纹理理名称
  2. target // 纹理理绑定的⽬目标
  3. height // 加载的纹理理⾼高度
  4. width // 加载纹理理的宽度
  5. textureOrigin // 加载纹理理中的原点位置
  6. alphaState // 加载纹理理中 alpha 分量量状态
  7. containsMipmaps: // 布尔值,加载的纹理理是否包含mip贴图

4.2 GLTextureLoader 简化从各种资源文件中加载纹理

  • 初始化
  1. - initWithSharegroup: // 初始化⼀个新的纹理加载到对象中
  2. - initWithShareContext: // 初始化⼀个新的纹理加载对象
  • 从文件中加载处理
  1. + textureWithContentsOfFile:options:errer: // 从⽂件加载2D纹理图像并从数据中创建新的纹理
  2. - textureWithContentsOfFile:options:queue:completionHandler: // 从文件中异步
  3. 加载2D纹理图像,并根据数据创建新纹理

4.3 GLTextureLoader 简化从各种资源⽂件中加载纹理

  • URL 加载纹理
  1. - textureWithContentsOfURL:options:error: // 从URL加载2D纹理图像并从数据创建新纹理
  2. - textureWithContentsOfURL:options:queue:completionHandler: // 从URL异步加载2D纹理图像,并根据数据创建新纹理
  • 从内存中表示创建纹理
  1. + textureWithContentsOfData:options:errer: // 从内存空间加载2D纹理图像,并根据数据创建新纹理
  2. - textureWithContentsOfData:options:queue:completionHandler: // 从内存空间异步加载2D纹理图像,并从数据中创建新纹理
  • CGImages 创建纹理
  1. - textureWithCGImage:options:error: // 从Quartz图像 加载2D纹理图像并从数据创建新纹理
  2. - textureWithCGImage:options:queue:completionHandler: // 从Quartz图像异步加载2D纹理图像,并根据数据创建新纹理
  • URL 加载多维创建纹理
  1. + cabeMapWithContentsOfURL:options:errer: // 从单个URL加载⽴方体贴图纹理图像,并根据数据创建新纹理
  2. - cabeMapWithContentsOfURL:options:queue:completionHandler: // 从单个URL异步加载⽴方体贴图纹理图像,并根据数据创建新纹理
  • 从文件加载多维数据创建纹理
  1. + cubeMapWithContentsOfFile:options:errer: // 从单个文件加载⽴方体贴图纹理对象,并从数据中创建新纹理
  2. - cubeMapWithContentsOfFile:options:queue:completionHandler: // 从单个文件异步加载⽴方体贴图纹理对象,并从数据中创建新纹理
  3. + cubeMapWithContentsOfFiles:options:errer: // 从⼀系列文件中加载⽴方体贴图纹理图像,并从数据总创建新纹理
  4. - cubeMapWithContentsOfFiles:options:options:queue:completionHandler: // 从⼀系列⽂件异步加载⽴方体贴图纹理图像,并从数据中创建新纹理

4.4 GLKView 使用OpenGL ES 绘制内容的视图默认实现

  • 初始化视图
  1. - initWithFrame:context: // 初始化新视图
  • 代理
  1. delegate // 视图的代理
  • 配置帧缓存区对象
  1. drawableColorFormat // 颜⾊色渲染缓存区格式
  2. drawableDepthFormat // 深度渲染缓存区格式
  3. drawableStencilFormat // 模板渲染缓存区的格式
  4. drawableMultisample // 多重采样缓存区的格式
  • 帧缓存区属性
  1. drawableHeight // 底层缓存区对象的高度(以像素为单位)
  2. drawableWidth // 底层缓存区对象的宽度(以像素为单位)
  • 绘制视图的内容
  1. context // 绘制视图内容时使用的OpenGL ES 上下⽂
  2. - bindDrawable // 将底层FrameBuffer 对象绑定到OpenGL ES
  3. enableSetNeedsDisplay // 布尔值,指定视图是否响应使得视图内容无效的消息
  4. - display // ⽴即重绘视图内容
  5. snapshot // 绘制视图内容并将其作为新图像对象返回
  • 删除视图FrameBuffer对象
  1. - deleteDrawable // 删除与视图关联的可绘制对象

4.5 GLKViewDelegate ⽤于 GLKView 对象回调⽅法

  • 绘制视图的内容
  1. - glkView:drawInRect: // 绘制视图内容 (必须实现代理)

4.6 GLKViewController 管理 OpenGL ES 渲染循环的视图控制器

  • 更新
  1. - (void) update // 更新视图内容
  2. - (void) glkViewControllerUpdate:
  • 配置帧速率
  1. preferredFramesPerSecond // 视图控制器调用视图以及更新视图内容的速率
  2. framesPerSencond // 视图控制器调⽤视图以及更新其内容的实际速率
  • 配置 GLKViewController 代理
  1. delegate // 视图控制器的代理
  • 控制帧更新
  1. paused // 布尔值,渲染循环是否已暂停
  2. pausedOnWillResignActive // 布尔值,当前程序重新激活动状态时视图控制器是否⾃动暂停渲染循环
  3. resumeOnDidBecomeActive // 布尔值,当前程序变为活动状态时视图控制是否自动恢复呈现循环
  • 获取有关 View 更新信息
  1. frameDisplayed // 视图控制器自创建以来发送的帧更新数
  2. timeSinceFirstResume // ⾃视图控制器第一次恢复发送更新事件以来经过的时间量
  3. timeSinceLastResume // 自上次视图控制器恢复发送更新事件以来更更新的时间量
  4. timeSinceLastUpdate // ⾃上次视图控制器调用委托方法以及经过的时间量
  5. glkViewControllerUpdate:
  6. timeSinceLastDraw // ⾃上次视图控制器调用视图display方法以来经过的时间量

4.7 GLKViewControllerDelegate 渲染循环回调⽅法

  • 处理更新事件
  1. - glkViewControllerUpdate: // 在显示每个帧之前调⽤
  • 暂停/恢复通知
  1. - glkViewController:willPause: // 在渲染循环暂停或恢复之前调⽤

4.8 GLKBaseEffect 一种简单光照/着色系统,⽤于基于着色器 OpenGL 渲染

  • 命名 Effect
  1. label // 给Effect(效果)命名
  • 配置模型视图转换
  1. transform // 绑定效果时应⽤于顶点数据的模型视图,投影和纹理变换
  • 配置光照效果
  1. lightingType // ⽤于计算每个片段的光照策略,GLKLightingType
  2. GLKLightingType:
  3. 1. GLKLightingTypePerVertex // 表示在三角形中每个顶点执行光照计算,然后在三角形进⾏插值
  4. 2. GLKLightingTypePerPixel // 表示光照计算的输入在三角形内插入,并且在每个片段执⾏光照计算
  • 配置光照
  1. lightModelTwoSided // 布尔值,表示为基元的两侧计算光照
  2. material // 计算渲染图元光照使用的材质属性
  3. lightModelAmbientColor // 环境颜色,应⽤效果渲染的所有图元.
  4. light0 // 场景中第⼀个光照属性
  5. light1 // 场景中第二个光照属性
  6. light2 // 场景中第三个光照属性
  • 配置纹理
  1. texture2d0 // 第一个纹理属性
  2. texture2d1 // 第⼆个纹理属性
  3. textureOrder // 纹理应用于渲染图元的顺序
  • 配置雾化
  1. fog // 应⽤于场景的雾属性
  • 配置颜色信息
  1. colorMaterialEnable // 布尔值,表示计算光照与材质交互时是否使用颜⾊顶点属性
  2. useConstantColor // 布尔值,指示是否使⽤用常量颜色
  3. constantColor // 不提供每个顶点颜⾊数据时使⽤常量颜⾊
  • 准备绘制效果
  1. - prepareToDraw // 准备渲染效果