美文网首页
OpenGL ES - GLKit

OpenGL ES - GLKit

作者: 卡布奇诺_95d2 | 来源:发表于2020-08-22 11:58 被阅读0次
  • GLKit框架的设计目的是为了简化基于OpenGL/OpenGL ES的应用开发。它的出现加快了OpenGL/OpenGL ES应用程序开发。使用数学库,背影纹理加载,预先创建着色器效果,以及标准视图和视图控制器来实现渲染循环。
  • GLKit框架提供了功能和类,可以减少创建新的基于着色器的应用程序所需的工作量,也可以支持依赖早期版本OpenGL/OpenGL ES提供的固定着色器顶点或片段处理的现有应用程序。

GLKit功能

  1. 加载纹理,允许加载各种纹理,且可以后台加载,通过GLKTextureLoader类来加载。
  2. 提供高性能的数学运算,提供常用的向量、矩阵等运算。
  3. 提供常见的着色器,包含以下3种:
  • GLKBaseEffect
  • GLKReflectionMapEffect
  • GLKSkyboxEffect
  1. 提供视图及视图控制器:GLKView和GLKViewController
  • GLKView:提供绘制场所,继承于UIView
  • GLKViewController:用于绘制视图内容的管理和呈现,继承于UIViewController

注意:虽然苹果弃用OpenGL ES,但 iOS 开发者可以继续使用。

使用GLKit呈现OpenGL ES内容。

下图来自Apple官方文档Drawing with OpenGL ES and GLKit

GLkit呈现图片过程
通过GLKit展现图片主要有三个步骤:
  1. GLKView的创建和配置
  2. 使用GLKView对象绘制图形,并存储到帧缓冲区
  3. 从缓冲区中读取数据,并显示到屏幕上

GLKit 常用API

GLKit纹理加载

  1. GLKTextureInfo类,表示创建OpenGL纹理信息
    GLKTextureInfo常用属性如下表:
属性 说明
name OpenGL上下文中纹理名称
target 纹理绑定的目标
height 加载的纹理高度
width 加载纹理的宽度
textureOrigin 加载纹理中的原点位置
alphaState 加载纹理中alpha分量状态
containsMipmaps 布尔值,加载的纹理是否包含mip贴图
  1. 使用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 绘制内容的视图默认实现

  1. 初始化视图
- (instancetype)initWithFrame:(CGRect)frame context:(EAGLContext *)context;
  1. 配置视图的代理
  2. 配置帧缓冲区对象
drawableColorFormat:颜色缓冲区格式
drawableDepthFormat:深度缓冲区格式
drawableStencilFormat:模板缓冲区格式
drawableMultisample:多重采样缓冲区格式
  1. 设置帧缓存区属性
drawableHeight:底层缓冲区对象的高度(以像素为单位)
drawableWidth:底层缓冲区对象的宽度(以像素为单位)
  1. 绘制视图内容
  • context:绘制视图内容时使用的OpenGL ES上下文。
  • - (void)bindDrawable;该函数是将底层FrameBuffer对象绑定到OpenGL ES。
  • enableSetNeedsDisplay:布尔值,指定视图是否响应使视图内容无效的消息
  • - (void)display;该函数是立即重绘视图内容。
  • snapshot UIImage类型,绘制视图内容并将其作为新图像对象返回
  1. 删除视图FrameBuffer对象
- (void)deleteDrawable;
  1. 实现GLKViewDelegate代理方法
//绘制视图内容
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;

注意:必须实现代理,否则无法绘制视图

GLKViewController

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

//暂停/恢复通知
- (void)glkViewController:(GLKViewController *)controller willPause:(BOOL)pause; 

GLKBaseEffect

GLKBaseEffect 是 GLKit 提供的一种简单光照/着色系统,用于基于着色器 OpenGL 渲染。

  1. 命名Effect
属性 说明
label 给Effect(效果)命名
  1. 配置模型视图转换
属性 说明
transform 绑定效果时应⽤于顶点数据的模型视图,投影和纹理变换
  1. 配置光照效果
属性 说明
lightingType 用于计算每个片段的光照策略,GLKLightingType枚举
属性 说明
GLKLightingType枚举 说明
GLKLightingTypePerVertex 表示在三角形中每个顶点执⾏光照计算,然后在三角形进⾏插值
GLKLightingTypePerPixel 表示光照计算的输⼊在三角形内插入,并且在每个片段执行光照计算

4.配置光照

属性 说明
lightModelTwoSided 布尔值,表示为基元的两侧计算光照
material 计算渲染图元光照使⽤的材质属性
lightModelAmbientColor 环境颜⾊,应⽤效果渲染的所有图元
light0 场景中第⼀个光照属性
light1 场景中第⼆个光照属性
light2 场景中第三个光照属性
  1. 配置纹理
属性 说明
texture2d0 第一个纹理属性
texture2d1 第⼆个纹理属性
textureOrder 纹理应用于渲染图元的顺序
  1. 配置雾化
属性 说明
fog 应⽤于场景的雾属性
  1. 配置颜色信息
属性 说明
colorMaterialEnable 布尔值,表示计算光照与材质交互时是否使⽤颜⾊顶点属性
useConstantColor 布尔值,指示是否使用常量颜⾊
constantColor 不提供每个顶点颜色数据时使⽤常量颜⾊
  1. 准备绘制效果
方法 说明
- prepareToDraw 准备渲染效果

注意:

  • GLKit中最多只有3个光照,2个纹理
  • 常量颜色:黑色

相关文章

网友评论

      本文标题:OpenGL ES - GLKit

      本文链接:https://www.haomeiwen.com/subject/ambujktx.html