GLKIT框架简述
GLKit 框架的设计⽬标是为了简化基于OpenGL / OpenGL ES 的应⽤开发。它的出现加快OpenGL ES或OpenGL应⽤用程序开发。使⽤用数学库,背景纹理理加载,预先创建的着⾊色器器效果,以及标准视图和视图控制器器来实现渲染循环。
GLKit框架提供了功能和类,可以减少创建新的基于着色器的应用程序所需的工作量,或者支持依赖早期版本的OpenGL ES或OpenGL提供的固定函数顶点或片段处理的现有应用程序。
主要有GLKView 视图 和 GLKViewController视图控制器
GLKit的功能有加载纹理,提供⾼性能的数学运算,提供常见着色器,提供视图和视图着色器。由于苹果弃用OpenGL ES , 改用Metal。但iOS开发者可以继续使用。但是由于GLKIT的局限性,无法处理很多自定义的东西,可能无法应用所有场景。
GLKit 纹理理加载
通过GLKTextureInfo 创建OpenGL 纹理理信息.
name : OpenGL 上下⽂文中纹理理名称
target : 纹理理绑定的⽬目标
height : 加载的纹理理⾼高度
width : 加载纹理理的宽度
textureOrigin : 加载纹理理中的原点位置
alphaState: 加载纹理理中alpha分量量状态
containsMipmaps: 布尔值,加载的纹理理是否包含mip贴图
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"**" ofType:@"png"];
NSDictionary *options = @{GLKTextureLoaderOriginBottomLeft:@(1)};
GLKTextureInfo* textureInfo = [GLKTextureLoadertextureWithContentsOfFile:filePathoptions:optionserror:nil];
从⽂文件中加载处理理
+ textureWithContentsOfFile:options:errer: 从⽂文件加载2D纹理图像并从数据中创建新的纹理
- textureWithContentsOfFile:options:queue:completionHandler: 从⽂文件中异步加载2D纹理图像,并根据数据创建新纹理
从URL加载纹理理
- textureWithContentsOfURL:options:error: 从URL 加载2D纹理图像并从数据创建新纹理
- textureWithContentsOfURL:options:queue:completionHandler: 从URL异步加载2D纹理图像,并根据数据创建新纹理.
从内存中表示创建纹理理
+ textureWithContentsOfData:options:errer: 从内存空间加载2D纹理图像,并根据数据创建新纹理
- textureWithContentsOfData:options:queue:completionHandler:从内存空间异步加载2D纹理图像,并从数据中创建新纹理
GLKit 视图渲染
GLKView 常用API
初始化视图
- initWithFrame:context: 初始化新视图
delegate 视图的代理
配置帧缓存区对象
drawableColorFormat 颜⾊色渲染缓存区格式
drawableDepthFormat 深度渲染缓存区格式
drawableStencilFormat 模板渲染缓存区的格式
drawableMultisample 多重采样缓存区的格式
帧缓存区属性
drawableHeight 底层缓存区对象的⾼高度(以像素为单位)
drawableWidth 底层缓存区对象的宽度(以像素为单位)
绘制视图的内容
context 绘制视图内容时使⽤用的OpenGL ES 上下⽂文-
bindDrawable 将底层FrameBuffer 对象绑定到OpenGL ES
enableSetNeedsDisplay 布尔值,指定视图是否响应使得视图内容⽆无效的消息
display ⽴立即重绘视图内容
snapshot 绘制视图内容并将其作为新图像对象返回
删除视图FrameBuffer对象
deleteDrawable 删除与视图关联的可绘制对象
绘制视图的内容
- (void)glkView:(GLKView*)viewdrawInRect:(CGRect)rect (必须实现代理理)
GLKViewController 常用API
GLKViewController 是管理理OpenGL ES 渲染循环的视图控制器器
- (void) update 更更新视图内容
- (void) glkViewControllerUpdate 配置帧速率
preferredFramesPerSecond 视图控制器调用视图以及更新视图内容的速率
framesPerSencond 视图控制器调用视图以及更新其内容的实际速率
GLKBaseEffect 常用API
GLKBaseEffect是一种简单光照/着⾊系统,⽤于基于着⾊器OpenGL 渲染
命名Effect
label 给Effect(效果)命名
配置模型视图转换
transform 绑定效果时应用于顶点数据的模型视图,投影和纹理变换
配置光照效果
lightingType ⽤用于计算每个⽚段的光照策略,GLKLightingType
GLKLightingType
GLKLightingTypePerVertex 表示在三⻆形中每个顶点执行光照计算,然后在三⻆形进⾏插值
GLKLightingTypePerPixel 表示光照计算的输入在三角形内插入,并且在每个片段执行光照计算
配置光照
lightModelTwoSided 布尔值,表示为基元的两侧计算光照
material 计算渲染图元光照使⽤用的材质属性
lightModelAmbientColor 环境颜⾊色,应⽤用效果渲染的所有图元.
light0 场景中第⼀一个光照属性 light1 场景中第二个光照属性 light2 场景中第三个光照属性
配置纹理理
texture2d0 第⼀一个纹理理属性 texture2d1 第⼆个纹理理属性
textureOrder 纹理理应⽤用于渲染图元的顺序
配置雾化
fog 应⽤用于场景的雾属性
配置颜⾊色信息
colorMaterialEnable 布尔值,表示计算光照与材质交互时是否使用颜色顶点属性
useConstantColor 布尔值,指示是否使用常量颜色
constantColor 不不提供每个顶点颜⾊数据时使⽤常量颜色
GLKBaseEffect在初始化完成后,要在- (void)glkView:(GLKView*)viewdrawInRect:(CGRect)rect进行准备绘制工作
- (void)glkView:(GLKView*)viewdrawInRect:(CGRect)rect{
//1.
glClear(GL_COLOR_BUFFER_BIT);
//2.准备绘制
[cEffect prepareToDraw];
//3.开始绘制
glDrawArrays(GL_TRIANGLES, 0, 6);
}
注意在加载顶点坐标或者绘制纹理时
(1)在iOS中, 默认情况下,出于性能考虑,所有顶点着色器的属性(Attribute)变量都是关闭的.
意味着,顶点数据在着色器端(服务端)是不可用的. 即使你已经使用glBufferData方法,将顶点数据从内存拷贝到顶点缓存区中(GPU显存中).
所以, 必须由glEnableVertexAttribArray 方法打开通道.指定访问属性.才能让顶点着色器能够访问到从CPU复制到GPU的数据.
注意: 数据在GPU端是否可见,即,着色器能否读取到数据,由是否启用了对应的属性决定,这就是glEnableVertexAttribArray的功能,允许顶点着色器读取GPU(服务器端)数据。
如glEnableVertexAttribArray(GLKVertexAttribPosition);
typedef NS_ENUM(GLint, GLKVertexAttrib)
{
GLKVertexAttribPosition, //顶点坐标
GLKVertexAttribNormal,//法线坐标
GLKVertexAttribColor,//颜色
GLKVertexAttribTexCoord0,//纹理1
GLKVertexAttribTexCoord1//纹理2
} NS_ENUM_AVAILABLE(10_8, 5_0);
由此可见GLKIT只能够提供2个纹理数据来提取,多余两个纹理图就只能自己写OpenGL ES来完成。