美文网首页
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