1、GLKit框架简介
GLKit 框架的设计⽬标是为了简化基于 OpenGL / OpenGL ES 的应用开发。它的出现加快 OpenGL ES 或 OpenGL 应⽤程序开发。使⽤数学库,背景纹理加载,预先创建的着色器效果,以及标准视图和视图控制器来实现渲染循环。
主要功能:
1、加载纹理
2、提供高性能的数学运算
3、提供常⻅的着⾊器
4、提供视图以及视图控制器
2、用 GLKit 进行视图渲染
2.1 GLKView
GLKView 继承 UIView,提供绘制场所(View)。
下面看一下 GLKView 使用 OpenGL ES 绘制内容的视图默认实现:
- 1、初始化视图
-(instancetype)initWithFrame:(CGRect)frame context:(EAGLContext *)context;初始化新视图。 - 2、设置视图的代理
- 3、配置帧缓冲区对象
drawableColorFormat颜色缓冲区 的格式
drawableDepthFormat深度缓冲区 的格式
drawableStencilFormat模板缓冲区 的格式
drawableMultisample多重采样缓冲区 的格式 - 4、设置帧缓冲区属性
drawableHeight底层缓存区对象的高度(以像素为单位)
drawableWidth底层缓存区对象的宽度(以像素为单位) - 5、绘制视图的内容
context 存储绘制视图内容时使用的 OpenGL ES 上下文状态。 - (void)bindDrawable; 将底层 FrameBuffer 对象绑定到 OpenGL ES
enableSetNeedsDisplay 布尔值,指定视图是否响应使得视图内容无效的消息。 - (void)display; 立即重绘视图内容。
snapshot UIImage 类型,绘制视图内容并将其作为新图像对象返回。 - 6、删除视图 FrameBuffer 对象
- (void)deleteDrawable; 删除与视图关联的可绘制对象。
- 7、实现 GLKViewDelegate 代理方法
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect;
绘制视图内容(必须实现代理)
2.2 GLKViewController
GLKViewController 继承 UIViewController,(扩展于标准的 UIKit 设计模式,用于绘制视图内容的管理与呈现)
- 1、配置帧速率
preferredFramesPerSecond 视图控制器调用视图以及更新视图内容的速率,默认为30。
framesPerSecond 视图控制器调用视图以及更新视图内容的实际速率。 - 2、配置 GLKViewController 代理
- 3、控制帧更新:
paused 布尔值,渲染循环是否已暂停。
pauseOnWillResignActive 布尔值,当前程序重新激活活动状态时视图控制器是否自动暂停渲染循环。
resumeOnDidBecomeActive 布尔值,当前程序变为活动状态时视图控制是否自动恢复呈现循环。 - 4、获取有关 View 的更新信息:
framesPerSecond 视图控制器自创建以来发送的帧更新数。
timeSinceFirstResume 视图控制器第一次恢复发送更新事件以来经过的时间量。
timeSinceLastResume 自上次视图控制器恢复发送更新事件以来更新的时间量。
timeSinceLastUpdate 自上次视图控制器调用委托方法以及经过的时间量。
timeSinceLastDraw 自上次视图控制器调用视图 display 方法以来经过的时间量。 - 5、实现代理方法:
-(void)glkViewControllerUpdate:(GLKViewController *)controller; 处理更新事件 - (void)glkViewController:(GLKViewController *)controller willPause:(BOOL)pause; 暂停/恢复通知
2.3 GLKBaseEffect
GLKBaseEffect 是 GLKit 提供的一种简单的光照/着色系统,用于基于着色器 OpenGL 渲染。
- 1、命名 Effect:
label 给 Effect(效果)命名。 - 2、配置模型视图转换:
transform 绑定效果时应用于顶点数据的模型视图,投影和纹理变换。 - 3、配置光照效果:
lightingType 用于计算每个片段的光照策略,GLKLightingType。
typedef NS_ENUM(GLint, GLKLightingType)
{
GLKLightingTypePerVertex,
GLKLightingTypePerPixel
} NS_ENUM_AVAILABLE(10_8, 5_0);
GLKLightingTypePerVertex 表示在三⻆形中每个顶点执行光照计算,然后在三⻆形进⾏插值。
GLKLightingTypePerPixel 表示光照计算的输入在三角形内插入,并且在每个⽚段执行光照计算。
- 4、配置光照:
lightModelTwoSided 布尔值,表示为基元的两侧计算光照。
material 计算渲染图元光照使⽤的材质属性。
lightModelAmbientColor 环境颜⾊,应⽤效果渲染的所有图元。
light0,light1,light2 分别为场景中第 1、2、3 个光照属性。
注意: GLKit 最多就支持3个光照。 - 5、配置纹理:
texture2d0 是 readonly 的,第一个纹理属性。
texture2d1 是 readonly 的,第二个纹理属性。
textureOrder 纹理应⽤于渲染图元的顺序。
注意:最多就支持俩纹理,三个光照,所以 GLKit 有局限性,如果要支持多个纹理,就不能用 GLKit 了,得自己写了。 - 6、配置雾化:
fog 应用于场景的雾属性。 - 7、配置颜色信息:
colorMaterialEnabled 布尔值,表示计算光照与材质交互时是否使用颜色顶点属性。
useConstantColor 布尔值,指示是否使用常量颜⾊。
constantColor 不提供每个顶点颜色数据时使⽤的常量颜⾊。 - 8、准备绘制效果:
-(void) prepareToDraw; 准备渲染效果(绘制时同步所有效果更改以保持一致状态)。注意:绘制之前必须写。
思维导图:
image.png
网友评论