- GLKit框架的设计目的是为了简化基于OpenGL/OpenGL ES的应用开发。它的出现加快了OpenGL/OpenGL ES应用程序开发。使用数学库,背影纹理加载,预先创建着色器效果,以及标准视图和视图控制器来实现渲染循环。
- GLKit框架提供了功能和类,可以减少创建新的基于着色器的应用程序所需的工作量,也可以支持依赖早期版本OpenGL/OpenGL ES提供的固定着色器顶点或片段处理的现有应用程序。
GLKit功能
- 加载纹理,允许加载各种纹理,且可以后台加载,通过GLKTextureLoader类来加载。
- 提供高性能的数学运算,提供常用的向量、矩阵等运算。
- 提供常见的着色器,包含以下3种:
- GLKBaseEffect
- GLKReflectionMapEffect
- GLKSkyboxEffect
- 提供视图及视图控制器:GLKView和GLKViewController
- GLKView:提供绘制场所,继承于UIView
- GLKViewController:用于绘制视图内容的管理和呈现,继承于UIViewController
注意:虽然苹果弃用OpenGL ES,但 iOS 开发者可以继续使用。
使用GLKit呈现OpenGL ES内容。
下图来自Apple官方文档Drawing with OpenGL ES and GLKit
通过GLKit展现图片主要有三个步骤:
- GLKView的创建和配置
- 使用GLKView对象绘制图形,并存储到帧缓冲区
- 从缓冲区中读取数据,并显示到屏幕上
GLKit 常用API
GLKit纹理加载
- GLKTextureInfo类,表示创建OpenGL纹理信息
GLKTextureInfo常用属性如下表:
属性 | 说明 |
---|---|
name | OpenGL上下文中纹理名称 |
target | 纹理绑定的目标 |
height | 加载的纹理高度 |
width | 加载纹理的宽度 |
textureOrigin | 加载纹理中的原点位置 |
alphaState | 加载纹理中alpha分量状态 |
containsMipmaps | 布尔值,加载的纹理是否包含mip贴图 |
- 使用GLKTextureLoader函数从资源文件加载纹理信息,返回GLKTextureInfo对象
2.1 初始化方法加载纹理
//初始化⼀个新的纹理加载到对象中
- (instancetype)initWithSharegroup:(EAGLSharegroup *)sharegroup;
- (instancetype)initWithShareContext:(NSOpenGLContext *)context;
2.2 从文件中加载纹理
//从⽂件加载2D纹理图像并从数据中创建新的纹理
+ (nullable GLKTextureInfo *)textureWithContentsOfFile:(NSString *)path options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从⽂件中异步加载2D纹理图像,并根据数据创建新纹理
- (void)textureWithContentsOfFile:(NSString *)path options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;
2.3 从URL加载处理
//从URL加载2D纹理图像并从数据创建新纹理
+ (nullable GLKTextureInfo *)textureWithContentsOfURL:(NSURL *)url options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从URL异步加载2D纹理图像,并根据数据创建新纹理
- (void)textureWithContentsOfURL:(NSURL *)url options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;
2.4 从内存中表示创建纹理
//从内存空间加载2D纹理图像,并根据数据创建新纹理
+ (nullable GLKTextureInfo *)textureWithContentsOfData:(NSData *)data options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从内存空间异步加载2D纹理图像,并从数据中创建新纹理
- (void)textureWithContentsOfData:(NSData *)data options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;
2.5 从CGImages创建纹理
//从Quartz图像 加载2D纹理图像并从数据创建新纹理
+ (nullable GLKTextureInfo *)textureWithCGImage:(CGImageRef)cgImage options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从Quartz图像异步加载2D纹理图像,并根据数据创建新纹理
- (void)textureWithCGImage:(CGImageRef)cgImage options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;
2.6 从URL加载多维创建纹理
//从单个URL加载⽴立⽅方体贴图纹理图像,并根据数据创建新纹理
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfURL:(NSURL *)url options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从单个URL异步加载⽴方体贴图纹理图像,并根据数据创建新纹理
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfURL:(NSURL *)url options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
2.7 从文件加载多维数据创建纹理
//从单个文件加载⽴方体贴图纹理对象,并从数据中创建新纹理
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfFile:(NSString *)path options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从单个⽂件异步加载⽴方体贴图纹理对象,并从数据中创建新纹理
- (void)cubeMapWithContentsOfFile:(NSString *)path options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;
//从⼀系列文件中加载⽴方体贴图纹理图像,并从数据中创建新纹理
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfFiles:(NSArray<id> *)paths options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从⼀系列⽂件异步加载⽴方体贴图纹理图像,并从数据中创建新纹理
- (void)cubeMapWithContentsOfFiles:(NSArray<id> *)paths options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;
GLKView 使⽤OpenGL ES 绘制内容的视图默认实现
- 初始化视图
- (instancetype)initWithFrame:(CGRect)frame context:(EAGLContext *)context;
- 配置视图的代理
- 配置帧缓冲区对象
drawableColorFormat:颜色缓冲区格式
drawableDepthFormat:深度缓冲区格式
drawableStencilFormat:模板缓冲区格式
drawableMultisample:多重采样缓冲区格式
- 设置帧缓存区属性
drawableHeight:底层缓冲区对象的高度(以像素为单位)
drawableWidth:底层缓冲区对象的宽度(以像素为单位)
- 绘制视图内容
-
context
:绘制视图内容时使用的OpenGL ES上下文。 -
- (void)bindDrawable;
该函数是将底层FrameBuffer对象绑定到OpenGL ES。 -
enableSetNeedsDisplay
:布尔值,指定视图是否响应使视图内容无效的消息 -
- (void)display;
该函数是立即重绘视图内容。 -
snapshot
UIImage类型,绘制视图内容并将其作为新图像对象返回
- 删除视图FrameBuffer对象
- (void)deleteDrawable;
- 实现GLKViewDelegate代理方法
//绘制视图内容
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;
注意:必须实现代理,否则无法绘制视图
GLKViewController
- 配置帧速率
- preferredFramesPerSecond:视图控制器调用视图以及更新视图内容的速率,默认为30
- framesPerSecond:视图控制器调用视图以及更新视图内容的实际速率
- 配置 GLKViewController 代理
- 控制帧更新:
-
paused
:布尔值,渲染循环是否已暂停 -
pauseOnWillResignActive
:布尔值,当前程序重新激活活动状态时视图控制器是否自动暂停渲染循环。 -
resumeOnDidBecomeActive
:布尔值,当前程序变为活动状态时视图控制是否自动恢复呈现循环。
- 获取有关 View 的更新信息
-
framesPerSecond
:视图控制器自创建以来发送的帧更新数。 -
timeSinceFirstResume
:视图控制器第一次恢复发送更新事件以来经过的时间量。 -
timeSinceLastResume
:自上次视图控制器恢复发送更新事件以来更新的时间量。 -
timeSinceLastUpdate
:自上次视图控制器调用委托方法以及经过的时间量。 -
timeSinceLastDraw
:自上次视图控制器调用视图 display 方法以来经过的时间量。
- 实现代理方法:
//处理更新事件
- (void)glkViewControllerUpdate:(GLKViewController *)controller;
//暂停/恢复通知
- (void)glkViewController:(GLKViewController *)controller willPause:(BOOL)pause;
GLKBaseEffect
GLKBaseEffect 是 GLKit 提供的一种简单光照/着色系统,用于基于着色器 OpenGL 渲染。
- 命名Effect
属性 | 说明 |
---|---|
label | 给Effect(效果)命名 |
- 配置模型视图转换
属性 | 说明 |
---|---|
transform | 绑定效果时应⽤于顶点数据的模型视图,投影和纹理变换 |
- 配置光照效果
属性 | 说明 |
---|---|
lightingType | 用于计算每个片段的光照策略,GLKLightingType枚举 |
属性 | 说明 |
---|---|
GLKLightingType枚举 | 说明 |
GLKLightingTypePerVertex | 表示在三角形中每个顶点执⾏光照计算,然后在三角形进⾏插值 |
GLKLightingTypePerPixel | 表示光照计算的输⼊在三角形内插入,并且在每个片段执行光照计算 |
4.配置光照
属性 | 说明 |
---|---|
lightModelTwoSided | 布尔值,表示为基元的两侧计算光照 |
material | 计算渲染图元光照使⽤的材质属性 |
lightModelAmbientColor | 环境颜⾊,应⽤效果渲染的所有图元 |
light0 | 场景中第⼀个光照属性 |
light1 | 场景中第⼆个光照属性 |
light2 | 场景中第三个光照属性 |
- 配置纹理
属性 | 说明 |
---|---|
texture2d0 | 第一个纹理属性 |
texture2d1 | 第⼆个纹理属性 |
textureOrder | 纹理应用于渲染图元的顺序 |
- 配置雾化
属性 | 说明 |
---|---|
fog | 应⽤于场景的雾属性 |
- 配置颜色信息
属性 | 说明 |
---|---|
colorMaterialEnable | 布尔值,表示计算光照与材质交互时是否使⽤颜⾊顶点属性 |
useConstantColor | 布尔值,指示是否使用常量颜⾊ |
constantColor | 不提供每个顶点颜色数据时使⽤常量颜⾊ |
- 准备绘制效果
方法 | 说明 |
---|---|
- prepareToDraw | 准备渲染效果 |
注意:
- GLKit中最多只有3个光照,2个纹理
- 常量颜色:黑色
网友评论